From f0e004ffa27e2d0e8b6cde4a1e669c75910c440a Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sat, 8 Aug 2020 15:21:12 -0500 Subject: [PATCH 01/29] build(docs): Remove settings leftover from sphinx-releases --- doc/conf.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 6009d01e5..5169e3ec4 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -32,11 +32,6 @@ 'sphinx_issues', ] -releases_unstable_prehistory = True -releases_document_name = ["history"] -releases_issue_uri = "https://github.com/tmux-python/libtmux/issues/%s" -releases_release_uri = "https://github.com/tmux-python/libtmux/tree/v%s" - issues_github_path = about['__github__'].replace('https://github.com/', '') templates_path = ['_templates'] From 3ca54a03f3b144b77a3ab654cf29450fc454b8d9 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:20:56 -0500 Subject: [PATCH 02/29] build(alagitpull): Update to 0.1.0 --- poetry.lock | 41 ++++++++++++++++------------------------- pyproject.toml | 2 +- requirements/doc.txt | 2 +- 3 files changed, 18 insertions(+), 27 deletions(-) diff --git a/poetry.lock b/poetry.lock index c7f7d35b6..dcf33df7b 100644 --- a/poetry.lock +++ b/poetry.lock @@ -11,8 +11,8 @@ category = "dev" description = "Cleverly-named alabaster sub-theme for git-pull projects" name = "alagitpull" optional = false -python-versions = "*" -version = "0.0.23" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.1.0" [package.dependencies] alabaster = "<0.8" @@ -29,7 +29,7 @@ version = "1.4.4" [[package]] category = "dev" description = "Atomic file writes." -marker = "python_version < \"3\" or python_version >= \"3\" and sys_platform == \"win32\"" +marker = "python_version < \"3\" 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.*" @@ -38,7 +38,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.*" @@ -53,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.*" @@ -149,7 +147,7 @@ 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\"" +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.*" @@ -171,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\"" +marker = "python_version < \"3\" 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.*" @@ -292,7 +290,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.*" @@ -352,7 +349,6 @@ xdg_home = ["appdirs (>=1.4.0)"] [[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.*" @@ -396,7 +392,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" @@ -433,7 +428,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 = "*" @@ -473,7 +468,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.*" @@ -490,7 +484,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.*" @@ -531,7 +524,6 @@ version = "2.6.1" [[package]] category = "dev" description = "Python parsing module" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "pyparsing" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -758,7 +750,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 = "*" @@ -846,7 +837,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" @@ -859,7 +849,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" @@ -872,7 +861,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" @@ -885,7 +873,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" @@ -897,7 +884,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" @@ -910,7 +896,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" @@ -1018,7 +1003,6 @@ socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] category = "dev" description = "Measures the displayed width of unicode strings in a terminal" -marker = "python_version < \"3\" or python_version >= \"3\"" name = "wcwidth" optional = false python-versions = "*" @@ -1040,7 +1024,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.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\")" name = "zipp" optional = false python-versions = ">=2.7" @@ -1056,7 +1040,8 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "426a93d5f99cf618045c2838d4c9e8f3fa36bbffc315ae32dec2ca2be737a7ef" +content-hash = "59736a627f8576a55609f5d957610e196c01ee7d384df4d80faf911a88202e99" +lock-version = "1.0" python-versions = "~2.7 || ^3.5" [metadata.files] @@ -1065,7 +1050,8 @@ alabaster = [ {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, ] alagitpull = [ - {file = "alagitpull-0.0.23.tar.gz", hash = "sha256:a56c1672f17eb3bb55c63f93fc71e7914e0a7fa0707ceefbf8d5e422bf4a9f8a"}, + {file = "alagitpull-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b9ed87ee410c6fa40a63a91d2f25919a10e20c6d39e080356b067f3ff6f379b"}, + {file = "alagitpull-0.1.0.tar.gz", hash = "sha256:f6076f81a738c3291b598d8016b248edf5adf25d1d348c2599eff92c1eedaed9"}, ] appdirs = [ {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, @@ -1234,6 +1220,11 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, + {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] mccabe = [ diff --git a/pyproject.toml b/pyproject.toml index e09f49d9c..66a5a8f6b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,7 +12,7 @@ authors = ["Tony Narlock "] python = "~2.7 || ^3.5" [tool.poetry.dev-dependencies] -alagitpull = "*" +alagitpull = "~=0.1.0" black = {version="==19.10b0", python="^3.6"} doc8 = "*" docutils = "*" diff --git a/requirements/doc.txt b/requirements/doc.txt index daa779154..8d3b35521 100644 --- a/requirements/doc.txt +++ b/requirements/doc.txt @@ -1,4 +1,4 @@ docutils==0.14 sphinx>=2.0.0 sphinx_issues==1.2.0 -alagitpull>=0.0.22 +alagitpull>=0.1.0 From 5636756dd9d22145b5cc47b7ef862b5c09af78db Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:24:57 -0500 Subject: [PATCH 03/29] build(pyproject): Add extras packages, organize, lock --- poetry.lock | 599 ++++++++++++++++++++++++++++++++++++++----------- pyproject.toml | 45 +++- 2 files changed, 500 insertions(+), 144 deletions(-) diff --git a/poetry.lock b/poetry.lock index dcf33df7b..448478a1e 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\" 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,6 +38,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\"" 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.*" @@ -115,6 +117,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" @@ -138,7 +152,7 @@ description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" name = "codecov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.1.7" +version = "2.1.8" [package.dependencies] coverage = "*" @@ -147,12 +161,27 @@ 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.*" 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+." @@ -169,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\" 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.*" @@ -181,26 +210,31 @@ description = "Code coverage measurement for Python" name = "coverage" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "5.1" +version = "5.2.1" [package.extras] toml = ["toml"] [[package]] category = "dev" -description = "Style checker for Sphinx (or other) RST documentation" -name = "doc8" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +marker = "sys_platform == \"linux\"" +name = "cryptography" optional = false -python-versions = "*" -version = "0.8.1" +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +version = "3.0" [package.dependencies] -Pygments = "*" -chardet = "*" -docutils = "*" -restructuredtext-lint = ">=0.7" -six = "*" -stevedore = "*" +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" @@ -270,6 +304,15 @@ optional = false python-versions = "*" version = "3.2.3-2" +[[package]] +category = "dev" +description = "Clean single-source support for Python 3 and 2" +marker = "python_version < \"3\"" +name = "future" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "0.18.2" + [[package]] category = "dev" description = "Backport of the concurrent.futures package from Python 3" @@ -290,6 +333,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.*" @@ -323,9 +367,19 @@ version = "*" docs = ["sphinx", "rst.linker"] 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 = "*" +version = "1.0.1" + [[package]] category = "dev" description = "A Python utility / library to sort Python imports." +marker = "python_version < \"3.6\" or python_version >= \"3.6\"" name = "isort" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" @@ -346,9 +400,36 @@ pyproject = ["toml"] requirements = ["pipreqs", "pip-api"] xdg_home = ["appdirs (>=1.4.0)"] +[[package]] +category = "dev" +description = "A Python utility / library to sort Python imports." +marker = "python_version >= \"3.6\"" +name = "isort" +optional = false +python-versions = ">=3.6,<4.0" +version = "5.3.2" + +[package.extras] +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." +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.*" @@ -360,6 +441,27 @@ MarkupSafe = ">=0.23" [package.extras] i18n = ["Babel (>=0.8)"] +[[package]] +category = "dev" +description = "Store and access your passwords safely." +name = "keyring" +optional = false +python-versions = ">=3.6" +version = "21.3.0" + +[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", "pytest-mypy"] + [[package]] category = "dev" description = "Safely add untrusted strings to HTML/XML markup." @@ -377,6 +479,27 @@ optional = false python-versions = "*" version = "0.6.1" +[[package]] +category = "dev" +description = "Rolling backport of unittest.mock for all Pythons" +marker = "python_version < \"3\"" +name = "mock" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "3.0.5" + +[package.dependencies] +six = "*" + +[package.dependencies.funcsigs] +python = "<3.3" +version = ">=1" + +[package.extras] +build = ["twine", "wheel", "blurb"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + [[package]] category = "dev" description = "More routines for operating on iterables, beyond itertools" @@ -392,6 +515,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" @@ -428,7 +552,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 = "*" @@ -446,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." @@ -468,6 +584,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.*" @@ -484,6 +601,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.*" @@ -497,6 +615,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" @@ -524,6 +651,7 @@ version = "2.6.1" [[package]] category = "dev" description = "Python parsing module" +marker = "python_version < \"3\" or python_version >= \"3\"" name = "pyparsing" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" @@ -575,17 +703,18 @@ description = "pytest: simple powerful testing with Python" name = "pytest" optional = false python-versions = ">=3.5" -version = "5.4.3" +version = "6.0.1" [package.dependencies] atomicwrites = ">=1.0" attrs = ">=17.4.0" colorama = "*" +iniconfig = "*" more-itertools = ">=4.0.0" packaging = "*" pluggy = ">=0.12,<1.0" -py = ">=1.5.0" -wcwidth = "*" +py = ">=1.8.2" +toml = "*" [package.dependencies.importlib-metadata] python = "<3.8" @@ -596,7 +725,7 @@ python = "<3.6" version = ">=2.2.0" [package.extras] -checkqa-mypy = ["mypy (v0.761)"] +checkqa_mypy = ["mypy (0.780)"] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] [[package]] @@ -631,6 +760,40 @@ pytest = ">=4.6" [package.extras] testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] +[[package]] +category = "dev" +description = "Thin-wrapper around the mock package for easier use with py.test" +marker = "python_version < \"3\" or python_version >= \"3\"" +name = "pytest-mock" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.0.0" + +[package.dependencies] +pytest = ">=2.7" + +[package.dependencies.mock] +python = "<3.0" +version = "*" + +[package.extras] +dev = ["pre-commit", "tox"] + +[[package]] +category = "dev" +description = "Thin-wrapper around the mock package for easier use with pytest" +marker = "python_version >= \"3\"" +name = "pytest-mock" +optional = false +python-versions = ">=3.5" +version = "3.2.0" + +[package.dependencies] +pytest = ">=2.7" + +[package.extras] +dev = ["pre-commit", "tox", "pytest-asyncio"] + [[package]] category = "dev" description = "pytest plugin to re-run tests to eliminate flaky failures" @@ -664,6 +827,15 @@ optional = false python-versions = "*" version = "2020.1" +[[package]] +category = "dev" +description = "" +marker = "sys_platform == \"win32\"" +name = "pywin32-ctypes" +optional = false +python-versions = "*" +version = "0.2.0" + [[package]] category = "dev" description = "readme_renderer is a library for rendering \"readme\" descriptions for Warehouse" @@ -681,6 +853,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." @@ -688,7 +873,7 @@ marker = "python_version >= \"3.6\" and python_version < \"4.0\"" name = "regex" optional = false python-versions = "*" -version = "2020.6.8" +version = "2020.7.14" [[package]] category = "dev" @@ -721,14 +906,14 @@ requests = ">=2.0.1,<3.0.0" [[package]] category = "dev" -description = "reStructuredText linter" -name = "restructuredtext-lint" +description = "Validating URI References per RFC 3986" +name = "rfc3986" optional = false python-versions = "*" -version = "1.3.1" +version = "1.4.0" -[package.dependencies] -docutils = ">=0.11,<1.0" +[package.extras] +idna2008 = ["idna"] [[package]] category = "dev" @@ -739,6 +924,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" @@ -750,6 +948,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 = "*" @@ -792,7 +991,7 @@ description = "Python documentation generator" name = "sphinx" optional = false python-versions = ">=3.5" -version = "3.1.1" +version = "3.2.0" [package.dependencies] Jinja2 = ">=2.3" @@ -837,6 +1036,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" @@ -849,6 +1049,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" @@ -861,6 +1062,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" @@ -873,6 +1075,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" @@ -884,6 +1087,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" @@ -896,6 +1100,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" @@ -917,22 +1122,10 @@ version = "1.1.2" [package.extras] test = ["pytest", "mock"] -[[package]] -category = "dev" -description = "Manage dynamic plugins for Python applications" -name = "stevedore" -optional = false -python-versions = "*" -version = "1.32.0" - -[package.dependencies] -pbr = ">=2.0.0,<2.1.0 || >2.1.0" -six = ">=1.10.0" - [[package]] category = "dev" description = "Python Library for Tom's Obvious, Minimal Language" -marker = "python_version >= \"3.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 = "*" @@ -944,7 +1137,7 @@ description = "Fast, Extensible Progress Meter" name = "tqdm" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.47.0" +version = "4.48.2" [package.extras] dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] @@ -969,6 +1162,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" @@ -984,8 +1200,8 @@ description = "Type Hints for Python" marker = "python_version < \"3.5\"" name = "typing" optional = false -python-versions = "*" -version = "3.7.4.1" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "3.7.4.3" [[package]] category = "dev" @@ -993,7 +1209,7 @@ description = "HTTP library with thread-safe connection pooling, file post, and name = "urllib3" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.25.9" +version = "1.25.10" [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -1003,6 +1219,7 @@ socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] category = "dev" description = "Measures the displayed width of unicode strings in a terminal" +marker = "python_version < \"3\"" name = "wcwidth" optional = false python-versions = "*" @@ -1024,7 +1241,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\")" +marker = "python_version >= \"3\" and python_version < \"3.8\" or python_version < \"3\"" name = "zipp" optional = false python-versions = ">=2.7" @@ -1039,8 +1256,29 @@ version = "*" docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] +[[package]] +category = "dev" +description = "Backport of pathlib-compatible object wrapper for zip files" +marker = "python_version >= \"3\" and python_version < \"3.8\"" +name = "zipp" +optional = false +python-versions = ">=3.6" +version = "3.1.0" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["jaraco.itertools", "func-timeout"] + +[extras] +coverage = [] +deploy = [] +docs = [] +format = [] +lint = [] +test = [] + [metadata] -content-hash = "59736a627f8576a55609f5d957610e196c01ee7d384df4d80faf911a88202e99" +content-hash = "de6760b7f3f560320576ddbc89cf631b582905d63a8a4225bac47f93e1bd8f1f" lock-version = "1.0" python-versions = "~2.7 || ^3.5" @@ -1085,6 +1323,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"}, @@ -1094,14 +1362,18 @@ click = [ {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, ] codecov = [ - {file = "codecov-2.1.7-py2.py3-none-any.whl", hash = "sha256:b67bb8029e8340a7bf22c71cbece5bd18c96261fdebc2f105ee4d5a005bc8728"}, - {file = "codecov-2.1.7-py3.8.egg", hash = "sha256:d8b8109f44edad03b24f5f189dac8de9b1e3dc3c791fa37eeaf8c7381503ec34"}, - {file = "codecov-2.1.7.tar.gz", hash = "sha256:491938ad774ea94a963d5d16354c7299e90422a33a353ba0d38d0943ed1d5091"}, + {file = "codecov-2.1.8-py2.py3-none-any.whl", hash = "sha256:65e8a8008e43eb45a9404bf68f8d4a60d36de3827ef2287971c94940128eba1e"}, + {file = "codecov-2.1.8-py3.8.egg", hash = "sha256:fa7985ac6a3886cf68e3420ee1b5eb4ed30c4bdceec0f332d17ab69f545fbc90"}, + {file = "codecov-2.1.8.tar.gz", hash = "sha256:0be9cd6358cc6a3c01a1586134b0fb524dfa65ccbec3a40e9f28d5f976676ba2"}, ] 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"}, @@ -1111,41 +1383,61 @@ contextlib2 = [ {file = "contextlib2-0.6.0.post1.tar.gz", hash = "sha256:01f490098c18b19d2bd5bb5dc445b2054d2fa97f09a4280ba2c5f3c394c8162e"}, ] coverage = [ - {file = "coverage-5.1-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:0cb4be7e784dcdc050fc58ef05b71aa8e89b7e6636b99967fadbdba694cf2b65"}, - {file = "coverage-5.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:c317eaf5ff46a34305b202e73404f55f7389ef834b8dbf4da09b9b9b37f76dd2"}, - {file = "coverage-5.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b83835506dfc185a319031cf853fa4bb1b3974b1f913f5bb1a0f3d98bdcded04"}, - {file = "coverage-5.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5f2294dbf7875b991c381e3d5af2bcc3494d836affa52b809c91697449d0eda6"}, - {file = "coverage-5.1-cp27-cp27m-win32.whl", hash = "sha256:de807ae933cfb7f0c7d9d981a053772452217df2bf38e7e6267c9cbf9545a796"}, - {file = "coverage-5.1-cp27-cp27m-win_amd64.whl", hash = "sha256:bf9cb9a9fd8891e7efd2d44deb24b86d647394b9705b744ff6f8261e6f29a730"}, - {file = "coverage-5.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:acf3763ed01af8410fc36afea23707d4ea58ba7e86a8ee915dfb9ceff9ef69d0"}, - {file = "coverage-5.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:dec5202bfe6f672d4511086e125db035a52b00f1648d6407cc8e526912c0353a"}, - {file = "coverage-5.1-cp35-cp35m-macosx_10_12_x86_64.whl", hash = "sha256:7a5bdad4edec57b5fb8dae7d3ee58622d626fd3a0be0dfceda162a7035885ecf"}, - {file = "coverage-5.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1601e480b9b99697a570cea7ef749e88123c04b92d84cedaa01e117436b4a0a9"}, - {file = "coverage-5.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:dbe8c6ae7534b5b024296464f387d57c13caa942f6d8e6e0346f27e509f0f768"}, - {file = "coverage-5.1-cp35-cp35m-win32.whl", hash = "sha256:a027ef0492ede1e03a8054e3c37b8def89a1e3c471482e9f046906ba4f2aafd2"}, - {file = "coverage-5.1-cp35-cp35m-win_amd64.whl", hash = "sha256:0e61d9803d5851849c24f78227939c701ced6704f337cad0a91e0972c51c1ee7"}, - {file = "coverage-5.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:2d27a3f742c98e5c6b461ee6ef7287400a1956c11421eb574d843d9ec1f772f0"}, - {file = "coverage-5.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66460ab1599d3cf894bb6baee8c684788819b71a5dc1e8fa2ecc152e5d752019"}, - {file = "coverage-5.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5c542d1e62eece33c306d66fe0a5c4f7f7b3c08fecc46ead86d7916684b36d6c"}, - {file = "coverage-5.1-cp36-cp36m-win32.whl", hash = "sha256:2742c7515b9eb368718cd091bad1a1b44135cc72468c731302b3d641895b83d1"}, - {file = "coverage-5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:dead2ddede4c7ba6cb3a721870f5141c97dc7d85a079edb4bd8d88c3ad5b20c7"}, - {file = "coverage-5.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:01333e1bd22c59713ba8a79f088b3955946e293114479bbfc2e37d522be03355"}, - {file = "coverage-5.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e1ea316102ea1e1770724db01998d1603ed921c54a86a2efcb03428d5417e489"}, - {file = "coverage-5.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:adeb4c5b608574a3d647011af36f7586811a2c1197c861aedb548dd2453b41cd"}, - {file = "coverage-5.1-cp37-cp37m-win32.whl", hash = "sha256:782caea581a6e9ff75eccda79287daefd1d2631cc09d642b6ee2d6da21fc0a4e"}, - {file = "coverage-5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:00f1d23f4336efc3b311ed0d807feb45098fc86dee1ca13b3d6768cdab187c8a"}, - {file = "coverage-5.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:402e1744733df483b93abbf209283898e9f0d67470707e3c7516d84f48524f55"}, - {file = "coverage-5.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a3f3654d5734a3ece152636aad89f58afc9213c6520062db3978239db122f03c"}, - {file = "coverage-5.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6402bd2fdedabbdb63a316308142597534ea8e1895f4e7d8bf7476c5e8751fef"}, - {file = "coverage-5.1-cp38-cp38-win32.whl", hash = "sha256:8fa0cbc7ecad630e5b0f4f35b0f6ad419246b02bc750de7ac66db92667996d24"}, - {file = "coverage-5.1-cp38-cp38-win_amd64.whl", hash = "sha256:79a3cfd6346ce6c13145731d39db47b7a7b859c0272f02cdb89a3bdcbae233a0"}, - {file = "coverage-5.1-cp39-cp39-win32.whl", hash = "sha256:a82b92b04a23d3c8a581fc049228bafde988abacba397d57ce95fe95e0338ab4"}, - {file = "coverage-5.1-cp39-cp39-win_amd64.whl", hash = "sha256:bb28a7245de68bf29f6fb199545d072d1036a1917dca17a1e75bbb919e14ee8e"}, - {file = "coverage-5.1.tar.gz", hash = "sha256:f90bfc4ad18450c80b024036eaf91e4a246ae287701aaa88eaebebf150868052"}, -] -doc8 = [ - {file = "doc8-0.8.1-py2.py3-none-any.whl", hash = "sha256:4d58a5c8c56cedd2b2c9d6e3153be5d956cf72f6051128f0f2255c66227df721"}, - {file = "doc8-0.8.1.tar.gz", hash = "sha256:4d1df12598807cf08ffa9a1d5ef42d229ee0de42519da01b768ff27211082c12"}, + {file = "coverage-5.2.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:40f70f81be4d34f8d491e55936904db5c527b0711b2a46513641a5729783c2e4"}, + {file = "coverage-5.2.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:675192fca634f0df69af3493a48224f211f8db4e84452b08d5fcebb9167adb01"}, + {file = "coverage-5.2.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2fcc8b58953d74d199a1a4d633df8146f0ac36c4e720b4a1997e9b6327af43a8"}, + {file = "coverage-5.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:64c4f340338c68c463f1b56e3f2f0423f7b17ba6c3febae80b81f0e093077f59"}, + {file = "coverage-5.2.1-cp27-cp27m-win32.whl", hash = "sha256:52f185ffd3291196dc1aae506b42e178a592b0b60a8610b108e6ad892cfc1bb3"}, + {file = "coverage-5.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:30bc103587e0d3df9e52cd9da1dd915265a22fad0b72afe54daf840c984b564f"}, + {file = "coverage-5.2.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:9ea749fd447ce7fb1ac71f7616371f04054d969d412d37611716721931e36efd"}, + {file = "coverage-5.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ce7866f29d3025b5b34c2e944e66ebef0d92e4a4f2463f7266daa03a1332a651"}, + {file = "coverage-5.2.1-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:4869ab1c1ed33953bb2433ce7b894a28d724b7aa76c19b11e2878034a4e4680b"}, + {file = "coverage-5.2.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a3ee9c793ffefe2944d3a2bd928a0e436cd0ac2d9e3723152d6fd5398838ce7d"}, + {file = "coverage-5.2.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:28f42dc5172ebdc32622a2c3f7ead1b836cdbf253569ae5673f499e35db0bac3"}, + {file = "coverage-5.2.1-cp35-cp35m-win32.whl", hash = "sha256:e26c993bd4b220429d4ec8c1468eca445a4064a61c74ca08da7429af9bc53bb0"}, + {file = "coverage-5.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4186fc95c9febeab5681bc3248553d5ec8c2999b8424d4fc3a39c9cba5796962"}, + {file = "coverage-5.2.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:b360d8fd88d2bad01cb953d81fd2edd4be539df7bfec41e8753fe9f4456a5082"}, + {file = "coverage-5.2.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:1adb6be0dcef0cf9434619d3b892772fdb48e793300f9d762e480e043bd8e716"}, + {file = "coverage-5.2.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:098a703d913be6fbd146a8c50cc76513d726b022d170e5e98dc56d958fd592fb"}, + {file = "coverage-5.2.1-cp36-cp36m-win32.whl", hash = "sha256:962c44070c281d86398aeb8f64e1bf37816a4dfc6f4c0f114756b14fc575621d"}, + {file = "coverage-5.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1ed2bdb27b4c9fc87058a1cb751c4df8752002143ed393899edb82b131e0546"}, + {file = "coverage-5.2.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:c890728a93fffd0407d7d37c1e6083ff3f9f211c83b4316fae3778417eab9811"}, + {file = "coverage-5.2.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:538f2fd5eb64366f37c97fdb3077d665fa946d2b6d95447622292f38407f9258"}, + {file = "coverage-5.2.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:27ca5a2bc04d68f0776f2cdcb8bbd508bbe430a7bf9c02315cd05fb1d86d0034"}, + {file = "coverage-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:aab75d99f3f2874733946a7648ce87a50019eb90baef931698f96b76b6769a46"}, + {file = "coverage-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:c2ff24df02a125b7b346c4c9078c8936da06964cc2d276292c357d64378158f8"}, + {file = "coverage-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:304fbe451698373dc6653772c72c5d5e883a4aadaf20343592a7abb2e643dae0"}, + {file = "coverage-5.2.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c96472b8ca5dc135fb0aa62f79b033f02aa434fb03a8b190600a5ae4102df1fd"}, + {file = "coverage-5.2.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8505e614c983834239f865da2dd336dcf9d72776b951d5dfa5ac36b987726e1b"}, + {file = "coverage-5.2.1-cp38-cp38-win32.whl", hash = "sha256:700997b77cfab016533b3e7dbc03b71d33ee4df1d79f2463a318ca0263fc29dd"}, + {file = "coverage-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:46794c815e56f1431c66d81943fa90721bb858375fb36e5903697d5eef88627d"}, + {file = "coverage-5.2.1-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:16042dc7f8e632e0dcd5206a5095ebd18cb1d005f4c89694f7f8aafd96dd43a3"}, + {file = "coverage-5.2.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c1bbb628ed5192124889b51204de27c575b3ffc05a5a91307e7640eff1d48da4"}, + {file = "coverage-5.2.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4f6428b55d2916a69f8d6453e48a505c07b2245653b0aa9f0dee38785939f5e4"}, + {file = "coverage-5.2.1-cp39-cp39-win32.whl", hash = "sha256:9e536783a5acee79a9b308be97d3952b662748c4037b6a24cbb339dc7ed8eb89"}, + {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"}, @@ -1168,6 +1460,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"}, @@ -1184,14 +1479,28 @@ 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"}, ] +iniconfig = [ + {file = "iniconfig-1.0.1-py3-none-any.whl", hash = "sha256:80cf40c597eb564e86346103f609d74efce0f6b4d4f30ec8ce9e2c26411ba437"}, + {file = "iniconfig-1.0.1.tar.gz", hash = "sha256:e5f92f89355a67de0595932a6c6c02ab4afddc6fcdc0bfc5becd0d60884d3f69"}, +] 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.3.2-py3-none-any.whl", hash = "sha256:5196bd2f5b23dc91215734b1c96c6d28390061d69860a948094c12635d6d64e6"}, + {file = "isort-5.3.2.tar.gz", hash = "sha256:ba83762132a8661d3525f87a86549712fb7d8da79eeb452e01f327ada9e87920"}, +] +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"}, ] +keyring = [ + {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"}, {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, @@ -1231,6 +1540,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"}, ] +mock = [ + {file = "mock-3.0.5-py2.py3-none-any.whl", hash = "sha256:d157e52d4e5b938c550f39eb2fd15610db062441a9c2747d3dbfa9298211d0f8"}, + {file = "mock-3.0.5.tar.gz", hash = "sha256:83657d894c90d5681d62155c82bda9c1187827525880eda8ff5df4ec813437c3"}, +] more-itertools = [ {file = "more-itertools-5.0.0.tar.gz", hash = "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4"}, {file = "more_itertools-5.0.0-py2-none-any.whl", hash = "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc"}, @@ -1252,10 +1565,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"}, @@ -1272,6 +1581,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"}, @@ -1289,8 +1602,8 @@ pyparsing = [ pytest = [ {file = "pytest-4.6.11-py2.py3-none-any.whl", hash = "sha256:a00a7d79cbbdfa9d21e7d0298392a8dd4123316bfac545075e6f8f24c94d8c97"}, {file = "pytest-4.6.11.tar.gz", hash = "sha256:50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353"}, - {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, - {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, + {file = "pytest-6.0.1-py3-none-any.whl", hash = "sha256:8b6007800c53fdacd5a5c192203f4e531eb2a1540ad9c752e052ec0f7143dbad"}, + {file = "pytest-6.0.1.tar.gz", hash = "sha256:85228d75db9f45e06e57ef9bf4429267f81ac7c0d742cc9ed63d09886a9fe6f4"}, ] pytest-cov = [ {file = "pytest-cov-2.9.0.tar.gz", hash = "sha256:b6a814b8ed6247bd81ff47f038511b57fe1ce7f4cc25b9106f1a4b106f1d9322"}, @@ -1298,6 +1611,12 @@ pytest-cov = [ {file = "pytest-cov-2.10.0.tar.gz", hash = "sha256:1a629dc9f48e53512fcbfda6b07de490c374b0c83c55ff7a1720b3fccff0ac87"}, {file = "pytest_cov-2.10.0-py2.py3-none-any.whl", hash = "sha256:6e6d18092dce6fad667cd7020deed816f858ad3b49d5b5e2b1cc1c97a4dba65c"}, ] +pytest-mock = [ + {file = "pytest-mock-2.0.0.tar.gz", hash = "sha256:b35eb281e93aafed138db25c8772b95d3756108b601947f89af503f8c629413f"}, + {file = "pytest_mock-2.0.0-py2.py3-none-any.whl", hash = "sha256:cb67402d87d5f53c579263d37971a164743dc33c159dfb4fb4a86f37c5552307"}, + {file = "pytest-mock-3.2.0.tar.gz", hash = "sha256:7122d55505d5ed5a6f3df940ad174b3f606ecae5e9bc379569cdcbd4cd9d2b83"}, + {file = "pytest_mock-3.2.0-py3-none-any.whl", hash = "sha256:5564c7cd2569b603f8451ec77928083054d8896046830ca763ed68f4112d17c7"}, +] pytest-rerunfailures = [ {file = "pytest-rerunfailures-8.0.tar.gz", hash = "sha256:17c1236b9f8463f74a5df6c807f301c53c2ea1ab81b7509b7e23fab3b7cbe812"}, {file = "pytest_rerunfailures-8.0-py2.py3-none-any.whl", hash = "sha256:4997cda1b82f74cc0c280f6a5a0470d36deb318e3d8bd6da71efc32a3e0c9ae4"}, @@ -1308,32 +1627,40 @@ 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"}, +] 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.6.8-cp27-cp27m-win32.whl", hash = "sha256:fbff901c54c22425a5b809b914a3bfaf4b9570eee0e5ce8186ac71eb2025191c"}, - {file = "regex-2020.6.8-cp27-cp27m-win_amd64.whl", hash = "sha256:112e34adf95e45158c597feea65d06a8124898bdeac975c9087fe71b572bd938"}, - {file = "regex-2020.6.8-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:92d8a043a4241a710c1cf7593f5577fbb832cf6c3a00ff3fc1ff2052aff5dd89"}, - {file = "regex-2020.6.8-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:bae83f2a56ab30d5353b47f9b2a33e4aac4de9401fb582b55c42b132a8ac3868"}, - {file = "regex-2020.6.8-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:b2ba0f78b3ef375114856cbdaa30559914d081c416b431f2437f83ce4f8b7f2f"}, - {file = "regex-2020.6.8-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:95fa7726d073c87141f7bbfb04c284901f8328e2d430eeb71b8ffdd5742a5ded"}, - {file = "regex-2020.6.8-cp36-cp36m-win32.whl", hash = "sha256:e3cdc9423808f7e1bb9c2e0bdb1c9dc37b0607b30d646ff6faf0d4e41ee8fee3"}, - {file = "regex-2020.6.8-cp36-cp36m-win_amd64.whl", hash = "sha256:c78e66a922de1c95a208e4ec02e2e5cf0bb83a36ceececc10a72841e53fbf2bd"}, - {file = "regex-2020.6.8-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:08997a37b221a3e27d68ffb601e45abfb0093d39ee770e4257bd2f5115e8cb0a"}, - {file = "regex-2020.6.8-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2f6f211633ee8d3f7706953e9d3edc7ce63a1d6aad0be5dcee1ece127eea13ae"}, - {file = "regex-2020.6.8-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:55b4c25cbb3b29f8d5e63aeed27b49fa0f8476b0d4e1b3171d85db891938cc3a"}, - {file = "regex-2020.6.8-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:89cda1a5d3e33ec9e231ece7307afc101b5217523d55ef4dc7fb2abd6de71ba3"}, - {file = "regex-2020.6.8-cp37-cp37m-win32.whl", hash = "sha256:690f858d9a94d903cf5cada62ce069b5d93b313d7d05456dbcd99420856562d9"}, - {file = "regex-2020.6.8-cp37-cp37m-win_amd64.whl", hash = "sha256:1700419d8a18c26ff396b3b06ace315b5f2a6e780dad387e4c48717a12a22c29"}, - {file = "regex-2020.6.8-cp38-cp38-manylinux1_i686.whl", hash = "sha256:654cb773b2792e50151f0e22be0f2b6e1c3a04c5328ff1d9d59c0398d37ef610"}, - {file = "regex-2020.6.8-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:52e1b4bef02f4040b2fd547357a170fc1146e60ab310cdbdd098db86e929b387"}, - {file = "regex-2020.6.8-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:cf59bbf282b627130f5ba68b7fa3abdb96372b24b66bdf72a4920e8153fc7910"}, - {file = "regex-2020.6.8-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5aaa5928b039ae440d775acea11d01e42ff26e1561c0ffcd3d805750973c6baf"}, - {file = "regex-2020.6.8-cp38-cp38-win32.whl", hash = "sha256:97712e0d0af05febd8ab63d2ef0ab2d0cd9deddf4476f7aa153f76feef4b2754"}, - {file = "regex-2020.6.8-cp38-cp38-win_amd64.whl", hash = "sha256:6ad8663c17db4c5ef438141f99e291c4d4edfeaacc0ce28b5bba2b0bf273d9b5"}, - {file = "regex-2020.6.8.tar.gz", hash = "sha256:e9b64e609d37438f7d6e68c2546d2cb8062f3adb27e6336bc129b51be20773ac"}, + {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"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:c50a724d136ec10d920661f1442e4a8b010a4fe5aebd65e0c2241ea41dbe93dc"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8a51f2c6d1f884e98846a0a9021ff6861bdb98457879f412fdc2b42d14494067"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:9c568495e35599625f7b999774e29e8d6b01a6fb684d77dee1f56d41b11b40cd"}, + {file = "regex-2020.7.14-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:51178c738d559a2d1071ce0b0f56e57eb315bcf8f7d4cf127674b533e3101f88"}, + {file = "regex-2020.7.14-cp36-cp36m-win32.whl", hash = "sha256:9eddaafb3c48e0900690c1727fba226c4804b8e6127ea409689c3bb492d06de4"}, + {file = "regex-2020.7.14-cp36-cp36m-win_amd64.whl", hash = "sha256:14a53646369157baa0499513f96091eb70382eb50b2c82393d17d7ec81b7b85f"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:1269fef3167bb52631ad4fa7dd27bf635d5a0790b8e6222065d42e91bede4162"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d0a5095d52b90ff38592bbdc2644f17c6d495762edf47d876049cfd2968fbccf"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:4c037fd14c5f4e308b8370b447b469ca10e69427966527edcab07f52d88388f7"}, + {file = "regex-2020.7.14-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bc3d98f621898b4a9bc7fecc00513eec8f40b5b83913d74ccb445f037d58cd89"}, + {file = "regex-2020.7.14-cp37-cp37m-win32.whl", hash = "sha256:46bac5ca10fb748d6c55843a931855e2727a7a22584f302dd9bb1506e69f83f6"}, + {file = "regex-2020.7.14-cp37-cp37m-win_amd64.whl", hash = "sha256:0dc64ee3f33cd7899f79a8d788abfbec168410be356ed9bd30bbd3f0a23a7204"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux1_i686.whl", hash = "sha256:5ea81ea3dbd6767873c611687141ec7b06ed8bab43f68fad5b7be184a920dc99"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:bbb332d45b32df41200380fff14712cb6093b61bd142272a10b16778c418e98e"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:c11d6033115dc4887c456565303f540c44197f4fc1a2bfb192224a301534888e"}, + {file = "regex-2020.7.14-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:75aaa27aa521a182824d89e5ab0a1d16ca207318a6b65042b046053cfc8ed07a"}, + {file = "regex-2020.7.14-cp38-cp38-win32.whl", hash = "sha256:d6cff2276e502b86a25fd10c2a96973fdb45c7a977dca2138d661417f3728341"}, + {file = "regex-2020.7.14-cp38-cp38-win_amd64.whl", hash = "sha256:7a2dd66d2d4df34fa82c9dc85657c5e019b87932019947faece7983f2089a840"}, + {file = "regex-2020.7.14.tar.gz", hash = "sha256:3a3af27a8d23143c49a3420efe5b3f8cf1a48c6fc8bc6856b03f638abc1833bb"}, ] requests = [ {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, @@ -1343,8 +1670,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"}, ] scandir = [ {file = "scandir-1.10.0-cp27-cp27m-win32.whl", hash = "sha256:92c85ac42f41ffdc35b6da57ed991575bdbe69db895507af88b9f499b701c188"}, @@ -1359,6 +1687,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"}, @@ -1370,8 +1702,8 @@ snowballstemmer = [ sphinx = [ {file = "Sphinx-1.8.5-py2.py3-none-any.whl", hash = "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c"}, {file = "Sphinx-1.8.5.tar.gz", hash = "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"}, - {file = "Sphinx-3.1.1-py3-none-any.whl", hash = "sha256:97c9e3bcce2f61d9f5edf131299ee9d1219630598d9f9a8791459a4d9e815be5"}, - {file = "Sphinx-3.1.1.tar.gz", hash = "sha256:74fbead182a611ce1444f50218a1c5fc70b6cc547f64948f5182fb30a2a20258"}, + {file = "Sphinx-3.2.0-py3-none-any.whl", hash = "sha256:f7db5b76c42c8b5ef31853c2de7178ef378b985d7793829ec071e120dac1d0ca"}, + {file = "Sphinx-3.2.0.tar.gz", hash = "sha256:cf2d5bc3c6c930ab0a1fbef3ad8a82994b1bf4ae923f8098a05c7e5516f07177"}, ] sphinx-issues = [ {file = "sphinx-issues-1.2.0.tar.gz", hash = "sha256:845294736c7ac4c09c706f13431f709e1164037cbb00f6bf623ae16eccf509f3"}, @@ -1405,21 +1737,19 @@ sphinxcontrib-websupport = [ {file = "sphinxcontrib-websupport-1.1.2.tar.gz", hash = "sha256:1501befb0fdf1d1c29a800fdbf4ef5dc5369377300ddbdd16d2cd40e54c6eefc"}, {file = "sphinxcontrib_websupport-1.1.2-py2.py3-none-any.whl", hash = "sha256:e02f717baf02d0b6c3dd62cf81232ffca4c9d5c331e03766982e3ff9f1d2bc3f"}, ] -stevedore = [ - {file = "stevedore-1.32.0-py2.py3-none-any.whl", hash = "sha256:a4e7dc759fb0f2e3e2f7d8ffe2358c19d45b9b8297f393ef1256858d82f69c9b"}, - {file = "stevedore-1.32.0.tar.gz", hash = "sha256:18afaf1d623af5950cc0f7e75e70f917784c73b652a34a12d90b309451b5500b"}, -] toml = [ {file = "toml-0.10.1-py2.py3-none-any.whl", hash = "sha256:bda89d5935c2eac546d648028b9901107a595863cb36bae0c73ac804a9b4ce88"}, {file = "toml-0.10.1.tar.gz", hash = "sha256:926b612be1e5ce0634a2ca03470f95169cf16f939018233a670519cb4ac58b0f"}, ] tqdm = [ - {file = "tqdm-4.47.0-py2.py3-none-any.whl", hash = "sha256:7810e627bcf9d983a99d9ff8a0c09674400fd2927eddabeadf153c14a2ec8656"}, - {file = "tqdm-4.47.0.tar.gz", hash = "sha256:63ef7a6d3eb39f80d6b36e4867566b3d8e5f1fe3d6cb50c5e9ede2b3198ba7b7"}, + {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"}, {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"}, @@ -1445,13 +1775,12 @@ typed-ast = [ {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, ] typing = [ - {file = "typing-3.7.4.1-py2-none-any.whl", hash = "sha256:c8cabb5ab8945cd2f54917be357d134db9cc1eb039e59d1606dc1e60cb1d9d36"}, - {file = "typing-3.7.4.1-py3-none-any.whl", hash = "sha256:f38d83c5a7a7086543a0f649564d661859c5146a85775ab90c0d2f93ffaa9714"}, - {file = "typing-3.7.4.1.tar.gz", hash = "sha256:91dfe6f3f706ee8cc32d38edbbf304e9b7583fb37108fef38229617f8b3eba23"}, + {file = "typing-3.7.4.3-py2-none-any.whl", hash = "sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"}, + {file = "typing-3.7.4.3.tar.gz", hash = "sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9"}, ] urllib3 = [ - {file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"}, - {file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"}, + {file = "urllib3-1.25.10-py2.py3-none-any.whl", hash = "sha256:e7983572181f5e1522d9c98453462384ee92a0be7fac5f1413a1e35c56cc0461"}, + {file = "urllib3-1.25.10.tar.gz", hash = "sha256:91056c15fa70756691db97756772bb1eb9678fa585d9184f24534b100dc60f4a"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, @@ -1464,4 +1793,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"}, ] diff --git a/pyproject.toml b/pyproject.toml index 66a5a8f6b..3f8577830 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -12,27 +12,52 @@ authors = ["Tony Narlock "] python = "~2.7 || ^3.5" [tool.poetry.dev-dependencies] -alagitpull = "~=0.1.0" -black = {version="==19.10b0", python="^3.6"} -doc8 = "*" -docutils = "*" -flake8 = "*" -isort = "*" +### Docs ### +sphinx = [ + {version="<2", python="<3"}, + {version="*", python=">=3"} +] +recommonmark = {version = "^0.6.0"} +alagitpull = {version = "~0.1.0"} +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 = "*" -sphinx = [ - {version="<2", python="<3"}, +pytest-mock = [ + {version="<3.0.0", python="<3"}, {version="*", python=">=3"} ] -sphinx-issues = "*" -twine = "*" + +### Coverage ### codecov = "*" coverage = "*" pytest-cov = [ {version="<2.10.0", python="<3"}, {version="*", python=">=3"} ] + +### Format ### +black = {version="==19.10b0", python="^3.6"} +isort = [ + {version="<5", python="<3.6"}, + {version="*", python=">=3.6"} +] + +### Lint ### +flake8 = "*" + +### 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 = ["twine"] From 1de5894dd135f40799632a3aa39dd1d7d032f112 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:30:58 -0500 Subject: [PATCH 04/29] build(isort): Update isort config for 5.x --- setup.cfg | 2 -- 1 file changed, 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index c4abbb3cc..b8dc83ce8 100644 --- a/setup.cfg +++ b/setup.cfg @@ -47,7 +47,5 @@ include_trailing_comma = true multi_line_output = 3 known_pytest = pytest,py known_first_party = libtmux -split_before_closing_bracket = true sections = FUTURE,STDLIB,PYTEST,THIRDPARTY,FIRSTPARTY,LOCALFOLDER line_length = 88 -not_skip = __init__.py From 772569e1a31fa01f4ac152ca31ebbe645263b760 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:36:33 -0500 Subject: [PATCH 05/29] build(MANIFEST): Keep pyproject.toml --- MANIFEST.in | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/MANIFEST.in b/MANIFEST.in index 97af18918..999b0f0f9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,3 @@ -include README.rst LICENSE CHANGES .tmuxp.yaml +include README.rst LICENSE CHANGES pyproject.toml .tmuxp.yaml include requirements/*.txt recursive-include doc *.rst From 9ed481a9ac7804937fe8f54faa9f7044a54f6228 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:37:00 -0500 Subject: [PATCH 06/29] build(codecov): Ignore loud/squeaky codecov messages --- .codecov.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 .codecov.yml diff --git a/.codecov.yml b/.codecov.yml new file mode 100644 index 000000000..bf9b9abef --- /dev/null +++ b/.codecov.yml @@ -0,0 +1,15 @@ +codecov: + notify: + require_ci_to_pass: no + +coverage: + precision: 2 + round: down + range: "70...100" + status: + project: + default: + target: auto + threshold: 1% + base: auto + patch: off From 4726d5c710996df4931806144fed0a1f8c922685 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:40:55 -0500 Subject: [PATCH 07/29] build(docs): Update Makefile to the latest stuff --- doc/Makefile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/doc/Makefile b/doc/Makefile index db6286f42..05286656f 100644 --- a/doc/Makefile +++ b/doc/Makefile @@ -1,5 +1,6 @@ # Makefile for Sphinx documentation -WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]rst\|CHANGES\|TODO\|.*conf\.py\|.*[.]py$$' 2> /dev/null +WATCH_FILES= find .. -type f -not -path '*/\.*' | grep -i '.*[.]rst\$\|.*[.].md\|.*[.]py\$\|CHANGES\|TODO\|.*conf\.py' 2> /dev/null +SHELL := /bin/bash PYVERSION=$(shell python -c "import sys;v=sys.version_info[0];sys.stdout.write(str(v))") HTTP_PORT = 8023 @@ -164,13 +165,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://localhost:${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 From 28f5f8f3d7ff4bd6341338064cd51399ac0f6a49 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:44:59 -0500 Subject: [PATCH 08/29] build(docs): Add icons --- doc/_static/img/icons/icon-128x128.png | Bin 0 -> 5914 bytes doc/_static/img/icons/icon-144x144.png | Bin 0 -> 6584 bytes doc/_static/img/icons/icon-152x152.png | Bin 0 -> 6603 bytes doc/_static/img/icons/icon-192x192.png | Bin 0 -> 8518 bytes doc/_static/img/icons/icon-384x384.png | Bin 0 -> 18658 bytes doc/_static/img/icons/icon-512x512.png | Bin 0 -> 28661 bytes doc/_static/img/icons/icon-72x72.png | Bin 0 -> 3535 bytes doc/_static/img/icons/icon-96x96.png | Bin 0 -> 4556 bytes doc/manifest.json | 53 +++++++++++++++++++++++++ 9 files changed, 53 insertions(+) create mode 100644 doc/_static/img/icons/icon-128x128.png create mode 100644 doc/_static/img/icons/icon-144x144.png create mode 100644 doc/_static/img/icons/icon-152x152.png create mode 100644 doc/_static/img/icons/icon-192x192.png create mode 100644 doc/_static/img/icons/icon-384x384.png create mode 100644 doc/_static/img/icons/icon-512x512.png create mode 100644 doc/_static/img/icons/icon-72x72.png create mode 100644 doc/_static/img/icons/icon-96x96.png create mode 100644 doc/manifest.json diff --git a/doc/_static/img/icons/icon-128x128.png b/doc/_static/img/icons/icon-128x128.png new file mode 100644 index 0000000000000000000000000000000000000000..146030d28a6ab1630f6701793ca31e68a9dac898 GIT binary patch literal 5914 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 literal 0 HcmV?d00001 diff --git a/doc/_static/img/icons/icon-144x144.png b/doc/_static/img/icons/icon-144x144.png new file mode 100644 index 0000000000000000000000000000000000000000..346959d8c73d92bac6c8b0ad54185b7f42af5b83 GIT binary patch literal 6584 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 JPDHLkV1gg6i1Ppd literal 0 HcmV?d00001 diff --git a/doc/_static/img/icons/icon-192x192.png b/doc/_static/img/icons/icon-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..5ceb62398830ca1ab4dec06951c4ea3678396c9c GIT binary patch literal 8518 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 V-VPY|z?*%8CkpD1OXN)g{|CqC9Z~=Q literal 0 HcmV?d00001 diff --git a/doc/_static/img/icons/icon-384x384.png b/doc/_static/img/icons/icon-384x384.png new file mode 100644 index 0000000000000000000000000000000000000000..90164025a73080b18b6dbc8474fc269c1d21e1b3 GIT binary patch literal 18658 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 literal 0 HcmV?d00001 diff --git a/doc/_static/img/icons/icon-96x96.png b/doc/_static/img/icons/icon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..1f9c36a88fe44a2bd45fa78c9b3d2c5ed4b3669f GIT binary patch literal 4556 zcmV;-5i{;;}7tA!eHdOrQ!)LI5p0*+@uc zA4ru&0;jD=6^KB!ZdKN>xS`cTfDjfH2qelPOR+s|H53TjBoPi!wKc7P8Xz$9-QN4n zdoyod-Wz6lnVF24bAIQ0nR)Nay!-p^^4)vi#0~oGx*l=D3y-HD{x)bc>8gv+;NO8+i?t{1o&N!GS_(QJmO_U zJjom1?;#5QHpE9m=e-L#vuhvwI-Eq``$LX~Ci-uHer5n64XqJ1`vu+LOR3h46+joxM z+Z>lYt7?rvz|AN%J+VRncznT8=Zak?>Aj1j0S5=qse$ZS>m1q9EBqKCz@rJ3I~!r? z_M?}GfCGc)Y@!?NCLoL?EJp%x{K|`fC>DOq5m4DpKsN#11jI4{=-@OHn3i*W=QMzX zw?qL;6`=HaCz0^oAbH|&!Cjv>BR9Ocjo~+?!DUf{tI!!kLp_m|%1QOhz_MN$< z3Gxy?l0{~V9JpK?@o)CV-ZOMg_z7?eAMJh42kq~e~Tj#WPEWu%Rvno_~_cJXH^JTcfj6Cs*N|Q2?5eMC@-XB|CLM* zX^STf(s4h6BirwR1k^WNXs!8(uPmm8@Z}_sIYINrb3?1@8eQf_2rVgV>V3ZYMsQ;|36MrR zwAr#PuH})=t%R>&lGrpPZOV%JYZtz};v#@~6Y&0#3$4|MKkXC~By*yCq#O~2r!*?B z`ewB`!$W{qsEMY>^wM^>!}Uk_GEHFRNWkRf_1Dg;5r7)7Q6NBT4RDzdS*BDVV^c>P zf2;XAp8&5-7RK`W7v2j>_!8WjfFm9Pv=YAB&RDsS`@IxlR zm+<^G9qzf*qZ@yT>|6rG)lb6De|n4C=7%8spa}3)Xi+1`7cm-YQg}?z(An!@%JTXS z5ls-n510VCpv6>xG(NAE30Z!QoR}I7(i>qTfL8y=c{Nb}vL?d!+X;(Nkmw*uSX5AX z8#hN3$5T>_;&o|P#40?d_g=+_hR&gl6tAcWX^2g#L`1m;WX*AgL=hLDDzp=v}JeLxiquh9C+?2qvM+zDT+Z#aMPt-YtOpw0ej?SA{E z&Ons_)PhUv@c(T8`?GMjpplWUTo4W-=ye0p z9!}s_Xczu(PzY-_l$`P}=2mwQ{;iU6!pNq-vWKc_Y{4V;62mz!4qvmf?4M(M`pG=kE z58HTAK8JTj$O!OgfD>+f`9HXRz7?)tL|ljv#Q*)TR%rhm@tF_&yEP&vh(c1^qFO~0 zB(wYQaAh3~ew>ph5U^H_fHpX-{}+6G_jPDU`xY8>ZIMGt8yx9_->0Mv?B+H&V?>zb zxQ_Tw*a;BR6LK@7Yhq~hy?%>+ut254yG?ryAe*j#VH-?ZUJs9~atV$D z1uY7j@;*uqS8et4$Y)s{pWB}YG@@Svh=?>4wq9KQp%LJY<n z!B_4_XhG!KlR0y(Uk_+RJprOGI5AqP1)*yInFlg4qDfH|wx9WaHS^P@HNeXZWqJI7 zRwih|;#w~PLMXVqub;A_o;&TVjuBQD)&O+GN7A)-!evW$dgb;*5k9y7I9J({oqYam zKcAB98UzTMaJpCwNi`y1i8cgC^FBrlQx(il*Cs&p11EDuGo-x<(n15s0T(~_uJ}k& zY(zm)0vd;ljyO6A;Av-!tV9B0O9RjmA0Hb11mxmIE~ZS7G!iL$hQW_!#2%x$^p*9;aB@GCL1g}(drD7^N22v4y zP~fFn=Yn>1tZwl!aIKJ%NJV>DHLUBWqyKrIv^1$rI@JHErdAERRYi=hqn@GI(tu>C{nyR}WeFV*L6Q|gk?ss!;H2DB3L5}IT`Xfnz z*JG>CdOx-*PfJJ(_0)0ac|IVD3E-<=C$yntO2bZ%@FT4OYFgmy838gy7)`Nkmk)_f z0;CPO-1Hdat3L7sNS}}yiTeg$opSP4^@&S%x=hf_DAWMA@C6MxRU~i5^$0&w1V}e; zRceUm7OJ7F?0n&(vj+LBlR1grtZ$?NTQ>C9On7ZP9?JK*o()geMfRpfCKrla5p!8c2VI_c@nPl%Q=aCGd<lkkANe0y9kg9O3M{5u6i;%$8v;?mPI0PlW*b63CMnI&B2@}ssTp_0<^>+ zMApnTFoajncB1gn+^nb%4lC;!T|c>U*R``>eDy6!y#2-vcJt;9=5#vXrUTk;o+xUC zkM97-$Eob*KT^PjJEV12{Vp;3BT#ix_5JFbOaR3I?B9=-SJ1 z{YFhVo-y1A>B9`p^kI6?3K_!;(C2{?7-1}jhi5(w6Mi)xCjNRsC}3s3SwQnR9)Du) zjrkQ7@Z{VIHjjYE6?5j^tbDfY+MA0E@cMJ3*`g-~z=CNhFn7{DFz4ZTsF<7pPfkgM zc~g^A@#K^weon=t1bz)&OLHuqJpf*RehjRB$q1_#T3lmjV5=9J;LU~lYjL`?jPpr9 z{V^on`BP`ooxMO)+|dgPMhypZNii6U#(}XoWH8hCB1r1p8*cml57>`--Ufu*f7p}# z7{}qm#zJACndRr3AurDiBSsWMX66X!(S0iYEU?(Pjk2jzgxVg+NV9)*ZP&>J}DI1os$>wj-LB=(MX z|DWW068JbSzW~WLyU&$^uCpM4R{Y#*CPKWy-$x+Ps@Dhm-MwL81fw2Fwv;;JQv2Rl zr%T{B;J_QvgalC_G!pX0jO8~O3JHM{AYLQAHc&|CQ2IXd@8!omF_8e1-UPq2mV6zT z)-S6pHCabD(JtJKrX(cA-vg;h$xxV=&sScst0@=)Is-}?;om(O1mW}J8#ap#CQTT> zH|~!Bak|udkEAB@8@W!JfN*MoWMM=SoM@w+w6|O zDFt+VRV8Q&9oK|-=$oR0(xM`Ca%gk8Jq{c;T;ca+WI%F!0;HlN)=5xQFb=iMhAYgB z_TJKIFdNBVSb1PEX5?rnE-c3XYvu2&Ut{6H$V96RCRz+IYg+zfF8tK=0X=BEf5Pv+ zmzpu~DP3~f-*hQ`nh|y_k*e!!PfFC;`}ZGU*XzyAMx&+0V6Zd?3c9X;dd5-IfKPDM zHxN(*_-H83wNIL$Z$aDI{7@(2VOwdlxg@vgfvo=aeyP3f+4rT{t@?r{e80uVbuH+0 qPfRT<-Z1aiV}3?5A2?)EkN*QQ=p7&hJ-#^r0000 Date: Mon, 10 Aug 2020 18:47:21 -0500 Subject: [PATCH 09/29] docs(README): Remove table --- README.rst | 45 ++++++++++++--------------------------------- 1 file changed, 12 insertions(+), 33 deletions(-) diff --git a/README.rst b/README.rst index dab8d5c9c..6af2d780b 100644 --- a/README.rst +++ b/README.rst @@ -155,7 +155,6 @@ powerful traversal features:: >>> pane.window.session Session($3 foo) -.. _MIT: http://opensource.org/licenses/MIT .. _developing and testing: http://libtmux.git-pull.com/en/latest/developing.html .. _tmuxp: https://tmuxp.git-pull.com/ .. _documentation: https://libtmux.git-pull.com/ @@ -176,39 +175,19 @@ See donation options at https://git-pull.com/support.html. Project details --------------- +- tmux support: 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 +- python support: 2.7, >= 3.3, pypy, pypy3 +- Source: https://github.com/tmux-python/libtmux +- Docs: https://libtmux.git-pull.com +- API: https://libtmux.git-pull.com/en/latest/api.html +- Changelog: https://libtmux.git-pull.com/en/latest/history.html +- Issues: https://github.com/tmux-python/libtmux/issues +- Test Coverage: https://codecov.io/gh/tmux-python/libtmux +- pypi: https://pypi.python.org/pypi/libtmux +- Open Hub: https://www.openhub.net/p/libtmux-python +- License: `MIT`_. -============== ========================================================== -tmux support 1.8, 1.9a, 2.0, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6 -python support 2.7, >= 3.3, pypy, pypy3 -Source https://github.com/tmux-python/libtmux -Docs https://libtmux.git-pull.com -API https://libtmux.git-pull.com/en/latest/api.html -Changelog https://libtmux.git-pull.com/en/latest/history.html -Issues https://github.com/tmux-python/libtmux/issues -Test Coverage https://codecov.io/gh/tmux-python/libtmux -pypi https://pypi.python.org/pypi/libtmux -Open Hub https://www.openhub.net/p/libtmux-python -License `MIT`_. -git repo .. code-block:: bash - - $ git clone https://github.com/tmux-python/libtmux.git -install stable .. code-block:: bash - - $ pip install libtmux -install dev .. code-block:: bash - - $ git clone https://github.com/tmux-python/libtmux.git libtmux - $ cd ./libtmux - $ virtualenv .venv - $ source .venv/bin/activate - $ pip install -e . - - See the `developing and testing`_ page in the docs for - more. -tests .. code-block:: bash - - $ make test -============== ========================================================== +.. _MIT: http://opensource.org/licenses/MIT .. |pypi| image:: https://img.shields.io/pypi/v/libtmux.svg :alt: Python Package From 790f5b2949574090fde01e75a5648787e08d34ea Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:47:54 -0500 Subject: [PATCH 10/29] docs: Remove references to /en/latest --- README.rst | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 6af2d780b..5e422b9f0 100644 --- a/README.rst +++ b/README.rst @@ -155,11 +155,11 @@ powerful traversal features:: >>> pane.window.session Session($3 foo) -.. _developing and testing: http://libtmux.git-pull.com/en/latest/developing.html +.. _developing and testing: http://libtmux.git-pull.com/developing.html .. _tmuxp: https://tmuxp.git-pull.com/ .. _documentation: https://libtmux.git-pull.com/ -.. _API: https://libtmux.git-pull.com/en/latest/api.html -.. _architectural details: https://libtmux.git-pull.com/en/latest/about.html +.. _API: https://libtmux.git-pull.com/api.html +.. _architectural details: https://libtmux.git-pull.com/about.html .. _formats: http://man.openbsd.org/OpenBSD-5.9/man1/tmux.1#FORMATS .. _target: http://man.openbsd.org/OpenBSD-5.9/man1/tmux.1#COMMANDS @@ -179,8 +179,8 @@ Project details - python support: 2.7, >= 3.3, pypy, pypy3 - Source: https://github.com/tmux-python/libtmux - Docs: https://libtmux.git-pull.com -- API: https://libtmux.git-pull.com/en/latest/api.html -- Changelog: https://libtmux.git-pull.com/en/latest/history.html +- API: https://libtmux.git-pull.com/api.html +- Changelog: https://libtmux.git-pull.com/history.html - Issues: https://github.com/tmux-python/libtmux/issues - Test Coverage: https://codecov.io/gh/tmux-python/libtmux - pypi: https://pypi.python.org/pypi/libtmux From c372db4e0c150c5f1cfa68ebcae52f8d43eac3c1 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:50:46 -0500 Subject: [PATCH 11/29] build(pyproject): Add classifiers --- pyproject.toml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index 3f8577830..9e92ec3f3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,23 @@ version = "0.8.2" description = "scripting library / orm for tmux" license = "MIT" authors = ["Tony Narlock "] +classifiers = [ + 'Development Status :: 5 - Production/Stable', + "License :: OSI Approved :: MIT License", + "Operating System :: POSIX", + "Operating System :: MacOS :: MacOS X", + 'Environment :: Web Environment', + 'Intended Audience :: Developers', + 'Programming Language :: Python', + 'Programming Language :: Python :: 2.7', + 'Programming Language :: Python :: 3.5', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: Implementation :: PyPy', + "Topic :: Utilities", + "Topic :: System :: Shells" +] [tool.poetry.dependencies] python = "~2.7 || ^3.5" From 52b25a393d1ad040e28d3b6798a0549cf79a6081 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:51:08 -0500 Subject: [PATCH 12/29] build(setup.py): Fix quotes --- setup.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/setup.py b/setup.py index 0bd9633f3..6cf49fbf0 100644 --- a/setup.py +++ b/setup.py @@ -46,18 +46,18 @@ zip_safe=False, keywords=about['__title__'], classifiers=[ - 'Development Status :: 5 - Production/Stable', + "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: MIT License", "Operating System :: POSIX", "Operating System :: MacOS :: MacOS X", - 'Environment :: Web Environment', - 'Intended Audience :: Developers', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: Implementation :: PyPy', + "Environment :: Web Environment", + "Intended Audience :: Developers", + "Programming Language :: Python", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Utilities", "Topic :: System :: Shells", ], From d2e5dae81d7deb25a5878ccbee553a185ec82192 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:55:39 -0500 Subject: [PATCH 13/29] build(pyproject): Normalize quotes --- pyproject.toml | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 9e92ec3f3..bb3959891 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,19 +8,19 @@ description = "scripting library / orm for tmux" license = "MIT" authors = ["Tony Narlock "] classifiers = [ - 'Development Status :: 5 - Production/Stable', + "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: MIT License", "Operating System :: POSIX", "Operating System :: MacOS :: MacOS X", - 'Environment :: Web Environment', - 'Intended Audience :: Developers', - 'Programming Language :: Python', - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Programming Language :: Python :: Implementation :: PyPy', + "Environment :: Web Environment", + "Intended Audience :: Developers", + "Programming Language :: Python", + "Programming Language :: Python :: 2.7", + "Programming Language :: Python :: 3.5", + "Programming Language :: Python :: 3.6", + "Programming Language :: Python :: 3.7", + "Programming Language :: Python :: 3.8", + "Programming Language :: Python :: Implementation :: PyPy", "Topic :: Utilities", "Topic :: System :: Shells" ] From fd4304129bb4f730c0d55c0c0436e6915c8b51e7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:56:08 -0500 Subject: [PATCH 14/29] build(pyproject): More metadata --- pyproject.toml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pyproject.toml b/pyproject.toml index bb3959891..a4124cdcb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,6 +25,15 @@ classifiers = [ "Topic :: System :: Shells" ] +keywords = ["tmux", "session manager", "terminal", "ncurses"] +homepage = "http://github.com/tmux-python/libvcs/" +readme = "README.rst" + +[tool.poetry.urls] +"Bug Tracker" = "https://github.com/tmux-python/libvcs/issues" +Documentation = "https://libvcs.git-pull.com" +Repository = "https://github.com/tmux-python/libvcs" + [tool.poetry.dependencies] python = "~2.7 || ^3.5" From fb43ab903ea6ff7d46b7753b7eca87eaf16fa0e5 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 18:59:30 -0500 Subject: [PATCH 15/29] build(pyproject): Typo fix --- pyproject.toml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index a4124cdcb..818d6d395 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,13 +26,13 @@ classifiers = [ ] keywords = ["tmux", "session manager", "terminal", "ncurses"] -homepage = "http://github.com/tmux-python/libvcs/" +homepage = "http://github.com/tmux-python/libtmux/" readme = "README.rst" [tool.poetry.urls] -"Bug Tracker" = "https://github.com/tmux-python/libvcs/issues" -Documentation = "https://libvcs.git-pull.com" -Repository = "https://github.com/tmux-python/libvcs" +"Bug Tracker" = "https://github.com/tmux-python/libtmux/issues" +Documentation = "https://libtmux.git-pull.com" +Repository = "https://github.com/tmux-python/libtmux" [tool.poetry.dependencies] python = "~2.7 || ^3.5" From a681b6ad5b46f71d5686f33c62d7a27443419cf3 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:02:17 -0500 Subject: [PATCH 16/29] refactor(docs): Move doc/ -> docs/ --- .gitignore | 7 ++----- .tmuxp.yaml | 2 +- MANIFEST.in | 2 +- {doc => docs}/Makefile | 0 {doc => docs}/_static/favicon.ico | Bin {doc => docs}/_static/img/books/amazon-logo.png | Bin {doc => docs}/_static/img/books/ibooks-logo.png | Bin {doc => docs}/_static/img/icons/icon-128x128.png | Bin {doc => docs}/_static/img/icons/icon-144x144.png | Bin {doc => docs}/_static/img/icons/icon-152x152.png | Bin {doc => docs}/_static/img/icons/icon-192x192.png | Bin {doc => docs}/_static/img/icons/icon-384x384.png | Bin {doc => docs}/_static/img/icons/icon-512x512.png | Bin {doc => docs}/_static/img/icons/icon-72x72.png | Bin {doc => docs}/_static/img/icons/icon-96x96.png | Bin {doc => docs}/_static/img/libtmux.svg | 0 {doc => docs}/_templates/book.html | 0 {doc => docs}/about.rst | 0 {doc => docs}/api.rst | 0 {doc => docs}/conf.py | 0 {doc => docs}/developing.rst | 0 {doc => docs}/glossary.rst | 0 {doc => docs}/history.rst | 0 {doc => docs}/index.rst | 0 {doc => docs}/manifest.json | 0 {doc => docs}/panes.rst | 0 {doc => docs}/properties.rst | 0 {doc => docs}/quickstart.rst | 0 {doc => docs}/requirements.txt | 0 {doc => docs}/servers.rst | 0 {doc => docs}/sessions.rst | 0 {doc => docs}/traversal.rst | 0 {doc => docs}/windows.rst | 0 33 files changed, 4 insertions(+), 7 deletions(-) rename {doc => docs}/Makefile (100%) rename {doc => docs}/_static/favicon.ico (100%) rename {doc => docs}/_static/img/books/amazon-logo.png (100%) rename {doc => docs}/_static/img/books/ibooks-logo.png (100%) rename {doc => docs}/_static/img/icons/icon-128x128.png (100%) rename {doc => docs}/_static/img/icons/icon-144x144.png (100%) rename {doc => docs}/_static/img/icons/icon-152x152.png (100%) rename {doc => docs}/_static/img/icons/icon-192x192.png (100%) rename {doc => docs}/_static/img/icons/icon-384x384.png (100%) rename {doc => docs}/_static/img/icons/icon-512x512.png (100%) rename {doc => docs}/_static/img/icons/icon-72x72.png (100%) rename {doc => docs}/_static/img/icons/icon-96x96.png (100%) rename {doc => docs}/_static/img/libtmux.svg (100%) rename {doc => docs}/_templates/book.html (100%) rename {doc => docs}/about.rst (100%) rename {doc => docs}/api.rst (100%) rename {doc => docs}/conf.py (100%) rename {doc => docs}/developing.rst (100%) rename {doc => docs}/glossary.rst (100%) rename {doc => docs}/history.rst (100%) rename {doc => docs}/index.rst (100%) rename {doc => docs}/manifest.json (100%) rename {doc => docs}/panes.rst (100%) rename {doc => docs}/properties.rst (100%) rename {doc => docs}/quickstart.rst (100%) rename {doc => docs}/requirements.txt (100%) rename {doc => docs}/servers.rst (100%) rename {doc => docs}/sessions.rst (100%) rename {doc => docs}/traversal.rst (100%) rename {doc => docs}/windows.rst (100%) diff --git a/.gitignore b/.gitignore index 95e0deb77..0a612bb3c 100644 --- a/.gitignore +++ b/.gitignore @@ -53,7 +53,7 @@ coverage.xml *.mo *.pot -# Django stuff: +# Django stuff *.log # Sphinx documentation @@ -62,13 +62,10 @@ docs/_build/ # PyBuilder target/ -#Ipython Notebook +# ipython Notebook .ipynb_checkpoints # editors .idea .ropeproject *.swp - -# docs -doc/_build/ diff --git a/.tmuxp.yaml b/.tmuxp.yaml index 081fd2fdb..cc381ec79 100644 --- a/.tmuxp.yaml +++ b/.tmuxp.yaml @@ -17,7 +17,7 @@ windows: layout: main-horizontal options: main-pane-height: 35 - start_directory: doc/ + start_directory: docs/ panes: - focus: true - pane diff --git a/MANIFEST.in b/MANIFEST.in index 999b0f0f9..e12120eac 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,3 @@ include README.rst LICENSE CHANGES pyproject.toml .tmuxp.yaml include requirements/*.txt -recursive-include doc *.rst +recursive-include docs *.rst diff --git a/doc/Makefile b/docs/Makefile similarity index 100% rename from doc/Makefile rename to docs/Makefile diff --git a/doc/_static/favicon.ico b/docs/_static/favicon.ico similarity index 100% rename from doc/_static/favicon.ico rename to docs/_static/favicon.ico diff --git a/doc/_static/img/books/amazon-logo.png b/docs/_static/img/books/amazon-logo.png similarity index 100% rename from doc/_static/img/books/amazon-logo.png rename to docs/_static/img/books/amazon-logo.png diff --git a/doc/_static/img/books/ibooks-logo.png b/docs/_static/img/books/ibooks-logo.png similarity index 100% rename from doc/_static/img/books/ibooks-logo.png rename to docs/_static/img/books/ibooks-logo.png diff --git a/doc/_static/img/icons/icon-128x128.png b/docs/_static/img/icons/icon-128x128.png similarity index 100% rename from doc/_static/img/icons/icon-128x128.png rename to docs/_static/img/icons/icon-128x128.png diff --git a/doc/_static/img/icons/icon-144x144.png b/docs/_static/img/icons/icon-144x144.png similarity index 100% rename from doc/_static/img/icons/icon-144x144.png rename to docs/_static/img/icons/icon-144x144.png diff --git a/doc/_static/img/icons/icon-152x152.png b/docs/_static/img/icons/icon-152x152.png similarity index 100% rename from doc/_static/img/icons/icon-152x152.png rename to docs/_static/img/icons/icon-152x152.png diff --git a/doc/_static/img/icons/icon-192x192.png b/docs/_static/img/icons/icon-192x192.png similarity index 100% rename from doc/_static/img/icons/icon-192x192.png rename to docs/_static/img/icons/icon-192x192.png diff --git a/doc/_static/img/icons/icon-384x384.png b/docs/_static/img/icons/icon-384x384.png similarity index 100% rename from doc/_static/img/icons/icon-384x384.png rename to docs/_static/img/icons/icon-384x384.png diff --git a/doc/_static/img/icons/icon-512x512.png b/docs/_static/img/icons/icon-512x512.png similarity index 100% rename from doc/_static/img/icons/icon-512x512.png rename to docs/_static/img/icons/icon-512x512.png diff --git a/doc/_static/img/icons/icon-72x72.png b/docs/_static/img/icons/icon-72x72.png similarity index 100% rename from doc/_static/img/icons/icon-72x72.png rename to docs/_static/img/icons/icon-72x72.png diff --git a/doc/_static/img/icons/icon-96x96.png b/docs/_static/img/icons/icon-96x96.png similarity index 100% rename from doc/_static/img/icons/icon-96x96.png rename to docs/_static/img/icons/icon-96x96.png diff --git a/doc/_static/img/libtmux.svg b/docs/_static/img/libtmux.svg similarity index 100% rename from doc/_static/img/libtmux.svg rename to docs/_static/img/libtmux.svg diff --git a/doc/_templates/book.html b/docs/_templates/book.html similarity index 100% rename from doc/_templates/book.html rename to docs/_templates/book.html diff --git a/doc/about.rst b/docs/about.rst similarity index 100% rename from doc/about.rst rename to docs/about.rst diff --git a/doc/api.rst b/docs/api.rst similarity index 100% rename from doc/api.rst rename to docs/api.rst diff --git a/doc/conf.py b/docs/conf.py similarity index 100% rename from doc/conf.py rename to docs/conf.py diff --git a/doc/developing.rst b/docs/developing.rst similarity index 100% rename from doc/developing.rst rename to docs/developing.rst diff --git a/doc/glossary.rst b/docs/glossary.rst similarity index 100% rename from doc/glossary.rst rename to docs/glossary.rst diff --git a/doc/history.rst b/docs/history.rst similarity index 100% rename from doc/history.rst rename to docs/history.rst diff --git a/doc/index.rst b/docs/index.rst similarity index 100% rename from doc/index.rst rename to docs/index.rst diff --git a/doc/manifest.json b/docs/manifest.json similarity index 100% rename from doc/manifest.json rename to docs/manifest.json diff --git a/doc/panes.rst b/docs/panes.rst similarity index 100% rename from doc/panes.rst rename to docs/panes.rst diff --git a/doc/properties.rst b/docs/properties.rst similarity index 100% rename from doc/properties.rst rename to docs/properties.rst diff --git a/doc/quickstart.rst b/docs/quickstart.rst similarity index 100% rename from doc/quickstart.rst rename to docs/quickstart.rst diff --git a/doc/requirements.txt b/docs/requirements.txt similarity index 100% rename from doc/requirements.txt rename to docs/requirements.txt diff --git a/doc/servers.rst b/docs/servers.rst similarity index 100% rename from doc/servers.rst rename to docs/servers.rst diff --git a/doc/sessions.rst b/docs/sessions.rst similarity index 100% rename from doc/sessions.rst rename to docs/sessions.rst diff --git a/doc/traversal.rst b/docs/traversal.rst similarity index 100% rename from doc/traversal.rst rename to docs/traversal.rst diff --git a/doc/windows.rst b/docs/windows.rst similarity index 100% rename from doc/windows.rst rename to docs/windows.rst From 96a04d99b416393f4d7574a2dea2a37d10009a94 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:05:12 -0500 Subject: [PATCH 17/29] build(docs): Update config to latest and greatest --- docs/conf.py | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 5169e3ec4..d855c3dcc 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -5,6 +5,7 @@ from os.path import dirname, relpath import alagitpull +from recommonmark.transform import AutoStructify import libtmux # NOQA from libtmux import test # NOQA @@ -30,13 +31,30 @@ 'sphinx.ext.napoleon', 'alagitpull', 'sphinx_issues', + 'recommonmark', ] +# app setup hook +def setup(app): + app.add_config_value( + 'recommonmark_config', + { + #'url_resolver': lambda url: github_doc_root + url, + 'enable_auto_toc_tree': True, + 'auto_toc_tree_section': 'Contents', + 'auto_code_block': True, + 'enable_eval_rst': True, + }, + True, + ) + app.add_transform(AutoStructify) + + issues_github_path = about['__github__'].replace('https://github.com/', '') templates_path = ['_templates'] -source_suffix = '.rst' +source_suffix = {'.rst': 'restructuredtext', '.md': 'markdown'} master_doc = 'index' @@ -61,6 +79,12 @@ 'github_banner': True, 'projects': alagitpull.projects, 'project_name': about['__title__'], + 'project_title': about['__title__'], + 'project_description': about['__description__'], + 'project_url': about['__docs__'], + 'show_meta_manifest_tag': True, + 'show_meta_og_tags': True, + 'show_meta_app_icon_tags': True, } alagitpull_internal_hosts = ['libtmux.git-pull.com', '0.0.0.0'] alagitpull_external_hosts_new_window = True @@ -78,6 +102,7 @@ html_theme_path = ['_themes'] html_static_path = ['_static'] +html_extra_path = ['manifest.json'] htmlhelp_basename = '%sdoc' % about['__title__'] From a4c8f0e44dd82f444e97be93cac3019e7d557fc7 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:05:33 -0500 Subject: [PATCH 18/29] build(docs): Update SPHINXBUILD to use poetry run --- docs/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/Makefile b/docs/Makefile index 05286656f..afd449c23 100644 --- a/docs/Makefile +++ b/docs/Makefile @@ -6,7 +6,7 @@ HTTP_PORT = 8023 # You can set these variables from the command line. SPHINXOPTS = -SPHINXBUILD = sphinx-build +SPHINXBUILD = poetry run sphinx-build PAPER = BUILDDIR = _build From 93cfe7f0834a03780c04d3389735849292fea4fb Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:07:05 -0500 Subject: [PATCH 19/29] docs(developing): Move to markdown --- docs/developing.md | 60 ++++++++++++++++ docs/developing.rst | 165 -------------------------------------------- 2 files changed, 60 insertions(+), 165 deletions(-) create mode 100644 docs/developing.md delete mode 100644 docs/developing.rst diff --git a/docs/developing.md b/docs/developing.md new file mode 100644 index 000000000..75a6f5951 --- /dev/null +++ b/docs/developing.md @@ -0,0 +1,60 @@ +# Development + +[poetry] is a required package to develop. + +`git clone https://github.com/tmux-python/libtmux.git` + +`cd libtmux` + +`poetry install -E "docs test coverage lint format"` + +Makefile commands prefixed with `watch_` will watch files and rerun. + +## Tests + +`poetry run py.test` + +Helpers: `make test` +Rerun tests on file change: `make watch_test` (requires [entr(1)]) + +## Documentation + +Default preview server: http://localhost:8023 + +`cd docs/` and `make html` to build. `make serve` to start http server. + +Helpers: +`make build_docs`, `make serve_docs` + +Rebuild docs on file change: `make watch_docs` (requires [entr(1)]) + +Rebuild docs and run server via one terminal: `make dev_docs` (requires above, and a +`make(1)` with `-J` support, e.g. GNU Make) + +## Formatting / Linting + +The project uses [black] and [isort] (one after the other) and runs [flake8] via +CI. See the configuration in `pyproject.toml` and `setup.cfg`: + +`make black isort`: Run `black` first, then `isort` to handle import nuances +`make flake8`, to watch (requires `entr(1)`): `make watch_flake8` + +## Releasing + +As of 0.10, [poetry] handles virtualenv creation, package requirements, versioning, +building, and publishing. Therefore there is no setup.py or requirements files. + +Update `__version__` in `__about__.py` and `pyproject.toml`:: + + git commit -m 'build(libtmux): Tag v0.1.1' + git tag v0.1.1 + git push + git push --tags + poetry build + poetry deploy + +[poetry]: https://python-poetry.org/ +[entr(1)]: http://eradman.com/entrproject/ +[black]: https://github.com/psf/black +[isort]: https://pypi.org/project/isort/ +[flake8]: https://flake8.pycqa.org/ diff --git a/docs/developing.rst b/docs/developing.rst deleted file mode 100644 index eb0261630..000000000 --- a/docs/developing.rst +++ /dev/null @@ -1,165 +0,0 @@ - _developing: - -====================== -Developing and Testing -====================== - -.. todo:: - link to sliderepl or ipython notebook slides - -Our tests are inside ``tests/``. Tests are implemented using -`pytest`_. - -``make test`` will create a tmux server on a separate ``socket_name`` -using ``$ tmux -L test_case``. - -.. _pytest: http://pytest.org/ - -.. _install_dev_env: - -Install the latest code from git --------------------------------- - -To begin developing, check out the code from github: - -.. code-block:: bash - - $ git clone git@github.com:tmux-python/libtmux.git - $ cd libtmux - -Now create a virtualenv, if you don't know how to, you can create a -virtualenv with: - -.. code-block:: bash - - $ virtualenv .venv - -Then activate it to your current tty / terminal session with: - -.. code-block:: bash - - $ source .venv/bin/activate - -Good! Now let's run this: - -.. code-block:: bash - - $ pip install -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. - -.. code-block:: bash - - $ libtmux - -Test Runner ------------ - -As you seen above, the ``libtmux`` 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 -~~~~~~~~~~~~~~~~~~~ - -.. code-block:: bash - - $ py.test tests/test_common.py - -will test the ``tests/test_common.py`` tests. - -.. code-block:: bash - - $ py.test tests/test_common.py::test_ignores_letter_versions - -tests ``test_ignore_letter_versions()`` ``tests/test_common.py``. - -Multiple can be separated by spaces: - -.. code-block:: bash - - $ py.test tests/test_{window,pane}.py \ - tests/test_common.py::test_ignores_letter_versions - -.. _test_builder_visually: - -Visual testing -~~~~~~~~~~~~~~ - -You can watch tmux testsuite build sessions visually by keeping a client -open in a separate terminal. - -Create two terminals: - - - Terminal 1: ``$ tmux -L test_case`` - - Terminal 2: ``$ cd`` into the libtmux project and into the - ``virtualenv`` if you are using one, see details on installing the dev - version of libtmux above. Then: - - .. code-block:: bash - - $ py.test tests/test_workspacebuilder.py - -Terminal 1 should have flickered and built the session before your eyes. -libtmux hides this building from normal users. - -Run tests on save ------------------ - -You can re-run tests automatically on file edit. - -.. note:: - This requires ``entr(1)``. - -Install `entr`_. Packages are available available on most Linux and BSD -variants, including Debian, Ubuntu, FreeBSD, OS X. - -To run all tests upon editing any ``.py`` file: - -.. code-block:: bash - - $ make watch_test - -.. _entr: http://entrproject.org/ - -Rebuild the documentation when an ``.rst`` file is edited: - -.. code-block:: bash - - $ cd doc - $ make watch - -.. _libtmux developer config: - -.. _gh_actions: - -GH Actions -~~~~~~~~~~ - -libtmux uses `github actions`_ for continuous integration / automatic unit -testing. - -libtmux is tested against tmux 1.8 and the latest git source. Interpretters -tested are pypy, pypy3, 2.7 and >= 3.3. The actions use this -`.github/workflows/libtmux-ci.yml`_ configuration: - -.. literalinclude:: ../.github/workflows/libtmux-ci.yml - :language: yaml - -.. _github actions: https://github.com/features/actions -.. _.github/workflows/libtmux-ci.yml: https://github.com/tmux-python/libtmux/blob/master/.github/workflows/libtmux-ci.yml -.. _issue on github: https://github.com/tmux-python/libtmux/issues From d49307a0a0b626838c794888e06c00c595c4b612 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:12:16 -0500 Subject: [PATCH 20/29] build(docs): Add layout --- docs/_templates/layout.html | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 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 000000000..19a94fe47 --- /dev/null +++ b/docs/_templates/layout.html @@ -0,0 +1,45 @@ +{% extends "!layout.html" %} +{%- block extrahead %} + {{ super() }} + {%- if theme_show_meta_manifest_tag == true %} + + {% endif -%} + {%- if theme_show_meta_og_tags == true %} + + + + + + + + + + + + + + + + {% endif -%} + {%- if theme_show_meta_app_icon_tags == true %} + + + + + + + + + + + + + + + + + + + + {% endif -%} +{% endblock %} From 42af19dfa1690e7f2b24ffacdbc6a0577f6eef50 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:18:15 -0500 Subject: [PATCH 21/29] build(README): Update button to publish docs --- README.rst | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/README.rst b/README.rst index 5e422b9f0..33306af3e 100644 --- a/README.rst +++ b/README.rst @@ -193,6 +193,10 @@ Project details :alt: Python Package :target: http://badge.fury.io/py/libtmux +.. |docs| image:: https://github.com/tmux-python/libtmux/workflows/Publish%20Docs/badge.svg + :alt: Docs + :target: https://github.com/tmux-python/libtmux/actions?query=workflow%3A"Publish+Docs" + .. |build-status| image:: https://github.com/tmux-python/libtmux/workflows/.github/workflows/libtmux-ci.yml/badge.svg :alt: Build Status :target: https://github.com/tmux-python/libtmux/actions @@ -203,8 +207,3 @@ Project details .. |license| image:: https://img.shields.io/github/license/tmux-python/libtmux.svg :alt: License - -.. |docs| image:: https://readthedocs.org/projects/libtmux/badge/?version=latest - :alt: Documentation Status - :scale: 100% - :target: https://readthedocs.org/projects/libtmux/ From 043d32fa24d6e1ac1eced22de6fc440c8554a63f Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:22:16 -0500 Subject: [PATCH 22/29] docs(index): Fix inclusion of buttons from README, table of contents heading --- docs/index.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index 3028bf2fe..1404b4e18 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -5,11 +5,10 @@ libtmux ####### .. include:: ../README.rst - :start-line: 4 - :end-before: Project details - -Explore: + :start-line: 2 +Table of Contents +----------------- .. toctree:: :maxdepth: 2 From da76fbf96674693bf9a242cc95f8cef1a8791122 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:34:04 -0500 Subject: [PATCH 23/29] build(publish-docs): Add docs github action --- .github/workflows/publish-docs.yml | 97 ++++++++++++++++++++++++++++++ 1 file changed, 97 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 000000000..572b9b882 --- /dev/null +++ b/.github/workflows/publish-docs.yml @@ -0,0 +1,97 @@ +name: Publish Docs + +on: [push] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [ '3.x' ] + steps: + - uses: actions/checkout@v1 + - name: Configure git + run: | + git config --global user.name 'travis-ci' + git config --global user.email 'travis@nowhere.edu' + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + + - name: Get full Python version + id: full-python-version + shell: bash + run: echo ::set-output name=version::$(python -c "import sys; print('-'.join(str(v) for v in sys.version_info))") + + - name: Install poetry + run: | + curl -O -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py + python get-poetry.py -y + echo "::set-env name=PATH::$HOME/.poetry/bin:$PATH" + rm get-poetry.py + + - name: Get poetry cache paths from config + run: | + echo ::set-env name=poetry_cache_dir::$(poetry config --list | sed -n 's/.*cache-dir = //p' | sed -e 's/^"//' -e 's/"$//') + echo ::set-env name=poetry_virtualenvs_path::$(poetry config --list | sed -n 's/.*virtualenvs.path = .* # //p' | sed -e 's/^"//' -e 's/"$//') + + - name: Configure poetry + shell: bash + run: poetry config virtualenvs.in-project true + + - name: Set up cache + uses: actions/cache@v2 + id: cache + with: + path: | + .venv + {{ env.poetry_cache_dir }} + {{ env.poetry_virtualenvs_path }} + key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} + + - name: Ensure cache is healthy + if: steps.cache.outputs.cache-hit == 'true' + shell: bash + run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv + + - name: Upgrade pip + shell: bash + run: poetry run python -m pip install pip -U + + - name: Install dependencies [w/ docs] + run: poetry install --extras "docs lint" + + - name: Build documentation + run: | + pushd docs; make SPHINXBUILD='poetry run sphinx-build' html; popd + + - name: Push documentation to S3 + uses: jakejarvis/s3-sync-action@master + with: + args: --acl public-read --follow-symlinks --delete + env: + AWS_S3_BUCKET: ${{ secrets.AWS_S3_BUCKET }} + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + AWS_REGION: 'us-west-1' # optional: defaults to us-east-1 + SOURCE_DIR: 'docs/_build/html' # optional: defaults to entire repository + + - name: Generate list of changed files for CloudFront to invalidate + run: | + pushd docs/_build/html; FILES=$(find . -name \* -print | grep html | cut -c2- | sort | uniq | tr '\n' ' '); popd + for file in $FILES; do + echo $file + # add bare directory to list of updated paths when we see index.html + [[ "$file" == *"/index.html" ]] && echo $file | sed -e 's/\/index.html$/\//' + done | sort | uniq | tr '\n' ' ' > .updated_files + + - name: Invalidate on CloudFront + uses: chetan/invalidate-cloudfront-action@master + env: + DISTRIBUTION: ${{ secrets.AWS_CLOUDFRONT_DISTRIBUTION }} + AWS_REGION: 'us-east-1' + AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} + AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} + PATHS_FROM: .updated_files From 8853449f33767d2e666e92671d6068a656c44bd2 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:34:26 -0500 Subject: [PATCH 24/29] build(tests): Rename CI to tests --- .github/workflows/{libtmux-ci.yml => tests.yml} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename .github/workflows/{libtmux-ci.yml => tests.yml} (99%) diff --git a/.github/workflows/libtmux-ci.yml b/.github/workflows/tests.yml similarity index 99% rename from .github/workflows/libtmux-ci.yml rename to .github/workflows/tests.yml index 396d4f874..af22160f4 100644 --- a/.github/workflows/libtmux-ci.yml +++ b/.github/workflows/tests.yml @@ -1,4 +1,4 @@ -name: libtmux CI +name: tests on: [push, pull_request] From 9a69819292f451de5d8abac5688daf8ec986a79e Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 19:36:20 -0500 Subject: [PATCH 25/29] docs(README): Update buttons --- README.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 33306af3e..373ee4950 100644 --- a/README.rst +++ b/README.rst @@ -197,9 +197,9 @@ Project details :alt: Docs :target: https://github.com/tmux-python/libtmux/actions?query=workflow%3A"Publish+Docs" -.. |build-status| image:: https://github.com/tmux-python/libtmux/workflows/.github/workflows/libtmux-ci.yml/badge.svg +.. |build-status| image:: https://github.com/tmux-python/libtmux/workflows/tests/badge.svg :alt: Build Status - :target: https://github.com/tmux-python/libtmux/actions + :target: https://github.com/tmux-python/tmux-python/actions?query=workflow%3A"tests" .. |coverage| image:: https://codecov.io/gh/tmux-python/libtmux/branch/master/graph/badge.svg :alt: Code Coverage From f030bd7be5493819b350f76e64670e3c4ac7e194 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 20:59:11 -0500 Subject: [PATCH 26/29] docs: Template fixes --- docs/_templates/layout.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/_templates/layout.html b/docs/_templates/layout.html index 19a94fe47..681b3deec 100644 --- a/docs/_templates/layout.html +++ b/docs/_templates/layout.html @@ -33,10 +33,10 @@ - + - + From e3b1eb667c837025e5052d7a03d23c6191714a52 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Mon, 10 Aug 2020 21:07:16 -0500 Subject: [PATCH 27/29] build(Makefile): Update tasks --- Makefile | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index e46cf34fd..efd45209b 100644 --- a/Makefile +++ b/Makefile @@ -10,25 +10,31 @@ entr_warn: @echo "----------------------------------------------------------" isort: - isort `${PY_FILES}` + poetry run isort `${PY_FILES}` black: - black `${PY_FILES}` --skip-string-normalization + poetry run black `${PY_FILES}` test: - py.test $(test) + poetry run py.test $(test) watch_test: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) test; else $(MAKE) test entr_warn; fi build_docs: - cd doc && $(MAKE) html + $(MAKE) -C docs html watch_docs: - cd doc && $(MAKE) watch_docs + if command -v entr > /dev/null; then ${DOC_FILES} | entr -c $(MAKE) build_docs; else $(MAKE) build_docs entr_warn; fi + +serve_docs: + $(MAKE) -C docs serve + +dev_docs: + $(MAKE) -j watch_docs serve_docs flake8: - flake8 libtmux tests + poetry run flake8 watch_flake8: if command -v entr > /dev/null; then ${PY_FILES} | entr -c $(MAKE) flake8; else $(MAKE) flake8 entr_warn; fi From 8af7905cf40efa57cccd267ca7c4d9352f1a9e6c Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Tue, 11 Aug 2020 05:27:40 -0500 Subject: [PATCH 28/29] build(gitignore): Fixes and updates --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0a612bb3c..0b94471db 100644 --- a/.gitignore +++ b/.gitignore @@ -45,7 +45,7 @@ htmlcov/ .cache nosetests.xml coverage.xml -*,cover +*.cover .hypothesis/ .pytest_cache/ @@ -69,3 +69,4 @@ target/ .idea .ropeproject *.swp +.vim From 9c9f94e90d39b3f4e741ef76d14c9a8888e68999 Mon Sep 17 00:00:00 2001 From: Tony Narlock Date: Sun, 16 Aug 2020 09:54:12 -0500 Subject: [PATCH 29/29] build(pyproject): Update to 0.8.3 after rebase --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 818d6d395..766d34b3f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ skip-string-normalization = true [tool.poetry] name = "libtmux" -version = "0.8.2" +version = "0.8.3" description = "scripting library / orm for tmux" license = "MIT" authors = ["Tony Narlock "]