From faa359db9ad47e0f4152b88aa4b43b9ac35d2b0d Mon Sep 17 00:00:00 2001 From: Matthew Martin Date: Sat, 4 Nov 2023 17:59:11 -0400 Subject: [PATCH] biuld scripts --- .build_history/bandit | 0 .build_history/black | 0 .build_history/flake8 | 0 .build_history/isort | 0 .config/.flake8 | 10 - .config/.license_rules | 93 - .config/.pylintrc | 582 +-- .config/.pylintrc_scripts | 598 +-- .config/.pylintrc_test | 606 +-- .config/.pynt | 31 - .config/reqs.txt | 97 - .config/requirements-dev-tox.txt | 6 - .config/requirements-dev.txt | 34 - .config/requirements.txt | 40 - .config/requirements_for_safety.txt | 150 - .devcontainer/Dockerfile | 5 + .devcontainer/devcontainer.json | 61 + .github/workflows/build.yml | 57 + .github/workflows/codeql-analysis.yml | 67 - .github_onhold/build_push_image.yml | 56 + .gitignore | 4 + .pre-commit-config.yaml | 12 +- .so_pip.ini | 2 +- CHANGES.md | 4 + CONTRIBUTING.md | 4 +- Makefile | 147 +- Pipfile.lock | 1795 -------- README.md | 54 +- build.py | 845 ---- Pipfile => dead_code/Pipfile | 22 +- .../commands => dead_code/md}/__init__.py | 0 .../parse_python => dead_code}/md/parse.md.py | 0 {so_pip/parse_python => dead_code}/md/post.md | 0 docker/Dockerfile | 14 +- docker/Dockerfile_local | 18 + docs/scenarios.md | 2 +- examples/self_managed_packages/.so_pip.ini | 2 +- examples/vendorize_to_src/.so_pip.ini | 2 +- navio_tasks/README.md | 27 - navio_tasks/__init__.py | 6 - navio_tasks/build_state.py | 260 -- navio_tasks/clean.py | 23 - navio_tasks/cli_commands.py | 221 - navio_tasks/commands/README.md | 12 - navio_tasks/commands/cli_bandit.py | 30 - navio_tasks/commands/cli_compile_py.py | 39 - navio_tasks/commands/cli_detect_secrets.py | 76 - navio_tasks/commands/cli_django_tests.py | 31 - navio_tasks/commands/cli_flake8.py | 24 - navio_tasks/commands/cli_get_secrets.py | 69 - navio_tasks/commands/cli_go_gitleaks.py | 39 - navio_tasks/commands/cli_mypy.py | 91 - navio_tasks/commands/cli_npm_pyright.py | 23 - navio_tasks/commands/cli_poetry.py | 0 navio_tasks/commands/cli_pylint.py | 146 - navio_tasks/commands/cli_pytest.py | 98 - navio_tasks/commands/cli_tox.py | 32 - navio_tasks/commands/lib_dodgy.py | 26 - navio_tasks/dependency_commands/__init__.py | 0 .../dependency_commands/cli_installs.py | 46 - navio_tasks/dependency_commands/cli_jake.py | 31 - .../dependency_commands/cli_liccheck.py | 31 - .../cli_pin_dependencies.py | 50 - navio_tasks/dependency_commands/cli_pip.py | 84 - navio_tasks/dependency_commands/cli_safety.py | 24 - navio_tasks/deprecated_commands/README.md | 2 - navio_tasks/deprecated_commands/__init__.py | 0 .../deprecated_commands/cli_check_manifest.py | 87 - navio_tasks/deprecated_commands/cli_pyroma.py | 32 - .../deprecated_commands/cli_setup_py.py | 136 - navio_tasks/file_system.py | 15 - navio_tasks/mutating_commands/README.md | 6 - navio_tasks/mutating_commands/__init__.py | 0 navio_tasks/mutating_commands/cli_black.py | 64 - navio_tasks/mutating_commands/cli_isort.py | 18 - .../mutating_commands/cli_jiggle_version.py | 43 - .../mutating_commands/cli_npm_prettier.py | 3 - .../mutating_commands/cli_precommit.py | 60 - .../mutating_commands/cli_pyupgrade.py | 32 - navio_tasks/network.py | 34 - navio_tasks/non_breaking_commands/README.md | 6 - navio_tasks/non_breaking_commands/__init__.py | 0 .../non_breaking_commands/cli_mccabe.py | 27 - .../non_breaking_commands/cli_scspell.py | 61 - .../non_breaking_commands/cli_sonar.py | 78 - .../non_breaking_commands/cli_vulture.py | 51 - navio_tasks/non_py_commands/__init__.py | 4 - navio_tasks/non_py_commands/cli_openapi.py | 50 - navio_tasks/non_py_commands/cli_yamllint.py | 19 - navio_tasks/output.py | 31 - navio_tasks/packaging_commands/README.md | 10 - navio_tasks/packaging_commands/__init__.py | 4 - .../packaging_commands/cli_poetry_package.py | 3 - navio_tasks/packaging_commands/cli_twine.py | 44 - navio_tasks/pure_reports/README.md | 8 - navio_tasks/pure_reports/__init__.py | 4 - navio_tasks/pure_reports/cli_gitchangelog.py | 28 - navio_tasks/pure_reports/cli_pygount.py | 69 - navio_tasks/pure_reports/cli_sphinx.py | 23 - navio_tasks/settings.py | 102 - navio_tasks/system_info.py | 62 - navio_tasks/utils.py | 58 - pipx_installs.sh | 12 - poetry.lock | 4006 +++++++++-------- pyproject.toml | 100 +- scripts/.so_pip.ini | 2 +- scripts/mass_harvest.py | 7 +- so_pip/__main__.py | 3 +- so_pip/api_clients/search_engine_facade.py | 11 +- so_pip/api_clients/stackapi_facade.py | 25 +- so_pip/api_clients/stackoverflow_scraper.py | 2 +- so_pip/commands/show.py | 4 +- .../infer_packages_needed/package_by_name.py | 6 +- so_pip/licenses/convert_to_txt.py | 1 - so_pip/models/authors_model.py | 4 +- so_pip/models/count_loc_in_post.py | 2 +- so_pip/parse_python/format_code.py | 3 +- so_pip/parse_python/post_to_code.py | 1 - so_pip/support_files/authors.py | 146 +- so_pip/support_files/changelog.py | 176 +- so_pip/support_files/code_of_conduct.py | 49 +- so_pip/support_files/generic_code_file.py | 68 +- so_pip/support_files/lua_rockspec.py | 134 +- so_pip/support_files/package_json.py | 148 +- so_pip/support_files/pyproject_toml.py | 152 +- so_pip/support_files/python_file.py | 108 +- so_pip/support_files/python_init.py | 96 +- so_pip/support_files/readme_md.py | 102 +- so_pip/support_files/ruby_gemspec.py | 136 +- so_pip/support_files/setup_cfg.py | 124 +- so_pip/support_files/setup_py.py | 82 +- .../find_imports_a_aboriginal_dig/main_1.py | 1 - test/test_slow/test_api_clients.py | 7 +- test/test_slow/test_live_search.py | 4 +- test/test_slow/test_whole_thing.py | 22 +- tox.ini | 2 +- 136 files changed, 4220 insertions(+), 9759 deletions(-) delete mode 100644 .build_history/bandit delete mode 100644 .build_history/black delete mode 100644 .build_history/flake8 delete mode 100644 .build_history/isort delete mode 100644 .config/.flake8 delete mode 100644 .config/.license_rules delete mode 100644 .config/.pynt delete mode 100644 .config/reqs.txt delete mode 100644 .config/requirements-dev-tox.txt delete mode 100644 .config/requirements-dev.txt delete mode 100644 .config/requirements.txt delete mode 100644 .config/requirements_for_safety.txt create mode 100644 .devcontainer/Dockerfile create mode 100644 .devcontainer/devcontainer.json create mode 100644 .github/workflows/build.yml delete mode 100644 .github/workflows/codeql-analysis.yml create mode 100644 .github_onhold/build_push_image.yml delete mode 100644 Pipfile.lock delete mode 100644 build.py rename Pipfile => dead_code/Pipfile (81%) rename {navio_tasks/commands => dead_code/md}/__init__.py (100%) rename {so_pip/parse_python => dead_code}/md/parse.md.py (100%) rename {so_pip/parse_python => dead_code}/md/post.md (100%) create mode 100644 docker/Dockerfile_local delete mode 100644 navio_tasks/README.md delete mode 100644 navio_tasks/__init__.py delete mode 100644 navio_tasks/build_state.py delete mode 100644 navio_tasks/clean.py delete mode 100644 navio_tasks/cli_commands.py delete mode 100644 navio_tasks/commands/README.md delete mode 100644 navio_tasks/commands/cli_bandit.py delete mode 100644 navio_tasks/commands/cli_compile_py.py delete mode 100644 navio_tasks/commands/cli_detect_secrets.py delete mode 100644 navio_tasks/commands/cli_django_tests.py delete mode 100644 navio_tasks/commands/cli_flake8.py delete mode 100644 navio_tasks/commands/cli_get_secrets.py delete mode 100644 navio_tasks/commands/cli_go_gitleaks.py delete mode 100644 navio_tasks/commands/cli_mypy.py delete mode 100644 navio_tasks/commands/cli_npm_pyright.py delete mode 100644 navio_tasks/commands/cli_poetry.py delete mode 100644 navio_tasks/commands/cli_pylint.py delete mode 100644 navio_tasks/commands/cli_pytest.py delete mode 100644 navio_tasks/commands/cli_tox.py delete mode 100644 navio_tasks/commands/lib_dodgy.py delete mode 100644 navio_tasks/dependency_commands/__init__.py delete mode 100644 navio_tasks/dependency_commands/cli_installs.py delete mode 100644 navio_tasks/dependency_commands/cli_jake.py delete mode 100644 navio_tasks/dependency_commands/cli_liccheck.py delete mode 100644 navio_tasks/dependency_commands/cli_pin_dependencies.py delete mode 100644 navio_tasks/dependency_commands/cli_pip.py delete mode 100644 navio_tasks/dependency_commands/cli_safety.py delete mode 100644 navio_tasks/deprecated_commands/README.md delete mode 100644 navio_tasks/deprecated_commands/__init__.py delete mode 100644 navio_tasks/deprecated_commands/cli_check_manifest.py delete mode 100644 navio_tasks/deprecated_commands/cli_pyroma.py delete mode 100644 navio_tasks/deprecated_commands/cli_setup_py.py delete mode 100644 navio_tasks/file_system.py delete mode 100644 navio_tasks/mutating_commands/README.md delete mode 100644 navio_tasks/mutating_commands/__init__.py delete mode 100644 navio_tasks/mutating_commands/cli_black.py delete mode 100644 navio_tasks/mutating_commands/cli_isort.py delete mode 100644 navio_tasks/mutating_commands/cli_jiggle_version.py delete mode 100644 navio_tasks/mutating_commands/cli_npm_prettier.py delete mode 100644 navio_tasks/mutating_commands/cli_precommit.py delete mode 100644 navio_tasks/mutating_commands/cli_pyupgrade.py delete mode 100644 navio_tasks/network.py delete mode 100644 navio_tasks/non_breaking_commands/README.md delete mode 100644 navio_tasks/non_breaking_commands/__init__.py delete mode 100644 navio_tasks/non_breaking_commands/cli_mccabe.py delete mode 100644 navio_tasks/non_breaking_commands/cli_scspell.py delete mode 100644 navio_tasks/non_breaking_commands/cli_sonar.py delete mode 100644 navio_tasks/non_breaking_commands/cli_vulture.py delete mode 100644 navio_tasks/non_py_commands/__init__.py delete mode 100644 navio_tasks/non_py_commands/cli_openapi.py delete mode 100644 navio_tasks/non_py_commands/cli_yamllint.py delete mode 100644 navio_tasks/output.py delete mode 100644 navio_tasks/packaging_commands/README.md delete mode 100644 navio_tasks/packaging_commands/__init__.py delete mode 100644 navio_tasks/packaging_commands/cli_poetry_package.py delete mode 100644 navio_tasks/packaging_commands/cli_twine.py delete mode 100644 navio_tasks/pure_reports/README.md delete mode 100644 navio_tasks/pure_reports/__init__.py delete mode 100644 navio_tasks/pure_reports/cli_gitchangelog.py delete mode 100644 navio_tasks/pure_reports/cli_pygount.py delete mode 100644 navio_tasks/pure_reports/cli_sphinx.py delete mode 100644 navio_tasks/settings.py delete mode 100644 navio_tasks/system_info.py delete mode 100644 navio_tasks/utils.py diff --git a/.build_history/bandit b/.build_history/bandit deleted file mode 100644 index e69de29..0000000 diff --git a/.build_history/black b/.build_history/black deleted file mode 100644 index e69de29..0000000 diff --git a/.build_history/flake8 b/.build_history/flake8 deleted file mode 100644 index e69de29..0000000 diff --git a/.build_history/isort b/.build_history/isort deleted file mode 100644 index e69de29..0000000 diff --git a/.config/.flake8 b/.config/.flake8 deleted file mode 100644 index c14d42e..0000000 --- a/.config/.flake8 +++ /dev/null @@ -1,10 +0,0 @@ -[flake8] -ignore = E722,W503,E126,E122,E131,E203,E231,C901, - DAR101,DAR201,DAR101,D202,D200,D400,D205,DAR301 - Q000,C812,C819, - WPS306,WPS305,WPS336, WPS400,WPS110,WPS114, - WPS214, - E800,G004,G003,C416,E501,G200 -max-line-length = 88 -enable-extensions = G -exclude = tests/* diff --git a/.config/.license_rules b/.config/.license_rules deleted file mode 100644 index 33d4e2c..0000000 --- a/.config/.license_rules +++ /dev/null @@ -1,93 +0,0 @@ -[Licenses] -# lower case -authorized_licenses : - bsd - new bsd - bsd license - new bsd license - simplified bsd - apache - apache 2.0 - apache software license - dual - gnu lgpl - lgpl with exceptions or zpl - isc license - isc license (iscl) - mit - mit license - python software foundation license - zpl 2.1 - gpl v3 - apache license version 2.0 - apache license 2.0 - apache license, version 2.0 - lgpl - mpl-2.0 - apache software - mozilla public license 2.0 (mpl 2.0) - gnu library or lesser general public license (lgpl) - bsd-3-clause - bsd-like - Public Domain - GNU Lesser General Public License v3 (LGPLv3) - LGPL v3 - MIT - license.txt - public domain, Python, 2-Clause BSD, GPL 3 (see COPYING.txt) - GNU General Public License (GPL) - BSD - Python Software Foundation - Apache Software - BSD or Apache License, Version 2.0 - BSD - BSD-2-Clause or Apache-2.0 - Python - Python Software Foundation - Public Domain - ASL 2 - Apache Software - Historical Permission Notice and Disclaimer (HPND) - HPND - Mozilla Public License 1.1 (MPL 1.1) - GNU General Public License v2 or later (GPLv2+) - GNU Lesser General Public License v2 or later (LGPLv2+) - Python Software Foundation - PSFL - GNU Lesser General Public License v3 or later (LGPLv3+) - LGPLv3+ - LGPLv3 - GNU Lesser General Public License v3 (LGPLv3) - GPLv2 - GNU General Public License v2 (GPLv2) - BSD 3-Clause - GNU GPL 3 - GNU General Public License (GPL) - 3-Clause BSD - BSD-2-Clause - ISC - GNU General Public License v2 or later (GPLv2+) - Artistic - GNU General Public License (GPL) - MIT -or- Apache License 2.0 - Apache Software - Apache-2.0 - Apache Software License 2.0 - LGPL+BSD - BSD - GNU Library or Lesser General Public License (LGPL) - MIT/Apache-2.0 - http://www.apache.org/licenses/LICENSE-2.0 - Python Software Foundation - PSF - MPL 2.0 - Mozilla Public License 2.0 (MPL 2.0) - https://github.com/IlyaSkriblovsky/slpp-23/blob/master/LICENSE - LGPL-2.1-or-later - -unauthorized_licenses : - foobar - -[Authorized Packages] -# Python software license (see http://zesty.ca/python/uuid.README.txt) -uuid : 1.30 diff --git a/.config/.pylintrc b/.config/.pylintrc index 0ea33ec..181e26d 100644 --- a/.config/.pylintrc +++ b/.config/.pylintrc @@ -1,17 +1,62 @@ -[MASTER] +[MAIN] + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Load and enable all available extensions. Use --list-extensions to see a list +# all available extensions. +#enable-all-extensions= + +# In error mode, checkers without error messages are disabled and for others, +# only the ERROR messages are displayed, and no reports are done by default. +#errors-only= + +# Always return a 0 (non-error) status code, even if lint errors are found. +# This is primarily useful in continuous integration scripts. +#exit-zero= # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code. +extension-pkg-allow-list= + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. (This is an alternative name to extension-pkg-allow-list +# for backward compatibility.) extension-pkg-whitelist= -# Add files or directories to the blacklist. They should be base names, not -# paths. +# Return non-zero exit code if any of these messages/categories are detected, +# even if score is above --fail-under value. Syntax same as enable. Messages +# specified are enabled, while categories only check already-enabled messages. +fail-on= + +# Specify a score threshold to be exceeded before program exits with error. +fail-under=10 + +# Interpret the stdin as a python script, whose filename needs to be passed as +# the module_or_package argument. +#from-stdin= + +# Files or directories to be skipped. They should be base names, not paths. ignore=CVS -# Add files or directories matching the regex patterns to the blacklist. The -# regex matches against base names, not paths. -ignore-patterns= +# Add files or directories matching the regex patterns to the ignore-list. The +# regex matches against paths and can be in Posix or Windows format. +ignore-paths= + +# Files or directories matching the regex patterns are skipped. The regex +# matches against base names, not paths. The default value ignores Emacs file +# locks +ignore-patterns=^\.# + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis). It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). @@ -26,15 +71,19 @@ jobs=1 # complex, nested conditions. limit-inference-results=100 -# List of plugins (as comma separated values of python modules names) to load, +# List of plugins (as comma separated values of python module names) to load, # usually to register additional checkers. load-plugins= # Pickle collected data for later comparisons. persistent=yes -# Specify a configuration file. -#rcfile= +# Minimum Python version to use for version dependent checks. Will default to +# the version used to run pylint. +py-version=3.10 + +# Discover python modules and packages in the file system subtree. +recursive=no # When enabled, pylint would attempt to guess common misconfiguration and emit # user-friendly hints instead of false-positive error messages. @@ -44,33 +93,56 @@ suggestion-mode=yes # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no +# In verbose mode, extra non-checker-related info will be displayed. +#verbose= + + +[REPORTS] + +# Python expression which should return a score less than or equal to 10. You +# have access to the variables 'fatal', 'error', 'warning', 'refactor', +# 'convention', and 'info' which contain the number of messages in each +# category, as well as 'statement' which is the total number of statements +# analyzed. This score is used by the global evaluation report (RP0004). +evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details. +msg-template= + +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio). You can also give a reporter class, e.g. +# mypackage.mymodule.MyReporterClass. +#output-format= + +# Tells whether to display a full report or only the messages. +reports=no + +# Activate the evaluation score. +score=yes + [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. -confidence= +# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, +# UNDEFINED. +confidence=HIGH, + CONTROL_FLOW, + INFERENCE, + INFERENCE_FAILURE, + UNDEFINED # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once). You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if +# disable everything first and then re-enable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use "--disable=all --enable=classes # --disable=W". -disable=print-statement, - parameter-unpacking, - unpacking-in-except, - old-raise-syntax, - backtick, - long-suffix, - old-ne-operator, - old-octal-literal, - import-star-module-level, - non-ascii-bytes-literal, - raw-checker-failed, +disable=raw-checker-failed, bad-inline-option, locally-disabled, file-ignored, @@ -78,87 +150,24 @@ disable=print-statement, useless-suppression, deprecated-pragma, use-symbolic-message-instead, - apply-builtin, - basestring-builtin, - buffer-builtin, - cmp-builtin, - coerce-builtin, - execfile-builtin, - file-builtin, - long-builtin, - raw_input-builtin, - reduce-builtin, - standarderror-builtin, - unicode-builtin, - xrange-builtin, - coerce-method, - delslice-method, - getslice-method, - setslice-method, - no-absolute-import, - old-division, - dict-iter-method, - dict-view-method, - next-method-called, - metaclass-assignment, - indexing-exception, - raising-string, - reload-builtin, - oct-method, - hex-method, - nonzero-method, - cmp-method, - input-builtin, - round-builtin, - intern-builtin, - unichr-builtin, - map-builtin-not-iterating, - zip-builtin-not-iterating, - range-builtin-not-iterating, - filter-builtin-not-iterating, - using-cmp-argument, - eq-without-hash, - div-method, - idiv-method, - rdiv-method, - exception-message-attribute, - invalid-str-codec, - sys-max-int, - bad-python3-import, - deprecated-string-function, - deprecated-str-translate-call, - deprecated-itertools-function, - deprecated-types-field, - next-method-defined, - dict-items-not-iterating, - dict-keys-not-iterating, - dict-values-not-iterating, - deprecated-operator-function, - deprecated-urllib-function, - xreadlines-attribute, - deprecated-sys-function, - exception-escape, - comprehension-escape, - useless-object-inheritance, - bad-continuation, - wrong-import-order, + + fixme, + too-many-lines, + too-many-branches, + import-error, + too-many-statements, + useless-import-alias, + too-many-locals, + consider-using-from-import, # pylint is wrong + duplicate-code, too-many-arguments, - too-many-instance-attributes, logging-fstring-interpolation, - logging-not-, + too-many-instance-attributes, + too-many-return-statements, + unnecessary-direct-lambda-call, too-few-public-methods, - duplicate-code, logging-not-lazy, - too-many-locals, - fixme, - too-many-boolean-expressions, - too-many-statements, - logging-format-interpolation, - too-many-return-statements, - useless-import-alias, # isort and black win - import-error, # needs this to run pylint is pipx. Trade offs, man. - line-too-long, # the SO URLs exceed the line length - missing-final-newline, # black will get it eventually + too-few-public-methods # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option @@ -167,56 +176,21 @@ disable=print-statement, enable=c-extension-no-member -[REPORTS] - -# Python expression which should return a note less than 10 (10 is the highest -# note). You have access to the variables errors warning, statement which -# respectively contain the number of errors / warnings messages and the total -# number of statements analyzed. This is used by the global evaluation report -# (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details. -#msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio). You can also give a reporter class, e.g. -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages. -reports=no - -# Activate the evaluation score. -score=yes - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - -# Complete name of functions that never returns. When checking for -# inconsistent-return-statements if a never returning function is called then -# it will be considered as an explicit return statement and no message will be -# printed. -never-returning-functions=sys.exit - - [BASIC] # Naming style matching correct argument names. argument-naming-style=snake_case # Regular expression matching correct argument names. Overrides argument- -# naming-style. +# naming-style. If left empty, argument names will be checked with the set +# naming style. #argument-rgx= # Naming style matching correct attribute names. attr-naming-style=snake_case # Regular expression matching correct attribute names. Overrides attr-naming- +# style. If left empty, attribute names will be checked with the set naming # style. #attr-rgx= @@ -228,24 +202,38 @@ bad-names=foo, tutu, tata +# Bad variable names regexes, separated by a comma. If names match any regex, +# they will always be refused +bad-names-rgxs= + # Naming style matching correct class attribute names. class-attribute-naming-style=any # Regular expression matching correct class attribute names. Overrides class- -# attribute-naming-style. +# attribute-naming-style. If left empty, class attribute names will be checked +# with the set naming style. #class-attribute-rgx= +# Naming style matching correct class constant names. +class-const-naming-style=UPPER_CASE + +# Regular expression matching correct class constant names. Overrides class- +# const-naming-style. If left empty, class constant names will be checked with +# the set naming style. +#class-const-rgx= + # Naming style matching correct class names. class-naming-style=PascalCase # Regular expression matching correct class names. Overrides class-naming- -# style. +# style. If left empty, class names will be checked with the set naming style. #class-rgx= # Naming style matching correct constant names. const-naming-style=UPPER_CASE # Regular expression matching correct constant names. Overrides const-naming- +# style. If left empty, constant names will be checked with the set naming # style. #const-rgx= @@ -257,7 +245,8 @@ docstring-min-length=-1 function-naming-style=snake_case # Regular expression matching correct function names. Overrides function- -# naming-style. +# naming-style. If left empty, function names will be checked with the set +# naming style. #function-rgx= # Good variable names which should always be accepted, separated by a comma. @@ -268,6 +257,10 @@ good-names=i, Run, _ +# Good variable names regexes, separated by a comma. If names match any regex, +# they will always be accepted +good-names-rgxs= + # Include a hint for the correct naming format with invalid-name. include-naming-hint=no @@ -275,21 +268,22 @@ include-naming-hint=no inlinevar-naming-style=any # Regular expression matching correct inline iteration names. Overrides -# inlinevar-naming-style. +# inlinevar-naming-style. If left empty, inline iteration names will be checked +# with the set naming style. #inlinevar-rgx= # Naming style matching correct method names. method-naming-style=snake_case # Regular expression matching correct method names. Overrides method-naming- -# style. +# style. If left empty, method names will be checked with the set naming style. #method-rgx= # Naming style matching correct module names. module-naming-style=snake_case # Regular expression matching correct module names. Overrides module-naming- -# style. +# style. If left empty, module names will be checked with the set naming style. #module-rgx= # Colon-delimited sets of names that determine each other's naming style when @@ -305,14 +299,93 @@ no-docstring-rgx=^_ # These decorators are taken in consideration only for invalid-name. property-classes=abc.abstractproperty +# Regular expression matching correct type variable names. If left empty, type +# variable names will be checked with the set naming style. +#typevar-rgx= + # Naming style matching correct variable names. variable-naming-style=snake_case # Regular expression matching correct variable names. Overrides variable- -# naming-style. +# naming-style. If left empty, variable names will be checked with the set +# naming style. #variable-rgx= +[CLASSES] + +# Warn about protected attribute access inside special methods +check-protected-access-in-special-methods=no + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp, + __post_init__ + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=cls + + +[DESIGN] + +# List of regular expressions of class ancestor names to ignore when counting +# public methods (see R0903) +exclude-too-few-public-methods= + +# List of qualified class names to ignore when counting class parents (see +# R0901) +ignored-parents= + +# Maximum number of arguments for function / method. +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of boolean expressions in an if statement (see R0916). +max-bool-expr=5 + +# Maximum number of branch for function / method body. +max-branches=12 + +# Maximum number of locals for function / method body. +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body. +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when caught. +overgeneral-exceptions=BaseException, + Exception + + [FORMAT] # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. @@ -334,13 +407,6 @@ max-line-length=100 # Maximum number of lines in a module. max-module-lines=1000 -# List of optional constructs for which whitespace checking is disabled. `dict- -# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. -# `trailing-comma` allows a space between comma and closing bracket: (a, ). -# `empty-line` allows space-only lines. -no-space-check=trailing-comma, - dict-separator - # Allow the body of a class to be on the same line as the declaration if body # contains single statement. single-line-class-stmt=no @@ -350,10 +416,46 @@ single-line-class-stmt=no single-line-if-stmt=no +[IMPORTS] + +# List of modules that can be imported at any level, not just the top level +# one. +allow-any-import-level= + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules= + +# Output a graph (.gv or any supported image format) of external dependencies +# to the given file (report RP0402 must not be disabled). +ext-import-graph= + +# Output a graph (.gv or any supported image format) of all (i.e. internal and +# external) dependencies to the given file (report RP0402 must not be +# disabled). +import-graph= + +# Output a graph (.gv or any supported image format) of internal dependencies +# to the given file (report RP0402 must not be disabled). +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Couples of modules and preferred modules, separated by a comma. +preferred-modules= + + [LOGGING] -# Format style used to check logging format string. `old` means using % -# formatting, while `new` is for `{}` formatting. +# The type of string formatting that logging methods do. `old` means using % +# formatting, `new` is for `{}` formatting. logging-format-style=old # Logging modules to check that the string format arguments are in logging @@ -368,17 +470,35 @@ notes=FIXME, XXX, TODO +# Regular expression of note tags to take in consideration. +notes-rgx= + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=sys.exit,argparse.parse_error + [SIMILARITIES] -# Ignore comments when computing similarities. +# Comments are removed from the similarity computation ignore-comments=yes -# Ignore docstrings when computing similarities. +# Docstrings are removed from the similarity computation ignore-docstrings=yes -# Ignore imports when computing similarities. -ignore-imports=no +# Imports are removed from the similarity computation +ignore-imports=yes + +# Signatures are removed from the similarity computation +ignore-signatures=yes # Minimum lines number of a similarity. min-similarity-lines=4 @@ -389,26 +509,33 @@ min-similarity-lines=4 # Limits count of emitted suggestions for spelling mistakes. max-spelling-suggestions=4 -# Spelling dictionary name. Available dictionaries: none. To make it working -# install python-enchant package.. +# Spelling dictionary name. Available dictionaries: none. To make it work, +# install the 'python-enchant' package. spelling-dict= +# List of comma separated words that should be considered directives if they +# appear at the beginning of a comment and should not be checked. +spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy: + # List of comma separated words that should not be checked. spelling-ignore-words= -# A path to a file that contains private dictionary; one word per line. +# A path to a file that contains the private dictionary; one word per line. spelling-private-dict-file= -# Tells whether to store unknown words to indicated private dictionary in -# --spelling-private-dict-file option instead of raising a message. +# Tells whether to store unknown words to the private dictionary (see the +# --spelling-private-dict-file option) instead of raising a message. spelling-store-unknown-words=no [STRING] -# This flag controls whether the implicit-str-concat-in-sequence should -# generate a warning on implicit string concatenation in sequences defined over -# several lines. +# This flag controls whether inconsistent-quotes generates a warning when the +# character used as a quote delimiter is used inconsistently within a module. +check-quote-consistency=no + +# This flag controls whether the implicit-str-concat should generate a warning +# on implicit string concatenation in sequences defined over several lines. check-str-concat-over-line-jumps=no @@ -424,10 +551,6 @@ contextmanager-decorators=contextlib.contextmanager # expressions are accepted. generated-members= -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - # Tells whether to warn about missing members when the owner of the attribute # is inferred to be None. ignore-none=yes @@ -440,16 +563,16 @@ ignore-none=yes # the rest of the inferred objects. ignore-on-opaque-inference=yes +# List of symbolic message names to ignore for Mixin members. +ignored-checks-for-mixins=no-member, + not-async-context-manager, + not-context-manager, + attribute-defined-outside-init + # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis. It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules= +ignored-classes=optparse.Values,thread._local,_thread._local,argparse.Namespace # Show a hint with possible names when a member name was not found. The aspect # of finding the hint is based on edit distance. @@ -463,6 +586,12 @@ missing-member-hint-distance=1 # showing a hint for a missing member. missing-member-max-choices=1 +# Regex pattern to define which classes are considered mixins. +mixin-class-rgx=.*[Mm]ixin + +# List of decorators that change the signature of a decorated function. +signature-mutators= + [VARIABLES] @@ -473,6 +602,9 @@ additional-builtins= # Tells whether unused global variables should be treated as a violation. allow-global-unused-variables=yes +# List of names allowed to shadow builtins +allowed-redefined-builtins= + # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_, @@ -492,99 +624,3 @@ init-import=no # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__, - __new__, - setUp - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict, - _fields, - _replace, - _source, - _make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=cls - - -[DESIGN] - -# Maximum number of arguments for function / method. -max-args=5 - -# Maximum number of attributes for a class (see R0902). -max-attributes=7 - -# Maximum number of boolean expressions in an if statement. -max-bool-expr=5 - -# Maximum number of branch for function / method body. -max-branches=12 - -# Maximum number of locals for function / method body. -max-locals=15 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 - -# Maximum number of return / yield for function / method body. -max-returns=6 - -# Maximum number of statements in function / method body. -max-statements=50 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - - -[IMPORTS] - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Deprecated modules which should not be used, separated by a comma. -deprecated-modules=optparse,tkinter.tix - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled). -ext-import-graph= - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled). -import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled). -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "BaseException, Exception". -overgeneral-exceptions=BaseException, - Exception diff --git a/.config/.pylintrc_scripts b/.config/.pylintrc_scripts index 5a35e2d..064a0cb 100644 --- a/.config/.pylintrc_scripts +++ b/.config/.pylintrc_scripts @@ -1,17 +1,62 @@ -[MASTER] +[MAIN] + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Load and enable all available extensions. Use --list-extensions to see a list +# all available extensions. +#enable-all-extensions= + +# In error mode, checkers without error messages are disabled and for others, +# only the ERROR messages are displayed, and no reports are done by default. +#errors-only= + +# Always return a 0 (non-error) status code, even if lint errors are found. +# This is primarily useful in continuous integration scripts. +#exit-zero= # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code. +extension-pkg-allow-list= + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. (This is an alternative name to extension-pkg-allow-list +# for backward compatibility.) extension-pkg-whitelist= -# Add files or directories to the blacklist. They should be base names, not -# paths. +# Return non-zero exit code if any of these messages/categories are detected, +# even if score is above --fail-under value. Syntax same as enable. Messages +# specified are enabled, while categories only check already-enabled messages. +fail-on= + +# Specify a score threshold to be exceeded before program exits with error. +fail-under=10 + +# Interpret the stdin as a python script, whose filename needs to be passed as +# the module_or_package argument. +#from-stdin= + +# Files or directories to be skipped. They should be base names, not paths. ignore=CVS -# Add files or directories matching the regex patterns to the blacklist. The -# regex matches against base names, not paths. -ignore-patterns= +# Add files or directories matching the regex patterns to the ignore-list. The +# regex matches against paths and can be in Posix or Windows format. +ignore-paths= + +# Files or directories matching the regex patterns are skipped. The regex +# matches against base names, not paths. The default value ignores Emacs file +# locks +ignore-patterns=^\.# + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis). It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). @@ -26,15 +71,19 @@ jobs=1 # complex, nested conditions. limit-inference-results=100 -# List of plugins (as comma separated values of python modules names) to load, +# List of plugins (as comma separated values of python module names) to load, # usually to register additional checkers. load-plugins= # Pickle collected data for later comparisons. persistent=yes -# Specify a configuration file. -#rcfile= +# Minimum Python version to use for version dependent checks. Will default to +# the version used to run pylint. +py-version=3.10 + +# Discover python modules and packages in the file system subtree. +recursive=no # When enabled, pylint would attempt to guess common misconfiguration and emit # user-friendly hints instead of false-positive error messages. @@ -44,35 +93,56 @@ suggestion-mode=yes # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no +# In verbose mode, extra non-checker-related info will be displayed. +#verbose= + + +[REPORTS] + +# Python expression which should return a score less than or equal to 10. You +# have access to the variables 'fatal', 'error', 'warning', 'refactor', +# 'convention', and 'info' which contain the number of messages in each +# category, as well as 'statement' which is the total number of statements +# analyzed. This score is used by the global evaluation report (RP0004). +evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details. +msg-template= + +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio). You can also give a reporter class, e.g. +# mypackage.mymodule.MyReporterClass. +#output-format= + +# Tells whether to display a full report or only the messages. +reports=no + +# Activate the evaluation score. +score=yes + [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. -confidence= +# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, +# UNDEFINED. +confidence=HIGH, + CONTROL_FLOW, + INFERENCE, + INFERENCE_FAILURE, + UNDEFINED # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once). You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if +# disable everything first and then re-enable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use "--disable=all --enable=classes # --disable=W". -disable=too-many-lines, - bad-continuation, - print-statement, - parameter-unpacking, - unpacking-in-except, - old-raise-syntax, - backtick, - long-suffix, - old-ne-operator, - old-octal-literal, - import-star-module-level, - non-ascii-bytes-literal, - raw-checker-failed, +disable=raw-checker-failed, bad-inline-option, locally-disabled, file-ignored, @@ -80,84 +150,33 @@ disable=too-many-lines, useless-suppression, deprecated-pragma, use-symbolic-message-instead, - useless-object-inheritance, - duplicate-code, - too-many-branches, + fixme, - apply-builtin, - basestring-builtin, - buffer-builtin, - cmp-builtin, - coerce-builtin, - execfile-builtin, - file-builtin, - long-builtin, - raw_input-builtin, - reduce-builtin, - standarderror-builtin, - unicode-builtin, - xrange-builtin, - coerce-method, - delslice-method, - getslice-method, - setslice-method, - no-absolute-import, - old-division, - dict-iter-method, - dict-view-method, - next-method-called, - metaclass-assignment, - indexing-exception, - raising-string, - reload-builtin, - oct-method, - hex-method, - nonzero-method, - cmp-method, - input-builtin, - round-builtin, - intern-builtin, - unichr-builtin, - map-builtin-not-iterating, - zip-builtin-not-iterating, - range-builtin-not-iterating, - filter-builtin-not-iterating, - using-cmp-argument, - eq-without-hash, - div-method, - idiv-method, - rdiv-method, - exception-message-attribute, - invalid-str-codec, - sys-max-int, - bad-python3-import, - deprecated-string-function, - deprecated-str-translate-call, - deprecated-itertools-function, - deprecated-types-field, - next-method-defined, - dict-items-not-iterating, - dict-keys-not-iterating, - dict-values-not-iterating, - deprecated-operator-function, - deprecated-urllib-function, - xreadlines-attribute, - deprecated-sys-function, - exception-escape, - comprehension-escape, - missing-docstring, # I want good test names not some BS docstring - line-too-long, # rely on black - bare-except, # the tests will never be prod code, bad policy - protected-access, # everything must be tested - empty-docstring, # it is a test. - invalid-name, # lots of boiler plate names with no meaning - logging-fstring-interpolation, # no perf considerations in unit tests - logging-not-lazy, # no perf considerations in unit tests - too-many-instance-attributes, # code not important enough - unnecessary-comprehension, # this is a legit trick - using-constant-test, # this is a legit trick - wrong-import-order, # this rarely breaks things - useless-import-alias, # whatever black and isort prefer. + too-many-lines, + too-many-branches, + import-error, + too-many-statements, + useless-import-alias, + too-many-locals, + consider-using-from-import, # pylint is wrong + duplicate-code, + too-many-arguments, + logging-fstring-interpolation, + too-many-instance-attributes, + too-many-return-statements, + unnecessary-direct-lambda-call, + invalid-name, + line-too-long, + wrong-import-order, + missing-module-docstring, + missing-function-docstring, + empty-docstring, + missing-class-docstring, + too-few-public-methods, + too-many-function-args, + consider-using-sys-exit, # considered, and I won't. + wrong-import-position, # isort wins. + # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option @@ -166,56 +185,21 @@ disable=too-many-lines, enable=c-extension-no-member -[REPORTS] - -# Python expression which should return a note less than 10 (10 is the highest -# note). You have access to the variables errors warning, statement which -# respectively contain the number of errors / warnings messages and the total -# number of statements analyzed. This is used by the global evaluation report -# (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details. -#msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio). You can also give a reporter class, e.g. -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages. -reports=no - -# Activate the evaluation score. -score=yes - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - -# Complete name of functions that never returns. When checking for -# inconsistent-return-statements if a never returning function is called then -# it will be considered as an explicit return statement and no message will be -# printed. -never-returning-functions=sys.exit - - [BASIC] # Naming style matching correct argument names. argument-naming-style=snake_case # Regular expression matching correct argument names. Overrides argument- -# naming-style. +# naming-style. If left empty, argument names will be checked with the set +# naming style. #argument-rgx= # Naming style matching correct attribute names. attr-naming-style=snake_case # Regular expression matching correct attribute names. Overrides attr-naming- +# style. If left empty, attribute names will be checked with the set naming # style. #attr-rgx= @@ -227,24 +211,38 @@ bad-names=foo, tutu, tata +# Bad variable names regexes, separated by a comma. If names match any regex, +# they will always be refused +bad-names-rgxs= + # Naming style matching correct class attribute names. class-attribute-naming-style=any # Regular expression matching correct class attribute names. Overrides class- -# attribute-naming-style. +# attribute-naming-style. If left empty, class attribute names will be checked +# with the set naming style. #class-attribute-rgx= +# Naming style matching correct class constant names. +class-const-naming-style=UPPER_CASE + +# Regular expression matching correct class constant names. Overrides class- +# const-naming-style. If left empty, class constant names will be checked with +# the set naming style. +#class-const-rgx= + # Naming style matching correct class names. class-naming-style=PascalCase # Regular expression matching correct class names. Overrides class-naming- -# style. +# style. If left empty, class names will be checked with the set naming style. #class-rgx= # Naming style matching correct constant names. const-naming-style=UPPER_CASE # Regular expression matching correct constant names. Overrides const-naming- +# style. If left empty, constant names will be checked with the set naming # style. #const-rgx= @@ -256,7 +254,8 @@ docstring-min-length=-1 function-naming-style=snake_case # Regular expression matching correct function names. Overrides function- -# naming-style. +# naming-style. If left empty, function names will be checked with the set +# naming style. #function-rgx= # Good variable names which should always be accepted, separated by a comma. @@ -267,6 +266,10 @@ good-names=i, Run, _ +# Good variable names regexes, separated by a comma. If names match any regex, +# they will always be accepted +good-names-rgxs= + # Include a hint for the correct naming format with invalid-name. include-naming-hint=no @@ -274,21 +277,22 @@ include-naming-hint=no inlinevar-naming-style=any # Regular expression matching correct inline iteration names. Overrides -# inlinevar-naming-style. +# inlinevar-naming-style. If left empty, inline iteration names will be checked +# with the set naming style. #inlinevar-rgx= # Naming style matching correct method names. method-naming-style=snake_case # Regular expression matching correct method names. Overrides method-naming- -# style. +# style. If left empty, method names will be checked with the set naming style. #method-rgx= # Naming style matching correct module names. module-naming-style=snake_case # Regular expression matching correct module names. Overrides module-naming- -# style. +# style. If left empty, module names will be checked with the set naming style. #module-rgx= # Colon-delimited sets of names that determine each other's naming style when @@ -304,14 +308,93 @@ no-docstring-rgx=^_ # These decorators are taken in consideration only for invalid-name. property-classes=abc.abstractproperty +# Regular expression matching correct type variable names. If left empty, type +# variable names will be checked with the set naming style. +#typevar-rgx= + # Naming style matching correct variable names. variable-naming-style=snake_case # Regular expression matching correct variable names. Overrides variable- -# naming-style. +# naming-style. If left empty, variable names will be checked with the set +# naming style. #variable-rgx= +[CLASSES] + +# Warn about protected attribute access inside special methods +check-protected-access-in-special-methods=no + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp, + __post_init__ + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=cls + + +[DESIGN] + +# List of regular expressions of class ancestor names to ignore when counting +# public methods (see R0903) +exclude-too-few-public-methods= + +# List of qualified class names to ignore when counting class parents (see +# R0901) +ignored-parents= + +# Maximum number of arguments for function / method. +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of boolean expressions in an if statement (see R0916). +max-bool-expr=5 + +# Maximum number of branch for function / method body. +max-branches=12 + +# Maximum number of locals for function / method body. +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body. +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when caught. +overgeneral-exceptions=BaseException, + Exception + + [FORMAT] # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. @@ -328,18 +411,11 @@ indent-after-paren=4 indent-string=' ' # Maximum number of characters on a single line. -max-line-length=88 +max-line-length=100 # Maximum number of lines in a module. max-module-lines=1000 -# List of optional constructs for which whitespace checking is disabled. `dict- -# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. -# `trailing-comma` allows a space between comma and closing bracket: (a, ). -# `empty-line` allows space-only lines. -no-space-check=trailing-comma, - dict-separator - # Allow the body of a class to be on the same line as the declaration if body # contains single statement. single-line-class-stmt=no @@ -349,10 +425,46 @@ single-line-class-stmt=no single-line-if-stmt=no +[IMPORTS] + +# List of modules that can be imported at any level, not just the top level +# one. +allow-any-import-level= + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules= + +# Output a graph (.gv or any supported image format) of external dependencies +# to the given file (report RP0402 must not be disabled). +ext-import-graph= + +# Output a graph (.gv or any supported image format) of all (i.e. internal and +# external) dependencies to the given file (report RP0402 must not be +# disabled). +import-graph= + +# Output a graph (.gv or any supported image format) of internal dependencies +# to the given file (report RP0402 must not be disabled). +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Couples of modules and preferred modules, separated by a comma. +preferred-modules= + + [LOGGING] -# Format style used to check logging format string. `old` means using % -# formatting, while `new` is for `{}` formatting. +# The type of string formatting that logging methods do. `old` means using % +# formatting, `new` is for `{}` formatting. logging-format-style=old # Logging modules to check that the string format arguments are in logging @@ -367,17 +479,35 @@ notes=FIXME, XXX, TODO +# Regular expression of note tags to take in consideration. +notes-rgx= + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=sys.exit,argparse.parse_error + [SIMILARITIES] -# Ignore comments when computing similarities. +# Comments are removed from the similarity computation ignore-comments=yes -# Ignore docstrings when computing similarities. +# Docstrings are removed from the similarity computation ignore-docstrings=yes -# Ignore imports when computing similarities. -ignore-imports=no +# Imports are removed from the similarity computation +ignore-imports=yes + +# Signatures are removed from the similarity computation +ignore-signatures=yes # Minimum lines number of a similarity. min-similarity-lines=4 @@ -388,26 +518,33 @@ min-similarity-lines=4 # Limits count of emitted suggestions for spelling mistakes. max-spelling-suggestions=4 -# Spelling dictionary name. Available dictionaries: none. To make it working -# install python-enchant package.. +# Spelling dictionary name. Available dictionaries: none. To make it work, +# install the 'python-enchant' package. spelling-dict= +# List of comma separated words that should be considered directives if they +# appear at the beginning of a comment and should not be checked. +spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy: + # List of comma separated words that should not be checked. spelling-ignore-words= -# A path to a file that contains private dictionary; one word per line. +# A path to a file that contains the private dictionary; one word per line. spelling-private-dict-file= -# Tells whether to store unknown words to indicated private dictionary in -# --spelling-private-dict-file option instead of raising a message. +# Tells whether to store unknown words to the private dictionary (see the +# --spelling-private-dict-file option) instead of raising a message. spelling-store-unknown-words=no [STRING] -# This flag controls whether the implicit-str-concat-in-sequence should -# generate a warning on implicit string concatenation in sequences defined over -# several lines. +# This flag controls whether inconsistent-quotes generates a warning when the +# character used as a quote delimiter is used inconsistently within a module. +check-quote-consistency=no + +# This flag controls whether the implicit-str-concat should generate a warning +# on implicit string concatenation in sequences defined over several lines. check-str-concat-over-line-jumps=no @@ -423,10 +560,6 @@ contextmanager-decorators=contextlib.contextmanager # expressions are accepted. generated-members= -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - # Tells whether to warn about missing members when the owner of the attribute # is inferred to be None. ignore-none=yes @@ -439,16 +572,16 @@ ignore-none=yes # the rest of the inferred objects. ignore-on-opaque-inference=yes +# List of symbolic message names to ignore for Mixin members. +ignored-checks-for-mixins=no-member, + not-async-context-manager, + not-context-manager, + attribute-defined-outside-init + # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis. It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules= +ignored-classes=optparse.Values,thread._local,_thread._local,argparse.Namespace # Show a hint with possible names when a member name was not found. The aspect # of finding the hint is based on edit distance. @@ -462,6 +595,12 @@ missing-member-hint-distance=1 # showing a hint for a missing member. missing-member-max-choices=1 +# Regex pattern to define which classes are considered mixins. +mixin-class-rgx=.*[Mm]ixin + +# List of decorators that change the signature of a decorated function. +signature-mutators= + [VARIABLES] @@ -472,6 +611,9 @@ additional-builtins= # Tells whether unused global variables should be treated as a violation. allow-global-unused-variables=yes +# List of names allowed to shadow builtins +allowed-redefined-builtins= + # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_, @@ -491,99 +633,3 @@ init-import=no # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__, - __new__, - setUp - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict, - _fields, - _replace, - _source, - _make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=cls - - -[DESIGN] - -# Maximum number of arguments for function / method. -max-args=5 - -# Maximum number of attributes for a class (see R0902). -max-attributes=7 - -# Maximum number of boolean expressions in an if statement. -max-bool-expr=5 - -# Maximum number of branch for function / method body. -max-branches=12 - -# Maximum number of locals for function / method body. -max-locals=15 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 - -# Maximum number of return / yield for function / method body. -max-returns=6 - -# Maximum number of statements in function / method body. -max-statements=50 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - - -[IMPORTS] - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Deprecated modules which should not be used, separated by a comma. -deprecated-modules=optparse,tkinter.tix - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled). -ext-import-graph= - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled). -import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled). -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "BaseException, Exception". -overgeneral-exceptions=BaseException, - Exception diff --git a/.config/.pylintrc_test b/.config/.pylintrc_test index 821f82f..0c75aa4 100644 --- a/.config/.pylintrc_test +++ b/.config/.pylintrc_test @@ -1,17 +1,62 @@ -[MASTER] +[MAIN] + +# Analyse import fallback blocks. This can be used to support both Python 2 and +# 3 compatible code, which means that the block might have code that exists +# only in one or another interpreter, leading to false positives when analysed. +analyse-fallback-blocks=no + +# Load and enable all available extensions. Use --list-extensions to see a list +# all available extensions. +#enable-all-extensions= + +# In error mode, checkers without error messages are disabled and for others, +# only the ERROR messages are displayed, and no reports are done by default. +#errors-only= + +# Always return a 0 (non-error) status code, even if lint errors are found. +# This is primarily useful in continuous integration scripts. +#exit-zero= # A comma-separated list of package or module names from where C extensions may # be loaded. Extensions are loading into the active Python interpreter and may # run arbitrary code. +extension-pkg-allow-list= + +# A comma-separated list of package or module names from where C extensions may +# be loaded. Extensions are loading into the active Python interpreter and may +# run arbitrary code. (This is an alternative name to extension-pkg-allow-list +# for backward compatibility.) extension-pkg-whitelist= -# Add files or directories to the blacklist. They should be base names, not -# paths. +# Return non-zero exit code if any of these messages/categories are detected, +# even if score is above --fail-under value. Syntax same as enable. Messages +# specified are enabled, while categories only check already-enabled messages. +fail-on= + +# Specify a score threshold to be exceeded before program exits with error. +fail-under=10 + +# Interpret the stdin as a python script, whose filename needs to be passed as +# the module_or_package argument. +#from-stdin= + +# Files or directories to be skipped. They should be base names, not paths. ignore=CVS -# Add files or directories matching the regex patterns to the blacklist. The -# regex matches against base names, not paths. -ignore-patterns= +# Add files or directories matching the regex patterns to the ignore-list. The +# regex matches against paths and can be in Posix or Windows format. +ignore-paths= + +# Files or directories matching the regex patterns are skipped. The regex +# matches against base names, not paths. The default value ignores Emacs file +# locks +ignore-patterns=^\.# + +# List of module names for which member attributes should not be checked +# (useful for modules/projects where namespaces are manipulated during runtime +# and thus existing member attributes cannot be deduced by static analysis). It +# supports qualified module names, as well as Unix pattern matching. +ignored-modules= # Python code to execute, usually for sys.path manipulation such as # pygtk.require(). @@ -26,15 +71,19 @@ jobs=1 # complex, nested conditions. limit-inference-results=100 -# List of plugins (as comma separated values of python modules names) to load, +# List of plugins (as comma separated values of python module names) to load, # usually to register additional checkers. load-plugins= # Pickle collected data for later comparisons. persistent=yes -# Specify a configuration file. -#rcfile= +# Minimum Python version to use for version dependent checks. Will default to +# the version used to run pylint. +py-version=3.10 + +# Discover python modules and packages in the file system subtree. +recursive=no # When enabled, pylint would attempt to guess common misconfiguration and emit # user-friendly hints instead of false-positive error messages. @@ -44,35 +93,56 @@ suggestion-mode=yes # active Python interpreter and may run arbitrary code. unsafe-load-any-extension=no +# In verbose mode, extra non-checker-related info will be displayed. +#verbose= + + +[REPORTS] + +# Python expression which should return a score less than or equal to 10. You +# have access to the variables 'fatal', 'error', 'warning', 'refactor', +# 'convention', and 'info' which contain the number of messages in each +# category, as well as 'statement' which is the total number of statements +# analyzed. This score is used by the global evaluation report (RP0004). +evaluation=max(0, 0 if fatal else 10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)) + +# Template used to display messages. This is a python new-style format string +# used to format the message information. See doc for all details. +msg-template= + +# Set the output format. Available formats are text, parseable, colorized, json +# and msvs (visual studio). You can also give a reporter class, e.g. +# mypackage.mymodule.MyReporterClass. +#output-format= + +# Tells whether to display a full report or only the messages. +reports=no + +# Activate the evaluation score. +score=yes + [MESSAGES CONTROL] # Only show warnings with the listed confidence levels. Leave empty to show -# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED. -confidence= +# all. Valid levels: HIGH, CONTROL_FLOW, INFERENCE, INFERENCE_FAILURE, +# UNDEFINED. +confidence=HIGH, + CONTROL_FLOW, + INFERENCE, + INFERENCE_FAILURE, + UNDEFINED # Disable the message, report, category or checker with the given id(s). You # can either give multiple identifiers separated by comma (,) or put this # option multiple times (only on the command line, not in the configuration # file where it should appear only once). You can also use "--disable=all" to -# disable everything first and then reenable specific checks. For example, if +# disable everything first and then re-enable specific checks. For example, if # you want to run only the similarities checker, you can use "--disable=all # --enable=similarities". If you want to run only the classes checker, but have # no Warning level messages displayed, use "--disable=all --enable=classes # --disable=W". -disable=too-many-lines, - bad-continuation, - print-statement, - parameter-unpacking, - unpacking-in-except, - old-raise-syntax, - backtick, - long-suffix, - old-ne-operator, - old-octal-literal, - import-star-module-level, - non-ascii-bytes-literal, - raw-checker-failed, +disable=raw-checker-failed, bad-inline-option, locally-disabled, file-ignored, @@ -80,85 +150,40 @@ disable=too-many-lines, useless-suppression, deprecated-pragma, use-symbolic-message-instead, - useless-object-inheritance, - duplicate-code, - too-many-branches, + fixme, - apply-builtin, - basestring-builtin, - buffer-builtin, - cmp-builtin, - coerce-builtin, - execfile-builtin, - file-builtin, - long-builtin, - raw_input-builtin, - reduce-builtin, - standarderror-builtin, - unicode-builtin, - xrange-builtin, - coerce-method, - delslice-method, - getslice-method, - setslice-method, - no-absolute-import, - old-division, - dict-iter-method, - dict-view-method, - next-method-called, - metaclass-assignment, - indexing-exception, - raising-string, - reload-builtin, - oct-method, - hex-method, - nonzero-method, - cmp-method, - input-builtin, - round-builtin, - intern-builtin, - unichr-builtin, - map-builtin-not-iterating, - zip-builtin-not-iterating, - range-builtin-not-iterating, - filter-builtin-not-iterating, - using-cmp-argument, - eq-without-hash, - div-method, - idiv-method, - rdiv-method, - exception-message-attribute, - invalid-str-codec, - sys-max-int, - bad-python3-import, - deprecated-string-function, - deprecated-str-translate-call, - deprecated-itertools-function, - deprecated-types-field, - next-method-defined, - dict-items-not-iterating, - dict-keys-not-iterating, - dict-values-not-iterating, - deprecated-operator-function, - deprecated-urllib-function, - xreadlines-attribute, - deprecated-sys-function, - exception-escape, - comprehension-escape, - missing-docstring, # I want good test names not some BS docstring - line-too-long, # rely on black - bare-except, # the tests will never be prod code, bad policy - protected-access, # everything must be tested - empty-docstring, # it is a test. - invalid-name, # lots of boiler plate names with no meaning - logging-fstring-interpolation, # no perf considerations in unit tests - logging-not-lazy, # no perf considerations in unit tests - unused-variable, # usually isn't a bug - pointless-string-statement, # is not a bug - wrong-import-order, # doesn't normally cause bugs - unnecessary-comprehension, # this is a legit technique - broad-except, # common pattern - useless-import-alias, # whatever black and isort prefer. + too-many-lines, + too-many-branches, + import-error, + too-many-statements, + useless-import-alias, + too-many-locals, + consider-using-from-import, # pylint is wrong + duplicate-code, + too-many-arguments, + logging-fstring-interpolation, + too-many-instance-attributes, + too-many-return-statements, + unnecessary-direct-lambda-call, + missing-function-docstring, + unused-variable, + invalid-name, + unnecessary-dunder-call, + protected-access, + line-too-long, + missing-module-docstring, + unused-argument, + too-few-public-methods, + missing-class-docstring, + bare-except, + wrong-import-order, + unnecessary-lambda, + import-outside-toplevel, + empty-docstring + + + + # Enable the message, report, category or checker with the given id(s). You can # either give multiple identifier separated by comma (,) or put this option @@ -167,56 +192,21 @@ disable=too-many-lines, enable=c-extension-no-member -[REPORTS] - -# Python expression which should return a note less than 10 (10 is the highest -# note). You have access to the variables errors warning, statement which -# respectively contain the number of errors / warnings messages and the total -# number of statements analyzed. This is used by the global evaluation report -# (RP0004). -evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10) - -# Template used to display messages. This is a python new-style format string -# used to format the message information. See doc for all details. -#msg-template= - -# Set the output format. Available formats are text, parseable, colorized, json -# and msvs (visual studio). You can also give a reporter class, e.g. -# mypackage.mymodule.MyReporterClass. -output-format=text - -# Tells whether to display a full report or only the messages. -reports=no - -# Activate the evaluation score. -score=yes - - -[REFACTORING] - -# Maximum number of nested blocks for function / method body -max-nested-blocks=5 - -# Complete name of functions that never returns. When checking for -# inconsistent-return-statements if a never returning function is called then -# it will be considered as an explicit return statement and no message will be -# printed. -never-returning-functions=sys.exit - - [BASIC] # Naming style matching correct argument names. argument-naming-style=snake_case # Regular expression matching correct argument names. Overrides argument- -# naming-style. +# naming-style. If left empty, argument names will be checked with the set +# naming style. #argument-rgx= # Naming style matching correct attribute names. attr-naming-style=snake_case # Regular expression matching correct attribute names. Overrides attr-naming- +# style. If left empty, attribute names will be checked with the set naming # style. #attr-rgx= @@ -228,24 +218,38 @@ bad-names=foo, tutu, tata +# Bad variable names regexes, separated by a comma. If names match any regex, +# they will always be refused +bad-names-rgxs= + # Naming style matching correct class attribute names. class-attribute-naming-style=any # Regular expression matching correct class attribute names. Overrides class- -# attribute-naming-style. +# attribute-naming-style. If left empty, class attribute names will be checked +# with the set naming style. #class-attribute-rgx= +# Naming style matching correct class constant names. +class-const-naming-style=UPPER_CASE + +# Regular expression matching correct class constant names. Overrides class- +# const-naming-style. If left empty, class constant names will be checked with +# the set naming style. +#class-const-rgx= + # Naming style matching correct class names. class-naming-style=PascalCase # Regular expression matching correct class names. Overrides class-naming- -# style. +# style. If left empty, class names will be checked with the set naming style. #class-rgx= # Naming style matching correct constant names. const-naming-style=UPPER_CASE # Regular expression matching correct constant names. Overrides const-naming- +# style. If left empty, constant names will be checked with the set naming # style. #const-rgx= @@ -257,7 +261,8 @@ docstring-min-length=-1 function-naming-style=snake_case # Regular expression matching correct function names. Overrides function- -# naming-style. +# naming-style. If left empty, function names will be checked with the set +# naming style. #function-rgx= # Good variable names which should always be accepted, separated by a comma. @@ -268,6 +273,10 @@ good-names=i, Run, _ +# Good variable names regexes, separated by a comma. If names match any regex, +# they will always be accepted +good-names-rgxs= + # Include a hint for the correct naming format with invalid-name. include-naming-hint=no @@ -275,21 +284,22 @@ include-naming-hint=no inlinevar-naming-style=any # Regular expression matching correct inline iteration names. Overrides -# inlinevar-naming-style. +# inlinevar-naming-style. If left empty, inline iteration names will be checked +# with the set naming style. #inlinevar-rgx= # Naming style matching correct method names. method-naming-style=snake_case # Regular expression matching correct method names. Overrides method-naming- -# style. +# style. If left empty, method names will be checked with the set naming style. #method-rgx= # Naming style matching correct module names. module-naming-style=snake_case # Regular expression matching correct module names. Overrides module-naming- -# style. +# style. If left empty, module names will be checked with the set naming style. #module-rgx= # Colon-delimited sets of names that determine each other's naming style when @@ -305,14 +315,93 @@ no-docstring-rgx=^_ # These decorators are taken in consideration only for invalid-name. property-classes=abc.abstractproperty +# Regular expression matching correct type variable names. If left empty, type +# variable names will be checked with the set naming style. +#typevar-rgx= + # Naming style matching correct variable names. variable-naming-style=snake_case # Regular expression matching correct variable names. Overrides variable- -# naming-style. +# naming-style. If left empty, variable names will be checked with the set +# naming style. #variable-rgx= +[CLASSES] + +# Warn about protected attribute access inside special methods +check-protected-access-in-special-methods=no + +# List of method names used to declare (i.e. assign) instance attributes. +defining-attr-methods=__init__, + __new__, + setUp, + __post_init__ + +# List of member names, which should be excluded from the protected access +# warning. +exclude-protected=_asdict, + _fields, + _replace, + _source, + _make + +# List of valid names for the first argument in a class method. +valid-classmethod-first-arg=cls + +# List of valid names for the first argument in a metaclass class method. +valid-metaclass-classmethod-first-arg=cls + + +[DESIGN] + +# List of regular expressions of class ancestor names to ignore when counting +# public methods (see R0903) +exclude-too-few-public-methods= + +# List of qualified class names to ignore when counting class parents (see +# R0901) +ignored-parents= + +# Maximum number of arguments for function / method. +max-args=5 + +# Maximum number of attributes for a class (see R0902). +max-attributes=7 + +# Maximum number of boolean expressions in an if statement (see R0916). +max-bool-expr=5 + +# Maximum number of branch for function / method body. +max-branches=12 + +# Maximum number of locals for function / method body. +max-locals=15 + +# Maximum number of parents for a class (see R0901). +max-parents=7 + +# Maximum number of public methods for a class (see R0904). +max-public-methods=20 + +# Maximum number of return / yield for function / method body. +max-returns=6 + +# Maximum number of statements in function / method body. +max-statements=50 + +# Minimum number of public methods for a class (see R0903). +min-public-methods=2 + + +[EXCEPTIONS] + +# Exceptions that will emit a warning when caught. +overgeneral-exceptions=BaseException, + Exception + + [FORMAT] # Expected format of line ending, e.g. empty (any line ending), LF or CRLF. @@ -329,18 +418,11 @@ indent-after-paren=4 indent-string=' ' # Maximum number of characters on a single line. -max-line-length=88 +max-line-length=100 # Maximum number of lines in a module. max-module-lines=1000 -# List of optional constructs for which whitespace checking is disabled. `dict- -# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}. -# `trailing-comma` allows a space between comma and closing bracket: (a, ). -# `empty-line` allows space-only lines. -no-space-check=trailing-comma, - dict-separator - # Allow the body of a class to be on the same line as the declaration if body # contains single statement. single-line-class-stmt=no @@ -350,10 +432,46 @@ single-line-class-stmt=no single-line-if-stmt=no +[IMPORTS] + +# List of modules that can be imported at any level, not just the top level +# one. +allow-any-import-level= + +# Allow wildcard imports from modules that define __all__. +allow-wildcard-with-all=no + +# Deprecated modules which should not be used, separated by a comma. +deprecated-modules= + +# Output a graph (.gv or any supported image format) of external dependencies +# to the given file (report RP0402 must not be disabled). +ext-import-graph= + +# Output a graph (.gv or any supported image format) of all (i.e. internal and +# external) dependencies to the given file (report RP0402 must not be +# disabled). +import-graph= + +# Output a graph (.gv or any supported image format) of internal dependencies +# to the given file (report RP0402 must not be disabled). +int-import-graph= + +# Force import order to recognize a module as part of the standard +# compatibility libraries. +known-standard-library= + +# Force import order to recognize a module as part of a third party library. +known-third-party=enchant + +# Couples of modules and preferred modules, separated by a comma. +preferred-modules= + + [LOGGING] -# Format style used to check logging format string. `old` means using % -# formatting, while `new` is for `{}` formatting. +# The type of string formatting that logging methods do. `old` means using % +# formatting, `new` is for `{}` formatting. logging-format-style=old # Logging modules to check that the string format arguments are in logging @@ -368,17 +486,35 @@ notes=FIXME, XXX, TODO +# Regular expression of note tags to take in consideration. +notes-rgx= + + +[REFACTORING] + +# Maximum number of nested blocks for function / method body +max-nested-blocks=5 + +# Complete name of functions that never returns. When checking for +# inconsistent-return-statements if a never returning function is called then +# it will be considered as an explicit return statement and no message will be +# printed. +never-returning-functions=sys.exit,argparse.parse_error + [SIMILARITIES] -# Ignore comments when computing similarities. +# Comments are removed from the similarity computation ignore-comments=yes -# Ignore docstrings when computing similarities. +# Docstrings are removed from the similarity computation ignore-docstrings=yes -# Ignore imports when computing similarities. -ignore-imports=no +# Imports are removed from the similarity computation +ignore-imports=yes + +# Signatures are removed from the similarity computation +ignore-signatures=yes # Minimum lines number of a similarity. min-similarity-lines=4 @@ -389,26 +525,33 @@ min-similarity-lines=4 # Limits count of emitted suggestions for spelling mistakes. max-spelling-suggestions=4 -# Spelling dictionary name. Available dictionaries: none. To make it working -# install python-enchant package.. +# Spelling dictionary name. Available dictionaries: none. To make it work, +# install the 'python-enchant' package. spelling-dict= +# List of comma separated words that should be considered directives if they +# appear at the beginning of a comment and should not be checked. +spelling-ignore-comment-directives=fmt: on,fmt: off,noqa:,noqa,nosec,isort:skip,mypy: + # List of comma separated words that should not be checked. spelling-ignore-words= -# A path to a file that contains private dictionary; one word per line. +# A path to a file that contains the private dictionary; one word per line. spelling-private-dict-file= -# Tells whether to store unknown words to indicated private dictionary in -# --spelling-private-dict-file option instead of raising a message. +# Tells whether to store unknown words to the private dictionary (see the +# --spelling-private-dict-file option) instead of raising a message. spelling-store-unknown-words=no [STRING] -# This flag controls whether the implicit-str-concat-in-sequence should -# generate a warning on implicit string concatenation in sequences defined over -# several lines. +# This flag controls whether inconsistent-quotes generates a warning when the +# character used as a quote delimiter is used inconsistently within a module. +check-quote-consistency=no + +# This flag controls whether the implicit-str-concat should generate a warning +# on implicit string concatenation in sequences defined over several lines. check-str-concat-over-line-jumps=no @@ -424,10 +567,6 @@ contextmanager-decorators=contextlib.contextmanager # expressions are accepted. generated-members= -# Tells whether missing members accessed in mixin class should be ignored. A -# mixin class is detected if its name ends with "mixin" (case insensitive). -ignore-mixin-members=yes - # Tells whether to warn about missing members when the owner of the attribute # is inferred to be None. ignore-none=yes @@ -440,16 +579,16 @@ ignore-none=yes # the rest of the inferred objects. ignore-on-opaque-inference=yes +# List of symbolic message names to ignore for Mixin members. +ignored-checks-for-mixins=no-member, + not-async-context-manager, + not-context-manager, + attribute-defined-outside-init + # List of class names for which member attributes should not be checked (useful # for classes with dynamically set attributes). This supports the use of # qualified names. -ignored-classes=optparse.Values,thread._local,_thread._local - -# List of module names for which member attributes should not be checked -# (useful for modules/projects where namespaces are manipulated during runtime -# and thus existing member attributes cannot be deduced by static analysis. It -# supports qualified module names, as well as Unix pattern matching. -ignored-modules= +ignored-classes=optparse.Values,thread._local,_thread._local,argparse.Namespace # Show a hint with possible names when a member name was not found. The aspect # of finding the hint is based on edit distance. @@ -463,6 +602,12 @@ missing-member-hint-distance=1 # showing a hint for a missing member. missing-member-max-choices=1 +# Regex pattern to define which classes are considered mixins. +mixin-class-rgx=.*[Mm]ixin + +# List of decorators that change the signature of a decorated function. +signature-mutators= + [VARIABLES] @@ -473,6 +618,9 @@ additional-builtins= # Tells whether unused global variables should be treated as a violation. allow-global-unused-variables=yes +# List of names allowed to shadow builtins +allowed-redefined-builtins= + # List of strings which can identify a callback function by name. A callback # name must start or end with one of those strings. callbacks=cb_, @@ -492,99 +640,3 @@ init-import=no # List of qualified module names which can have objects that can redefine # builtins. redefining-builtins-modules=six.moves,past.builtins,future.builtins,builtins,io - - -[CLASSES] - -# List of method names used to declare (i.e. assign) instance attributes. -defining-attr-methods=__init__, - __new__, - setUp - -# List of member names, which should be excluded from the protected access -# warning. -exclude-protected=_asdict, - _fields, - _replace, - _source, - _make - -# List of valid names for the first argument in a class method. -valid-classmethod-first-arg=cls - -# List of valid names for the first argument in a metaclass class method. -valid-metaclass-classmethod-first-arg=cls - - -[DESIGN] - -# Maximum number of arguments for function / method. -max-args=5 - -# Maximum number of attributes for a class (see R0902). -max-attributes=7 - -# Maximum number of boolean expressions in an if statement. -max-bool-expr=5 - -# Maximum number of branch for function / method body. -max-branches=12 - -# Maximum number of locals for function / method body. -max-locals=15 - -# Maximum number of parents for a class (see R0901). -max-parents=7 - -# Maximum number of public methods for a class (see R0904). -max-public-methods=20 - -# Maximum number of return / yield for function / method body. -max-returns=6 - -# Maximum number of statements in function / method body. -max-statements=50 - -# Minimum number of public methods for a class (see R0903). -min-public-methods=2 - - -[IMPORTS] - -# Allow wildcard imports from modules that define __all__. -allow-wildcard-with-all=no - -# Analyse import fallback blocks. This can be used to support both Python 2 and -# 3 compatible code, which means that the block might have code that exists -# only in one or another interpreter, leading to false positives when analysed. -analyse-fallback-blocks=no - -# Deprecated modules which should not be used, separated by a comma. -deprecated-modules=optparse,tkinter.tix - -# Create a graph of external dependencies in the given file (report RP0402 must -# not be disabled). -ext-import-graph= - -# Create a graph of every (i.e. internal and external) dependencies in the -# given file (report RP0402 must not be disabled). -import-graph= - -# Create a graph of internal dependencies in the given file (report RP0402 must -# not be disabled). -int-import-graph= - -# Force import order to recognize a module as part of the standard -# compatibility libraries. -known-standard-library= - -# Force import order to recognize a module as part of a third party library. -known-third-party=enchant - - -[EXCEPTIONS] - -# Exceptions that will emit a warning when being caught. Defaults to -# "BaseException, Exception". -overgeneral-exceptions=BaseException, - Exception diff --git a/.config/.pynt b/.config/.pynt deleted file mode 100644 index 7d1faa7..0000000 --- a/.config/.pynt +++ /dev/null @@ -1,31 +0,0 @@ -[DEFAULT] -PROJECT_NAME = so_pip -SRC = . -PROBLEMS_FOLDER = reports -REPORTS_FOLDER = reports -VENV_SHELL = poetry run - -MINIMUM_TEST_COVERAGE = 20 - -# if 1, disables bandit. Bandit disallows all shell commands. -IS_SHELL_SCRIPT_LIKE = 0 - -; Below this there should be 0 lint, 0 mypy, etc. -; Above this follow maximum lint -SMALL_CODE_BASE_CUTOFF = 50 - -MAXIMUM_LINT = 6 -MAXIMUM_MYPY = 16 -MAXIMUM_DEAD_CODE = 500 -MAXIMUM_MANIFEST_ERRORS = 0 - -COMPLEXITY_CUT_OFF = 16 - -DOCKER_TAG=so_pip:pynt - -KNOWN_IP_PREFIX=111.111 -SPEAK_WHEN_BUILD_FAILS=True -RUN_ALL_TESTS_REGARDLESS_TO_NETWORK=True -PACKAGE_WITH=poetry -INSTALL_WITH=poetry -PIP_CHECK_SKIPS=jake diff --git a/.config/reqs.txt b/.config/reqs.txt deleted file mode 100644 index 3f80619..0000000 --- a/.config/reqs.txt +++ /dev/null @@ -1,97 +0,0 @@ -2to3==1.0 -apipkg==1.5 -appdirs==1.4.4 -atomicwrites==1.4.0 -attrs==20.3.0 -beautifulsoup4==4.9.3 -binary==1.0.0 -black==20.8b1 -cachetools==4.2.0 -certifi==2020.12.5 -cffi==1.14.4 -chardet==4.0.0 -click==7.1.2 -colorama==0.4.4 -colorclass==2.2.0 -coverage==5.3.1 -DataProperty==0.50.0 -docopt==0.6.2 -dominate==2.6.0 -execnet==1.7.1 -google-api-core==1.24.1 -google-auth==1.24.0 -google-cloud-bigquery==2.6.1 -google-cloud-core==1.5.0 -google-crc32c==1.1.0 -google-resumable-media==1.2.0 -googleapis-common-protos==1.52.0 -grpcio==1.34.0 -html2text==2020.1.16 -idna==2.10 -importlib-metadata==3.3.0 -iniconfig==1.1.1 -ipython-genutils==0.2.0 -Jinja2==2.11.2 -jsonschema==3.2.0 -jupyter-core==4.7.0 -MarkupSafe==1.1.1 -mbstrdecoder==1.0.1 -more-itertools==8.6.0 -msgfy==0.1.0 -mypy-extensions==0.4.3 -nbformat==5.0.8 -packaging==20.8 -pathspec==0.8.1 -pathvalidate==2.3.2 -pip-upgrader==1.4.15 -pipreqs==0.4.10 -pluggy==0.13.1 -proto-plus==1.13.0 -protobuf==3.14.0 -pur==5.3.0 -py==1.10.0 -py-stackexchange==2.2.7 -pyasn1==0.4.8 -pyasn1-modules==0.2.8 -pycparser==2.20 -pyflakes==2.2.0 -pyparsing==2.4.7 -pypinfo==17.0.0 -pypistats==0.12.1 -pyrankvote==2.0.2 -pyrsistent==0.17.3 -pytablewriter==0.58.0 -pytest==6.0.1 -pytest-cov==2.10.1 -pytest-forked==1.3.0 -pytest-timeout==1.4.2 -pytest-xdist==2.2.0 -python-dateutil==2.8.1 -python-dotenv==0.15.0 -python-slugify==4.0.1 -pytz==2020.5 -pyupgrade==2.7.4 -pywin32==300 -regex==2020.11.13 -requests==2.25.1 -rsa==4.6 -six==1.15.0 -soupsieve==2.1 -StackAPI==0.1.12 -stdlib-list==0.8.0 -tabledata==1.1.3 -tabulate==0.8.7 -tcolorpy==0.0.8 -terminaltables==3.1.0 -text-unidecode==1.3 -tinydb==4.3.0 -tinyrecord==0.2.0 -tokenize-rt==4.0.0 -toml==0.10.2 -traitlets==5.0.5 -typed-ast==1.4.2 -typepy==1.1.2 -typing-extensions==3.7.4.3 -urllib3==1.26.2 -yarg==0.1.9 -zipp==3.4.0 diff --git a/.config/requirements-dev-tox.txt b/.config/requirements-dev-tox.txt deleted file mode 100644 index ccf136b..0000000 --- a/.config/requirements-dev-tox.txt +++ /dev/null @@ -1,6 +0,0 @@ -# Just enough for tox to run tests, not a full build script - -pytest-cov>=2.10.1 -pytest-timeout -pytest-xdist>=2.1.0 -pytest==6.0.1 diff --git a/.config/requirements-dev.txt b/.config/requirements-dev.txt deleted file mode 100644 index bab514f..0000000 --- a/.config/requirements-dev.txt +++ /dev/null @@ -1,34 +0,0 @@ -################################################################################ -# This requirements file has been automatically generated from `Pipfile` with -# `pipenv-to-requirements` -# -# -# This has been done to maintain backward compatibility with tools and services -# that do not support `Pipfile` yet. -# -# Do NOT edit it directly, use `pipenv install [-d]` to modify `Pipfile` and -# `Pipfile.lock` and then regenerate `requirements*.txt`. -################################################################################ - -checksumdir==1.1.7 -dodgy==0.2.1 -gitchangelog==3.0.4 -gitpython -ifaddr -jake -libyear -liccheck==0.4.3 -navio-builder-win -pebble==4.5.0 -pip-check==2.6 -psutil==5.6.7 -pynt-contrib==0.2.0 -pynt==0.8.2 -pytest-cov>=2.10.1 -pytest-timeout -pytest-xdist>=2.1.0 -pytest==6.0.1 -setuptools-scm -sshtunnel -tox -vendorize diff --git a/.config/requirements.txt b/.config/requirements.txt deleted file mode 100644 index 3c875bb..0000000 --- a/.config/requirements.txt +++ /dev/null @@ -1,40 +0,0 @@ -################################################################################ -# This requirements file has been automatically generated from `Pipfile` with -# `pipenv-to-requirements` -# -# -# This has been done to maintain backward compatibility with tools and services -# that do not support `Pipfile` yet. -# -# Do NOT edit it directly, use `pipenv install [-d]` to modify `Pipfile` and -# `Pipfile.lock` and then regenerate `requirements*.txt`. -################################################################################ - -2to3 -astroid -beautifulsoup4 -black -diskcache -html2text -jinja2 -markdown -nbformat -pip-upgrader -pipreqs -pur -py-stackexchange -pyflakes -pypinfo -pypistats -pyrankvote -python-dotenv -pyupgrade -random-names -requests -slpp -slpp-23 -stackapi -stdlib-list -toml -vermin -whats-that-code>=0.1.10 diff --git a/.config/requirements_for_safety.txt b/.config/requirements_for_safety.txt deleted file mode 100644 index e969160..0000000 --- a/.config/requirements_for_safety.txt +++ /dev/null @@ -1,150 +0,0 @@ -2to3==1.0 -apipkg==1.5 -appdirs==1.4.4 -astroid==2.5.3 -atomicwrites==1.4.0 -attrs==20.3.0 -bcrypt==3.2.0 -beautifulsoup4==4.9.3 -binary==1.0.0 -black==20.8b1 -cachetools==4.1.0 -certifi==2020.11.8 -cffi==1.14.5 -chardet==3.0.4 -checksumdir==1.1.7 -click==7.1.2 -colorama==0.4.3 -colorclass==2.2.0 -configparser==5.0.2 -coverage==5.5 -cryptography==3.4.7 -DataProperty==0.50.1 -defusedxml==0.7.1 -diskcache==5.2.1 -distlib==0.3.1 -docopt==0.6.2 -dodgy==0.2.1 -dominate==2.6.0 -execnet==1.8.0 -filelock==3.0.12 -gitchangelog==3.0.4 -gitdb==4.0.7 -GitPython==3.1.14 -google-api-core==1.26.3 -google-auth==1.29.0 -google-cloud-bigquery==2.13.1 -google-cloud-core==1.6.0 -google-crc32c==1.1.2 -google-resumable-media==1.2.0 -googleapis-common-protos==1.53.0 -grpcio==1.37.0 -html2text==2020.1.16 -idna==2.10 -ifaddr==0.1.7 -iniconfig==1.1.1 -ipython-genutils==0.2.0 -isort==5.6.4 -jake==0.2.70 -Jinja2==2.11.3 -jsonschema==3.2.0 -jupyter-core==4.7.1 -lazy-object-proxy==1.4.3 -libyear==0.2.1 -liccheck==0.4.3 -lxml==4.6.3 -Markdown==3.3.4 -MarkupSafe==1.1.1 -mbstrdecoder==1.0.1 -mccabe==0.6.1 -more-itertools==8.7.0 -msgfy==0.1.0 -mypy-extensions==0.4.3 -navio-builder-win==0.1.57 -nbformat==5.1.3 -oyaml==0.9 -packaging==20.3 -paramiko==2.7.2 -pathspec==0.8.1 -pathvalidate==2.4.1 -Pebble==4.5.0 -pip-check==2.6 -pip-upgrader==1.4.15 -pipreqs==0.4.10 -pkginfo==1.5.0.1 -pluggy==0.13.1 -polling==0.3.1 -prettytable==2.1.0 -proto-plus==1.18.1 -protobuf==3.15.8 -psutil==5.6.7 -pur==5.4.0 -py==1.10.0 -py-stackexchange==2.2.7 -pyasn1==0.4.8 -pyasn1-modules==0.2.8 -pycparser==2.20 -pyfiglet==0.8.post1 -pyflakes==2.3.1 -Pygments==2.8.1 -PyNaCl==1.4.0 -pynt==0.8.2 -pynt-contrib==0.2.0 -pyparsing==2.4.7 -pypinfo==19.0.0 -pypistats==0.12.1 -pyrankvote==2.0.2 -pyrsistent==0.17.3 -pytablewriter==0.58.0 -pytest==6.0.1 -pytest-cov==2.11.1 -pytest-forked==1.3.0 -pytest-timeout==1.4.2 -pytest-xdist==2.2.1 -python-dateutil==2.8.1 -python-dotenv==0.17.0 -python-slugify==4.0.1 -pytz==2021.1 -pyupgrade==2.12.0 -pywin32==300 -PyYAML==5.4.1 -random-names==0.1.0 -regex==2021.4.4 -requests==2.25.0 -rsa==4.7.2 -semantic-version==2.8.5 -setuptools-scm==6.0.1 -sh==1.14.1 -six==1.15.0 -SLPP==1.2.3 -SLPP-23==1.1 -smmap==4.0.0 -soupsieve==2.2.1 -sshtunnel==0.4.0 -StackAPI==0.2.0 -stdlib-list==0.8.0 -tabledata==1.1.3 -tabulate==0.8.9 -tcolorpy==0.0.9 -termcolor==1.1.0 -terminaltables==3.1.0 -text-unidecode==1.3 -tinydb==4.4.0 -tinyrecord==0.2.0 -tokenize-rt==4.1.0 -toml==0.10.2 -tox==3.23.0 -traitlets==5.0.5 -typed-ast==1.4.3 -typepy==1.1.5 -typing-extensions==3.7.4.3 -urllib3==1.26.4 -vendorize==0.2.1 -vermin==1.1.0 -virtualenv==20.4.3 -wcwidth==0.2.5 -whats-that-code==0.1.11 -wimpy==0.6 -wrapt==1.12.1 -yarg==0.1.9 -yaspin==0.16.0 diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile new file mode 100644 index 0000000..b140d4f --- /dev/null +++ b/.devcontainer/Dockerfile @@ -0,0 +1,5 @@ +# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.245.0/containers/python-3/.devcontainer/base.Dockerfile + +# [Choice] Python version (use -bullseye variants on local arm64/Apple Silicon): 3, 3.10, 3.9, 3.8, 3.7, 3.6, 3-bullseye, 3.10-bullseye, 3.9-bullseye, 3.8-bullseye, 3.7-bullseye, 3.6-bullseye, 3-buster, 3.10-buster, 3.9-buster, 3.8-buster, 3.7-buster, 3.6-buster +# FROM mcr.microsoft.com/devcontainers/python:3.11-bullseye +FROM ghcr.io/matthewdeanmartin/convenient_py_devcontainer:latest diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..216b951 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,61 @@ +// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at: +// https://github.com/microsoft/vscode-dev-containers/tree/v0.245.0/containers/python-3 +{ + "name": "Python 3", + "forwardPorts": [8000], + "build": { + "dockerfile": "Dockerfile", + "context": ".." + }, + + // Configure tool-specific properties. + "customizations": { + // Configure properties specific to VS Code. + "vscode": { + // Set *default* container specific settings.json values on container create. + "settings": { + "python.defaultInterpreterPath": "/usr/local/bin/python", + "python.linting.enabled": true, + "python.linting.pylintEnabled": true, + "python.formatting.autopep8Path": "/usr/local/py-utils/bin/autopep8", + "python.formatting.blackPath": "/usr/local/py-utils/bin/black", + "python.formatting.yapfPath": "/usr/local/py-utils/bin/yapf", + "python.linting.banditPath": "/usr/local/py-utils/bin/bandit", + "python.linting.flake8Path": "/usr/local/py-utils/bin/flake8", + "python.linting.mypyPath": "/usr/local/py-utils/bin/mypy", + "python.linting.pycodestylePath": "/usr/local/py-utils/bin/pycodestyle", + "python.linting.pydocstylePath": "/usr/local/py-utils/bin/pydocstyle", + "python.linting.pylintPath": "/usr/local/py-utils/bin/pylint", + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true, + "workbench.startupEditor": "newUntitledFile" + }, + + // Add the IDs of extensions you want installed when the container is created. + "extensions": [ + "ms-python.python", + "ms-python.vscode-pylance" + ] + } + }, + + // Use 'forwardPorts' to make a list of ports inside the container available locally. + // "forwardPorts": [], + + // Use 'postCreateCommand' to run commands after the container is created. + "postCreateCommand": "poetry install --with dev", + + // Comment out to connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root. + "remoteUser": "vscode", + // "folders": [ + // { + // "path": ".devcontainer" + // } + // ], + "features": { + "ghcr.io/devcontainers-contrib/features/black:2": {}, + "ghcr.io/devcontainers-contrib/features/coverage-py:2": {}, + "ghcr.io/devcontainers-contrib/features/isort:2": {}, + "ghcr.io/devcontainers-contrib/features/pylint:2": {} + } +} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 0000000..d4ba91a --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,57 @@ +name: Build and Test + +on: [ push ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v4 + with: + python-version: '3.11' + cache: 'pipenv' # TODO: how to cache poetry? + - name: Install poetry + run: | + pip install poetry && pip install pipx + + - name: Install global dependencies + run: | + pipx install isort && pipx install black && pipx install bandit && pipx install pylint && \ + pipx install pre-commit && pipx install vulture && \ + pipx install safety && \ + pipx install poetry + + - name: Install Dependencies + run: poetry install --with dev + + - name: Run make + run: poetry run make check +# - name: Upload Package +# uses: actions/upload-artifact@v3.1.2 +# with: +# name: packages +# path: dist/ +# if-no-files-found: error +# retention-days: 1 +# +# +# pypi-publish: +# name: Upload release to PyPI +# runs-on: ubuntu-latest +# environment: +# name: pypi +# url: https://pypi.org/p/markpickle +# permissions: +# id-token: write # IMPORTANT: this permission is mandatory for trusted publishing +# # if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags') +# steps: +# - name: Get packages +# uses: actions/download-artifact@v3.0.2 +# with: +# name: packages +# path: dist/ +# - name: Publish package distributions to PyPI +# uses: pypa/gh-action-pypi-publish@release/v1 +# needs: build diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 86e068c..0000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,67 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - push: - branches: [ main ] - pull_request: - # The branches below must be a subset of the branches above - branches: [ main ] - schedule: - - cron: '25 17 * * 2' - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - - strategy: - fail-fast: false - matrix: - language: [ 'python' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed - - steps: - - name: Checkout repository - uses: actions/checkout@v2 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 - - # ℹ️ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl - - # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 diff --git a/.github_onhold/build_push_image.yml b/.github_onhold/build_push_image.yml new file mode 100644 index 0000000..07595c3 --- /dev/null +++ b/.github_onhold/build_push_image.yml @@ -0,0 +1,56 @@ +# This workflow uses actions that are not certified by GitHub. +# They are provided by a third-party and are governed by +# separate terms of service, privacy policy, and support +# documentation. + +# GitHub recommends pinning actions to a commit SHA. +# To get a newer version, you will need to update the SHA. +# You can also reference a tag or branch, but the action may change without warning. + +name: Publish Docker image + +on: + release: + types: [published] + +jobs: + push_to_registries: + name: Push Docker image to multiple registries + runs-on: ubuntu-latest + permissions: + packages: write + contents: read + environment: DEV + steps: + - name: Check out the repo + uses: actions/checkout@v3 + + - name: Log in to Docker Hub + uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 + with: + username: ${{ secrets.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Log in to the Container registry + uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + # my-docker-hub-namespace/my-docker-hub-repository + images: | + ghcr.io/${{ github.repository }} + + - name: Build and push Docker images + uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc + with: + file: docker/Dockerfile + context: . + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.gitignore b/.gitignore index b6e3682..15a5b65 100644 --- a/.gitignore +++ b/.gitignore @@ -145,3 +145,7 @@ output problems. reports/ + +.build_history/ + +cache4/ diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a225fea..5b7a86d 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,6 +1,6 @@ repos: - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v3.3.0 + rev: v4.4.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer @@ -8,7 +8,7 @@ repos: - id: check-added-large-files exclude: ^docs/conf.py$ - repo: https://github.com/psf/black - rev: 20.8b1 + rev: 22.12.0 hooks: - id: black args: [--target-version, py38] @@ -22,7 +22,7 @@ repos: # hooks: # - id: isort -- repo: https://github.com/jumanjihouse/pre-commit-hook-yamlfmt - rev: 0.1.0 # or specific tag - hooks: - - id: yamlfmt +#- repo: https://github.com/jumanjihouse/pre-commit-hook-yamlfmt +# rev: 0.2.2 # or specific tag +# hooks: +# - id: yamlfmt diff --git a/.so_pip.ini b/.so_pip.ini index 18b5686..3478b27 100644 --- a/.so_pip.ini +++ b/.so_pip.ini @@ -57,4 +57,4 @@ POSSIBLE_LANGUAGES = ['python','javascript','go','lua'] # cli client stuff [SHELL_CONFIG] -SHELL = pipenv run +SHELL = poetry run diff --git a/CHANGES.md b/CHANGES.md index cb42aff..3b7bc60 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -4,3 +4,7 @@ History 0.1.0 (Jan 1 2021) ----------------------- * Matthew Martin - Bringing this code into existence. + +1.0.0 (Nov 4, 2023) +----------------------- +* Matthew Martin - Redo build script, update for 3.12 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eb87bbd..d9bdb83 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -6,9 +6,9 @@ I personally am registering multiple keys for the same product. To run a build ``` git clone https://github.com/matthewdeanmartin/so_pip.git -pipenv install --dev --skip-lock +poetry install --with dev # todo list pipx installs, e.g. pylint, isort, etc. -pipenv shell +poetry shell # verify code python -m navio package # update version number... diff --git a/Makefile b/Makefile index b0cc317..8a9f3ad 100644 --- a/Makefile +++ b/Makefile @@ -1,69 +1,54 @@ -# -# Workflow -# install / install_setup_py / install_poetry -# check (reformats, tests, etc.) -# clean (remove old compiled files and packages) -# package / package_setup_py -# deploy / deploy_pipenv -# - +# isort . && black . && bandit -r . && pylint && pre-commit run --all-files # Get changed files -SRC := so_pip -SRC_FILES := $(wildcard so_pip/**/*.py) + FILES := $(wildcard **/*.py) -CONFIG_FOLDER := .config -# if you wrap everything in pipenv run, it runs slower. +# if you wrap everything in poetry run, it runs slower. ifeq ($(origin VIRTUAL_ENV),undefined) - VENV := pipenv run + VENV := poetry run else VENV := endif -Pipfile.lock: Pipfile +poetry.lock: pyproject.toml @echo "Installing dependencies" - @pipenv install --dev - -.PHONY: install -install: Pipfile.lock + @poetry install --with dev clean-pyc: - #@echo "Removing compiled files" - #@find . -name '*.pyc' -exec rm -f {} + - #@find . -name '*.pyo' -exec rm -f {} + - #@find . -name '__pycache__' -exec rm -fr {} + + @echo "Removing compiled files" +# @find . -name '*.pyc' -exec rm -f {} + || true +# @find . -name '*.pyo' -exec rm -f {} + || true +# @find . -name '__pycache__' -exec rm -fr {} + || true clean-test: - #@echo "Removing coverage data" - #@rm -f .coverage - #@rm -f .coverage.* + @echo "Removing coverage data" + @rm -f .coverage || true + @rm -f .coverage.* || true -clean: # clean-pyc clean-test +clean: clean-pyc clean-test # tests can't be expected to pass if dependencies aren't installed. # tests are often slow and linting is fast, so run tests on linted code. -unittest: clean-pyc .build_history/flake8 .build_history/bandit Pipfile.lock - @echo "Running unittest tests" - $(VENV) python -m unittest discover - -pytest: clean .build_history/flake8 .build_history/bandit Pipfile.lock - @echo "Running pytest tests" - $(VENV) py.test test --cov=$(SRC) --cov-report html:coverage --cov-fail-under 90 +test: clean .build_history/pylint .build_history/bandit poetry.lock + @echo "Running unit tests" + # $(VENV) pytest so_pip --doctest-modules # needs one test or it fails + # $(VENV) python -m unittest discover + $(VENV) py.test test/test_fast --cov=so_pip --cov-report=html --cov-fail-under 25 .build_history: @mkdir -p .build_history -.build_history/isort: .build_history $(SRC_FILES) +.build_history/isort: .build_history $(FILES) @echo "Formatting imports" - $(VENV) isort $(SRC) + $(VENV) isort so_pip @touch .build_history/isort .PHONY: isort isort: .build_history/isort -.build_history/black: .build_history .build_history/isort $(SRC_FILES) +.build_history/black: .build_history .build_history/isort $(FILES) @echo "Formatting code" - $(VENV) black $(SRC) + $(VENV) black so_pip test docs --exclude .virtualenv --exclude .tox --exclude .venv @touch .build_history/black .PHONY: black @@ -77,73 +62,49 @@ black: .build_history/black .PHONY: pre-commit pre-commit: .build_history/pre-commit -.build_history/bandit: .build_history $(SRC_FILES) +.build_history/bandit: .build_history $(FILES) @echo "Security checks" - $(VENV) bandit $(SRC) + $(VENV) bandit . @touch .build_history/bandit .PHONY: bandit bandit: .build_history/bandit -.build_history/flake8: .build_history .build_history/isort .build_history/black $(SRC_FILES) - @echo "Linting with flake8" - $(VENV) flake8 --config $(CONFIG_FOLDER)/.flake8 $(SRC) - @touch .build_history/flake8 - -.PHONY: flake8 -flake8: .build_history/flake8 +.PHONY: pylint +.build_history/pylint: .build_history .build_history/isort .build_history/black $(FILES) + @echo "Linting with pylint" + $(VENV) pylint so_pip --fail-under 9.9 --rcfile .config/.pylintrc + @touch .build_history/pylint # for when using -j (jobs, run in parallel) .NOTPARALLEL: .build_history/isort .build_history/black -.PHONY: deploy -package_setup_py: clean - @echo package for later deployment with pip - @echo Wheel packaging has more failure points, particularly with omitting files. - python setup.py build sdist - -package: clean $(SRC_FILES) - @echo package with poetry for later deployment with pip - @echo You do not need to use poetry for dependency installation, but pyproject.toml will need to be up to date. - poetry build - -.PHONY: deploy -deploy_pipenv: clean - @echo Deploying from pip lock file. - @echo Assumes you've copied your source to destination and want to install the exact dependencies - @echo If you are using setup.py or poetry or flit for packaging, you don't need pipenv sync. - pipenv sync - -check: pytest flake8 bandit pre-commit - -define BUMP_VERSION_PY -from setuptools_scm import get_version -from setuptools_scm.version import guess_next_version +.build_history/mypy: .build_history $(FILES) + @echo "Mypy checks" + $(VENV) mypy so_pip + @touch .build_history/mypy -def version_scheme(version): - verstr = str(version.tag) - ver = verstr.split(".") - return "{}.{}.{}".format(ver[0],ver[1],int(ver[2])+1) +.PHONY: mypy +mypy: .build_history/mypy -v = get_version( - version_scheme=version_scheme, - local_scheme=lambda *args, **kwargs:"", -) -print(guess_next_version(v)) -endef -export BUMP_VERSION_PY - -NEXT_VERSION_BASH := $(VENV) python -c "$$BUMP_VERSION_PY" - -bump_version: - # current version, assuming at least one tag of say, 0.1.0 - echo $(NEXT_VERSION_BASH) - # echo - export NEXT_VERSION= - @echo - git tag "$$($(NEXT_VERSION_BASH))" - git commit -m bump version to $$NEXT_VERSION +deploy: + rm -rf dist + poetry version patch + poetry build + pipx uninstall so_pip + pipx install dist/so_pip-*.whl --force +check: test pylint bandit pre-commit mypy +.PHONY: publish +publish: check + rm -rf dist && poetry build -.DEFAULT_GOAL := check +# Use github to publish +#.PHONY: publish +#publish_test: +# rm -rf dist && poetry version minor && poetry build && twine upload -r testpypi dist/* +# +#.PHONY: publish +#publish: test +# echo "rm -rf dist && poetry version minor && poetry build && twine upload dist/*" diff --git a/Pipfile.lock b/Pipfile.lock deleted file mode 100644 index dd84837..0000000 --- a/Pipfile.lock +++ /dev/null @@ -1,1795 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "325b495602656678174abea7594bcbf3ce04510f4ae4f4f866e186bb7f1273a7" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.8" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "2to3": { - "hashes": [ - "sha256:958bc212c928bbdcbc778b72528e0a39ae4ee8040eda6af6c3b5dd640c98ce6d", - "sha256:a39fb204829c6ed90be1507f3aff1c2b4fa6734585d57a50286f039546b5fb7f" - ], - "index": "pypi", - "version": "==1.0" - }, - "appdirs": { - "hashes": [ - "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", - "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" - ], - "version": "==1.4.4" - }, - "astroid": { - "hashes": [ - "sha256:2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703", - "sha256:bc58d83eb610252fd8de6363e39d4f1d0619c894b0ed24603b881c02e64c7386" - ], - "index": "pypi", - "version": "==2.4.2" - }, - "attrs": { - "hashes": [ - "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", - "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.3.0" - }, - "beautifulsoup4": { - "hashes": [ - "sha256:4c98143716ef1cb40bf7f39a8e3eec8f8b009509e74904ba3a7b315431577e35", - "sha256:84729e322ad1d5b4d25f805bfa05b902dd96450f43842c4e99067d5e1369eb25", - "sha256:fff47e031e34ec82bf17e00da8f592fe7de69aeea38be00523c04623c04fb666" - ], - "index": "pypi", - "version": "==4.9.3" - }, - "binary": { - "hashes": [ - "sha256:6ec010e58f7331ebc8bc9638dbe6c66d635de60d5818b0723bef4dead0ec28a6", - "sha256:e1b61f3a5c002717d1a28e4d9d2dc8acbc9d6b12baf7b1e4ab25d743da97e323" - ], - "version": "==1.0.0" - }, - "black": { - "hashes": [ - "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea" - ], - "index": "pypi", - "version": "==20.8b1" - }, - "cachetools": { - "hashes": [ - "sha256:1d9d5f567be80f7c07d765e21b814326d78c61eb0c3a637dffc0e5d1796cb2e2", - "sha256:f469e29e7aa4cff64d8de4aad95ce76de8ea1125a16c68e0d93f65c3c3dc92e9" - ], - "markers": "python_version ~= '3.5'", - "version": "==4.2.1" - }, - "certifi": { - "hashes": [ - "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", - "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" - ], - "version": "==2020.12.5" - }, - "cffi": { - "hashes": [ - "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e", - "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d", - "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a", - "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec", - "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362", - "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668", - "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c", - "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b", - "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06", - "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698", - "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2", - "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c", - "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7", - "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009", - "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03", - "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b", - "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909", - "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53", - "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35", - "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26", - "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b", - "sha256:a5ed8c05548b54b998b9498753fb9cadbfd92ee88e884641377d8a8b291bcc01", - "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb", - "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293", - "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd", - "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d", - "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3", - "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d", - "sha256:d5ff0621c88ce83a28a10d2ce719b2ee85635e85c515f12bac99a95306da4b2e", - "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca", - "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d", - "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775", - "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375", - "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b", - "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b", - "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f" - ], - "version": "==1.14.4" - }, - "chardet": { - "hashes": [ - "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", - "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.0.0" - }, - "click": { - "hashes": [ - "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", - "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==7.1.2" - }, - "colorclass": { - "hashes": [ - "sha256:b05c2a348dfc1aff2d502527d78a5b7b7e2f85da94a96c5081210d8e9ee8e18b" - ], - "version": "==2.2.0" - }, - "dataproperty": { - "hashes": [ - "sha256:847f2d8927d8426a0eb20e48238e2db19133506bcd1e2608e21314004fa80d72", - "sha256:9288b74f5d6e07d4c69c218802556f877d711fce2c62abc6aea286b357e84be2" - ], - "markers": "python_version >= '3.5'", - "version": "==0.50.0" - }, - "defusedxml": { - "hashes": [ - "sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93", - "sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==0.6.0" - }, - "diskcache": { - "hashes": [ - "sha256:1805acd5868ac10ad547208951a1190a0ab7bbff4e70f9a07cde4dbdfaa69f64", - "sha256:6e8137c778fd2752b93c8a8f944e939b3665d645b46774d8537dd3528ac3baa1" - ], - "index": "pypi", - "version": "==5.2.1" - }, - "docopt": { - "hashes": [ - "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" - ], - "version": "==0.6.2" - }, - "dominate": { - "hashes": [ - "sha256:76ec2cde23700a6fc4fee098168b9dee43b99c2f1dd0ca6a711f683e8eb7e1e4", - "sha256:84b5f71ed30021193cb0faa45d7776e1083f392cfe67a49f44e98cb2ed76c036" - ], - "version": "==2.6.0" - }, - "google-api-core": { - "extras": [ - "grpc" - ], - "hashes": [ - "sha256:0e152ec37b8481d1be1258d95844a5a7031cd3d83d7c7046d9e9b2d807042440", - "sha256:292dd636ed381098d24b7093ccb826b2278a12d886a3fc982084069aa24a8fbb" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.25.1" - }, - "google-auth": { - "hashes": [ - "sha256:0b0e026b412a0ad096e753907559e4bdb180d9ba9f68dd9036164db4fdc4ad2e", - "sha256:ce752cc51c31f479dbf9928435ef4b07514b20261b021c7383bee4bda646acb8" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.24.0" - }, - "google-cloud-bigquery": { - "hashes": [ - "sha256:29721972f5e539e486fbdc722ddf849ad86acd092680d16c271430dc16023544", - "sha256:c80f0412a332cb3e75a09383815b21ec3cea292055f0990de45ff436032681fa" - ], - "markers": "python_version < '3.10' and python_version >= '3.6'", - "version": "==2.7.0" - }, - "google-cloud-core": { - "hashes": [ - "sha256:1277a015f8eeb014c48f2ec094ed5368358318f1146cf49e8de389962dc19106", - "sha256:99a8a15f406f53f2b11bda1f45f952a9cdfbdbba8abf40c75651019d800879f5" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.5.0" - }, - "google-crc32c": { - "hashes": [ - "sha256:0ae3cf54e0d4d83c8af1afe96fc0970fbf32f1b29275f3bfd44ce25c4b622a2b", - "sha256:0dd9b61d0c63043b013349c9ec8a83ec2b05c96410c5bc257da5d0de743fc171", - "sha256:110157fb19ab5db15603debfaf5fcfbac9627576787d9caf8618ff96821a7a1f", - "sha256:1dc6904c0d958f43102c85d70792cca210d3d051ddbeecd0eff10abcd981fdfa", - "sha256:298a9a922d35b123a73be80233d0f19c6ea01f008743561a8937f9dd83fb586b", - "sha256:34a97937f164147aefa53c3277364fd3bfa7fd244cbebbd5a976fa8325fb496b", - "sha256:364eb36e8d9d34542c17b0c410035b0557edd4300a92ed736b237afaa0fd6dae", - "sha256:49838ede42592154f9fcd21d07c7a43a67b00a36e252f82ae72542fde09dc51f", - "sha256:51f4aa06125bf0641f65fb83268853545dbeb36b98ccfec69ef57dcb6b73b176", - "sha256:6789db0b12aab12a0f04de22ed8412dfa5f6abd5a342ea19f15355064e1cc387", - "sha256:78cf5b1bd30f3a6033b41aa4ce8c796870bc4645a15d3ef47a4b05d31b0a6dc1", - "sha256:7c5138ed2e815189ba524756e027ac5833365e86115b1c2e6d9e833974a58d82", - "sha256:80abca603187093ea089cd1215c3779040dda55d3cdabc0cd5ea0e10df7bff99", - "sha256:8ed8f6dc4f55850cba2eb22b78902ad37f397ee02692d3b8e00842e9af757321", - "sha256:91ad96ee2958311d0bb75ffe5c25c87fb521ef547c09e04a8bb6143e75fb1367", - "sha256:92ed6062792b989e84621e07a5f3d37da9cc3153b77d23a582921f14863af31d", - "sha256:9372211acbcc207f63ffaffea1d05f3244a21311e4710721ffff3e8b7a0d24d0", - "sha256:a64e0e8ed6076a8d867fc4622ad821c55eba8dff1b48b18f56b7c2392e22ab9d", - "sha256:a6c8a712ffae56c805ca732b735af02860b246bed2c1acb38ea954a8b2dc4581", - "sha256:ab2b31395fbeeae6d15c98bd7f8b9fb76a18f18f87adc11b1f6dbe8f90d8382f", - "sha256:ae7b9e7e2ca1b06c3a68b6ef223947a52c30ffae329b1a2be3402756073f2732", - "sha256:b5ea1055fe470334ced844270e7c808b04fe31e3e6394675daa77f6789ca9eff", - "sha256:d0630670d27785d7e610e72752dc8087436d00d2c7115e149c0a754babb56d3e", - "sha256:d4a0d4fb938c2c3c0076445c9bd1215a3bd3df557b88d8b05ec2889ca0c92f8d", - "sha256:dff5bd1236737f66950999d25de7a78144548ebac7788d30ada8c1b6ead60b27", - "sha256:e5af77656e8d367701f40f80a91c985ca43319f322f0a36ba9f93909d0bc4cb2", - "sha256:e6458c41236d37cb982120b070ebcc115687c852bee24cdd18792da2640cf44d", - "sha256:ea170341a4a9078a067b431044cd56c73553425833a7c2bb81734777a230ad4b", - "sha256:ef2ed6d0ac4de4ac602903e203eccd25ec8e37f1446fe1a3d2953a658035e0a5" - ], - "markers": "python_version >= '3.5'", - "version": "==1.1.2" - }, - "google-resumable-media": { - "hashes": [ - "sha256:dbe670cd7f02f3586705fd5a108c8ab8552fa36a1cad8afbc5a54e982cf34f0c", - "sha256:ee98b1921e5bda94867a08c864e55b4763d63887664f49ee1c231988f56b9d43" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==1.2.0" - }, - "googleapis-common-protos": { - "hashes": [ - "sha256:560716c807117394da12cecb0a54da5a451b5cf9866f1d37e9a5e2329a665351", - "sha256:c8961760f5aad9a711d37b675be103e0cc4e9a39327e0d6d857872f698403e24" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.52.0" - }, - "grpcio": { - "hashes": [ - "sha256:0072ec4563ab4268c4c32e936955085c2d41ea175b662363496daedd2273372c", - "sha256:048c01d1eb5c2ae7cba2254b98938d2fc81f6dc10d172d9261d65266adb0fdb3", - "sha256:088c8bea0f6b596937fefacf2c8df97712e7a3dd49496975049cc95dbf02af1a", - "sha256:0f714e261e1d63615476cda4ee808a79cca62f8f09e2943c136c2f87ec5347b1", - "sha256:16fd33030944672e49e0530dec2c60cd4089659ccdf327e99569b3b29246a0b6", - "sha256:1757e81c09132851e85495b802fe4d4fbef3547e77fa422a62fb4f7d51785be0", - "sha256:17940a7dc461066f28816df48be44f24d3b9f150db344308ee2aeae033e1af0b", - "sha256:18ad7644e23757420ea839ac476ef861e4f4841c8566269b7c91c100ca1943b3", - "sha256:1aa53f82362c7f2791fe0cdd9a3b3aec325c11d8f0dfde600f91907dfaa8546b", - "sha256:22edfc278070d54f3ab7f741904e09155a272fe934e842babbf84476868a50de", - "sha256:2f8e8d35d4799aa1627a212dbe8546594abf4064056415c31bd1b3b8f2a62027", - "sha256:35b72884e09cbc46c564091f4545a39fa66d132c5676d1a6e827517fff47f2c1", - "sha256:399ee377b312ac652b07ef4365bbbba009da361fa7708c4d3d4ce383a1534ea7", - "sha256:3e7d4428ed752fdfe2dddf2a404c93d3a2f62bf4b9109c0c10a850c698948891", - "sha256:44aaa6148d18a8e836f99dadcdec17b27bc7ec0995b2cc12c94e61826040ec90", - "sha256:6ba3d7acf70acde9ce27e22921db921b84a71be578b32739536c32377b65041a", - "sha256:75ea903edc42a8c6ec61dbc5f453febd79d8bdec0e1bad6df7088c34282e8c42", - "sha256:764b50ba1a15a2074cdd1a841238f2dead0a06529c495a46821fae84cb9c7342", - "sha256:7ae408780b79c9b9b91a2592abd1d7abecd05675d988ea75038580f420966b59", - "sha256:7bd0ebbb14dde78bf66a1162efd29d3393e4e943952e2f339757aa48a184645c", - "sha256:7ee7d54da9d176d3c9a0f47c04d7ff6fdc6ee1c17643caff8c33d6c8a70678a4", - "sha256:859a0ceb23d7189362cc06fe7e906e9ed5c7a8f3ac960cc04ce13fe5847d0b62", - "sha256:87147b1b306c88fe7dca7e3dff8aefd1e63d6aed86e224f9374ddf283f17d7f1", - "sha256:8a29a26b9f39701ce15aa1d5aa5e96e0b5f7028efe94f95341a4ed8dbe4bed78", - "sha256:8d08f90d72a8e8d9af087476337da76d26749617b0a092caff4e684ce267af21", - "sha256:94c3b81089a86d3c5877d22b07ebc66b5ed1d84771e24b001844e29a5b6178dd", - "sha256:95cc4d2067deced18dc807442cf8062a93389a86abf8d40741120054389d3f29", - "sha256:9e503eaf853199804a954dc628c5207e67d6c7848dcba42a997fbe718618a2b1", - "sha256:9f0da13b215068e7434b161a35d0b4e92140ffcfa33ddda9c458199ea1d7ce45", - "sha256:a36151c335280b09afd5123f3b25085027ae2b10682087a4342fb6f635b928fb", - "sha256:aca45d2ccb693c9227fbf21144891422a42dc4b76b52af8dd1d4e43afebe321d", - "sha256:acb489b7aafdcf960f1a0000a1f22b45e5b6ccdf8dba48f97617d627f4133195", - "sha256:aea3d592a7ece84739b92d212cd16037c51d84a259414f64b51c14e946611f3d", - "sha256:b180a3ec4a5d6f96d3840c83e5f8ab49afac9fa942921e361b451d7a024efb00", - "sha256:b2985f73611b637271b00d9c4f177e65cc3193269bc9760f16262b1a12757265", - "sha256:c8d0a6a58a42275c6cb616e7cb9f9fcf5eba1e809996546e561cd818b8f7cff7", - "sha256:d186a0ce291f4386e28a7042ec31c85250b0c2e25d2794b87fa3c15ff473c46c", - "sha256:da44bf613eed5d9e8df0785463e502a416de1be6e4ac31edbe99c9111abaed5f", - "sha256:dc2589370ef84eb1cc53530070d658a7011d2ee65f18806581809c11cd016136", - "sha256:dfecb2acd3acb8bb50e9aa31472c6e57171d97c1098ee67cd283a6fe7d56a926", - "sha256:e163c27d2062cd3eb07057f23f8d1330925beaba16802312b51b4bad33d74098", - "sha256:e87e55fba98ebd7b4c614dcef9940dc2a7e057ad8bba5f91554934d47319a35b", - "sha256:efb3d67405eb8030db6f27920b4be023fabfb5d4e09c34deab094a7c473a5472", - "sha256:efd896e8ca7adb2654cf014479a5e1f74e4f776b6b2c0fbf95a6c92787a6631a", - "sha256:f0c27fd16582a303e5baf6cffd9345c9ac5f855d69a51232664a0b888a77ba80", - "sha256:f3654a52f72ba28953dbe2e93208099f4903f4b3c07dc7ff4db671c92968111d" - ], - "version": "==1.35.0" - }, - "html2text": { - "hashes": [ - "sha256:c7c629882da0cf377d66f073329ccf34a12ed2adf0169b9285ae4e63ef54c82b", - "sha256:e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb" - ], - "index": "pypi", - "version": "==2020.1.16" - }, - "idna": { - "hashes": [ - "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", - "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.10" - }, - "ipython-genutils": { - "hashes": [ - "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8", - "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8" - ], - "version": "==0.2.0" - }, - "jinja2": { - "hashes": [ - "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0", - "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035" - ], - "index": "pypi", - "version": "==2.11.2" - }, - "jsonschema": { - "hashes": [ - "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", - "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" - ], - "version": "==3.2.0" - }, - "jupyter-core": { - "hashes": [ - "sha256:0a451c9b295e4db772bdd8d06f2f1eb31caeec0e81fbb77ba37d4a3024e3b315", - "sha256:aa1f9496ab3abe72da4efe0daab0cb2233997914581f9a071e07498c6add8ed3" - ], - "markers": "python_version >= '3.6'", - "version": "==4.7.0" - }, - "lazy-object-proxy": { - "hashes": [ - "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d", - "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449", - "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08", - "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a", - "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50", - "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd", - "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239", - "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb", - "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea", - "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e", - "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156", - "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142", - "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442", - "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62", - "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db", - "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531", - "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383", - "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a", - "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357", - "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4", - "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.3" - }, - "markdown": { - "hashes": [ - "sha256:5d9f2b5ca24bc4c7a390d22323ca4bad200368612b5aaa7796babf971d2b2f18", - "sha256:c109c15b7dc20a9ac454c9e6025927d44460b85bd039da028d85e2b6d0bcc328" - ], - "index": "pypi", - "version": "==3.3.3" - }, - "markupsafe": { - "hashes": [ - "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473", - "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161", - "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235", - "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5", - "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42", - "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f", - "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39", - "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff", - "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b", - "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014", - "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f", - "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1", - "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e", - "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183", - "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66", - "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b", - "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1", - "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15", - "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1", - "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85", - "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1", - "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e", - "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b", - "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905", - "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850", - "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0", - "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735", - "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d", - "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb", - "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e", - "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d", - "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c", - "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1", - "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2", - "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21", - "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2", - "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5", - "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7", - "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b", - "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8", - "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6", - "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193", - "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f", - "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b", - "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f", - "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2", - "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5", - "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c", - "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032", - "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7", - "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be", - "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.1.1" - }, - "mbstrdecoder": { - "hashes": [ - "sha256:56b967800d6554815a6b18f98f915e84912852eff21d94d5e036fe124bc27f53", - "sha256:f895e1fb97496855ab5e43de99588787169c01f782c71625142d1a62729e9f9d" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "msgfy": { - "hashes": [ - "sha256:474c08302cd56ccee1300ac7976a01ebd1e42716fc9bcd947d39a311a15b7012", - "sha256:ce8a8c8c223279fa0a2c0f278eec139fcf761ca4eb98f179f54a1b96f53514f5" - ], - "markers": "python_version >= '3.5'", - "version": "==0.1.0" - }, - "mypy-extensions": { - "hashes": [ - "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", - "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8" - ], - "version": "==0.4.3" - }, - "nbformat": { - "hashes": [ - "sha256:1d223e64a18bfa7cdf2db2e9ba8a818312fc2a0701d2e910b58df66809385a56", - "sha256:3949fdc8f5fa0b1afca16fb307546e78494fa7a7bceff880df8168eafda0e7ac" - ], - "index": "pypi", - "version": "==5.1.2" - }, - "packaging": { - "hashes": [ - "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", - "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.9" - }, - "pathspec": { - "hashes": [ - "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd", - "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d" - ], - "version": "==0.8.1" - }, - "pathvalidate": { - "hashes": [ - "sha256:378c8b319838a255c00ab37f664686b75f0aabea4444d6c5a34effbec6738285", - "sha256:cae8ad5cd9223c5c1f4bc4e2ef0cd4c5e89acd2d698fdb7610ee108b9be654d2" - ], - "markers": "python_version >= '3.5'", - "version": "==2.3.2" - }, - "pip-upgrader": { - "hashes": [ - "sha256:7ddfdfa3b6664469c00b50d23f3ed082d61b16babd0729f9d52090add54abdca", - "sha256:ec07b93e06825d9cf40f475a8e021fc9d288446b479b40cb9aba406a6db65347" - ], - "index": "pypi", - "version": "==1.4.15" - }, - "pipreqs": { - "hashes": [ - "sha256:9e351d644b28b98d7386b046a73806cbb3bb66b23a30e74feeb95ed9571db939", - "sha256:cafe42ab70628d408c147fb8944bc303355ea8f91fddca4a98d273e572e39905" - ], - "index": "pypi", - "version": "==0.4.10" - }, - "proto-plus": { - "hashes": [ - "sha256:61b57c5257ca583af2ea1ad40e2b8f251988806eea9f01d119088976b995b2c4" - ], - "markers": "python_version >= '3.6'", - "version": "==1.13.0" - }, - "protobuf": { - "hashes": [ - "sha256:0e247612fadda953047f53301a7b0407cb0c3cb4ae25a6fde661597a04039b3c", - "sha256:0fc96785262042e4863b3f3b5c429d4636f10d90061e1840fce1baaf59b1a836", - "sha256:1c51fda1bbc9634246e7be6016d860be01747354ed7015ebe38acf4452f470d2", - "sha256:1d63eb389347293d8915fb47bee0951c7b5dab522a4a60118b9a18f33e21f8ce", - "sha256:22bcd2e284b3b1d969c12e84dc9b9a71701ec82d8ce975fdda19712e1cfd4e00", - "sha256:2a7e2fe101a7ace75e9327b9c946d247749e564a267b0515cf41dfe450b69bac", - "sha256:43b554b9e73a07ba84ed6cf25db0ff88b1e06be610b37656e292e3cbb5437472", - "sha256:4b74301b30513b1a7494d3055d95c714b560fbb630d8fb9956b6f27992c9f980", - "sha256:4e75105c9dfe13719b7293f75bd53033108f4ba03d44e71db0ec2a0e8401eafd", - "sha256:5b7a637212cc9b2bcf85dd828b1178d19efdf74dbfe1ddf8cd1b8e01fdaaa7f5", - "sha256:5e9806a43232a1fa0c9cf5da8dc06f6910d53e4390be1fa06f06454d888a9142", - "sha256:629b03fd3caae7f815b0c66b41273f6b1900a579e2ccb41ef4493a4f5fb84f3a", - "sha256:72230ed56f026dd664c21d73c5db73ebba50d924d7ba6b7c0d81a121e390406e", - "sha256:86a75477addde4918e9a1904e5c6af8d7b691f2a3f65587d73b16100fbe4c3b2", - "sha256:8971c421dbd7aad930c9bd2694122f332350b6ccb5202a8b7b06f3f1a5c41ed5", - "sha256:9616f0b65a30851e62f1713336c931fcd32c057202b7ff2cfbfca0fc7d5e3043", - "sha256:b0d5d35faeb07e22a1ddf8dce620860c8fe145426c02d1a0ae2688c6e8ede36d", - "sha256:ecc33531a213eee22ad60e0e2aaea6c8ba0021f0cce35dbf0ab03dee6e2a23a1" - ], - "version": "==3.14.0" - }, - "pur": { - "hashes": [ - "sha256:8587c548469bcd8f47e1f7bd1cae3c11d9cd9c2e4219c86d08499b8efdfe1e05" - ], - "index": "pypi", - "version": "==5.3.0" - }, - "py-stackexchange": { - "hashes": [ - "sha256:848bf85d98b95706750c61572fc2a2677cb8566e96b078bbe6261f0e2d8252b4" - ], - "index": "pypi", - "version": "==2.2.7" - }, - "pyasn1": { - "hashes": [ - "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359", - "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576", - "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf", - "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7", - "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d", - "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00", - "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8", - "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86", - "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12", - "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776", - "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba", - "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2", - "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3" - ], - "version": "==0.4.8" - }, - "pyasn1-modules": { - "hashes": [ - "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8", - "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199", - "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811", - "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed", - "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4", - "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e", - "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74", - "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb", - "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45", - "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd", - "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0", - "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d", - "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405" - ], - "version": "==0.2.8" - }, - "pycparser": { - "hashes": [ - "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", - "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.20" - }, - "pyflakes": { - "hashes": [ - "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92", - "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8" - ], - "index": "pypi", - "version": "==2.2.0" - }, - "pygments": { - "hashes": [ - "sha256:bc9591213a8f0e0ca1a5e68a479b4887fdc3e75d0774e5c71c31920c427de435", - "sha256:df49d09b498e83c1a73128295860250b0b7edd4c723a32e9bc0d295c7c2ec337" - ], - "markers": "python_version >= '3.5'", - "version": "==2.7.4" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" - }, - "pypinfo": { - "hashes": [ - "sha256:0977a0bd8b62a0ab91e3ce10291b60a85b3484d2836595f481f64ae6b773a81c", - "sha256:2be463e6a85a6feebe1ab56c720d72e8a16f6662432f9dd68fa0356459242b89" - ], - "index": "pypi", - "version": "==18.0.1" - }, - "pypistats": { - "hashes": [ - "sha256:7148ca8776f0e94c6a96a670014bb9e66ea4cbcde352110480eb30aaa4522614", - "sha256:e3c8f535d24c0e877d2802a0e714448fbc48c53b81fb114416ed6dfefbe404cc" - ], - "index": "pypi", - "version": "==0.12.1" - }, - "pyrankvote": { - "hashes": [ - "sha256:0f5061c5b400f04daff69ce43938cdb662bb8b6e77b93bce25743f679cbd0d53", - "sha256:62f5d26ae73ea098be80b2cfdfa46f8c40aed8983eadf1a1a5de3369160bcb50" - ], - "index": "pypi", - "version": "==2.0.2" - }, - "pyrsistent": { - "hashes": [ - "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e" - ], - "markers": "python_version >= '3.5'", - "version": "==0.17.3" - }, - "pytablewriter": { - "extras": [ - "html" - ], - "hashes": [ - "sha256:763fb7717b64320188b2f55c5667f9f03c6fef3b00ac0aaafa85b6b6f2741b36", - "sha256:d232491e32fc84f28a6217fcd225d2ed82ae59d576d39724c98fdb7c7147b9ec" - ], - "markers": "python_version >= '3.5'", - "version": "==0.58.0" - }, - "python-dateutil": { - "hashes": [ - "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", - "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" - ], - "version": "==2.8.1" - }, - "python-dotenv": { - "hashes": [ - "sha256:0c8d1b80d1a1e91717ea7d526178e3882732420b03f08afea0406db6402e220e", - "sha256:587825ed60b1711daea4832cf37524dfd404325b7db5e25ebe88c495c9f807a0" - ], - "index": "pypi", - "version": "==0.15.0" - }, - "python-slugify": { - "hashes": [ - "sha256:69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270" - ], - "version": "==4.0.1" - }, - "pytz": { - "hashes": [ - "sha256:16962c5fb8db4a8f63a26646d8886e9d769b6c511543557bc84e9569fb9a9cb4", - "sha256:180befebb1927b16f6b57101720075a984c019ac16b1b7575673bea42c6c3da5" - ], - "version": "==2020.5" - }, - "pyupgrade": { - "hashes": [ - "sha256:ab2f47377e977bec8dd41db634fde35bce78fedd2be0e8b189fe687f23fb1d85", - "sha256:e57057ccef3fd8e8fad5ba9f365c1288a076271a222ccb502d865c0d8fe16c3a" - ], - "index": "pypi", - "version": "==2.7.4" - }, - "pywin32": { - "hashes": [ - "sha256:1c204a81daed2089e55d11eefa4826c05e604d27fe2be40b6bf8db7b6a39da63", - "sha256:27a30b887afbf05a9cbb05e3ffd43104a9b71ce292f64a635389dbad0ed1cd85", - "sha256:350c5644775736351b77ba68da09a39c760d75d2467ecec37bd3c36a94fbed64", - "sha256:60a8fa361091b2eea27f15718f8eb7f9297e8d51b54dbc4f55f3d238093d5190", - "sha256:638b68eea5cfc8def537e43e9554747f8dee786b090e47ead94bfdafdb0f2f50", - "sha256:8151e4d7a19262d6694162d6da85d99a16f8b908949797fd99c83a0bfaf5807d", - "sha256:a3b4c48c852d4107e8a8ec980b76c94ce596ea66d60f7a697582ea9dce7e0db7", - "sha256:b1609ce9bd5c411b81f941b246d683d6508992093203d4eb7f278f4ed1085c3f", - "sha256:d7e8c7efc221f10d6400c19c32a031add1c4a58733298c09216f57b4fde110dc", - "sha256:fbb3b1b0fbd0b4fc2a3d1d81fe0783e30062c1abed1d17c32b7879d55858cfae" - ], - "markers": "sys_platform == 'win32'", - "version": "==300" - }, - "random-names": { - "hashes": [ - "sha256:8f4af6952b4b70d7cf8a7c9a0211fd8593cee42fe364debbfbf596e918cee923", - "sha256:b7d83e7ee38c767cb506f34c3d6bc7df3d96f556547bc191b6ffced5f34214b8" - ], - "index": "pypi", - "version": "==0.1.0" - }, - "regex": { - "hashes": [ - "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538", - "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4", - "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc", - "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa", - "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444", - "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1", - "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af", - "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8", - "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9", - "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88", - "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba", - "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364", - "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e", - "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7", - "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0", - "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31", - "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683", - "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee", - "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b", - "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884", - "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c", - "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e", - "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562", - "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85", - "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c", - "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6", - "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d", - "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b", - "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70", - "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b", - "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b", - "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f", - "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0", - "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5", - "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5", - "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f", - "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e", - "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512", - "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d", - "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917", - "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f" - ], - "version": "==2020.11.13" - }, - "requests": { - "hashes": [ - "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", - "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" - ], - "index": "pypi", - "version": "==2.25.1" - }, - "rsa": { - "hashes": [ - "sha256:69805d6b69f56eb05b62daea3a7dbd7aa44324ad1306445e05da8060232d00f4", - "sha256:a8774e55b59fd9fc893b0d05e9bfc6f47081f46ff5b46f39ccf24631b7be356b" - ], - "markers": "python_version >= '3.6'", - "version": "==4.7" - }, - "six": { - "hashes": [ - "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", - "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.15.0" - }, - "soupsieve": { - "hashes": [ - "sha256:4bb21a6ee4707bf43b61230e80740e71bfe56e55d1f1f50924b087bb2975c851", - "sha256:6dc52924dc0bc710a5d16794e6b3480b2c7c08b07729505feab2b2c16661ff6e" - ], - "markers": "python_version >= '3'", - "version": "==2.1" - }, - "stackapi": { - "hashes": [ - "sha256:1f318bd706301b8f9d50f95bee794b39cbd484cdc948de0104180b7b93682661" - ], - "index": "pypi", - "version": "==0.1.12" - }, - "stdlib-list": { - "hashes": [ - "sha256:2ae0712a55b68f3fbbc9e58d6fa1b646a062188f49745b495f94d3310a9fdd3e", - "sha256:a1e503719720d71e2ed70ed809b385c60cd3fb555ba7ec046b96360d30b16d9f" - ], - "index": "pypi", - "version": "==0.8.0" - }, - "tabledata": { - "hashes": [ - "sha256:59cc3b5f0c52ea142386b0653d3d48d2e976fe021154871982b4d234b82be747", - "sha256:fa4c2db55cbb198ca5e21063ae743f418d3efbba94cd4844d2f759f994df76a2" - ], - "markers": "python_version >= '3.5'", - "version": "==1.1.3" - }, - "tabulate": { - "hashes": [ - "sha256:ac64cb76d53b1231d364babcd72abbb16855adac7de6665122f97b593f1eb2ba", - "sha256:db2723a20d04bcda8522165c73eea7c300eda74e0ce852d9022e0159d7895007" - ], - "version": "==0.8.7" - }, - "tcolorpy": { - "hashes": [ - "sha256:12b5c928572781fc7e5df5629da6342a65ec7d35efb64b5824c105b8debaaac7", - "sha256:ffbe886f1321dab88d9cfd4218ea8d93d50d6ad0875c3741dd75fe1437379406" - ], - "markers": "python_version >= '3.5'", - "version": "==0.0.8" - }, - "terminaltables": { - "hashes": [ - "sha256:f3eb0eb92e3833972ac36796293ca0906e998dc3be91fbe1f8615b331b853b81" - ], - "version": "==3.1.0" - }, - "text-unidecode": { - "hashes": [ - "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", - "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93" - ], - "version": "==1.3" - }, - "tinydb": { - "hashes": [ - "sha256:1d102d06f9bb22d739d8061b490c64d420de70dca5f95ebd43a492c43c7bd303", - "sha256:c8a8887269927e077f3aa16fddbf4debd176c10edc4ac8a5ce48ced0b10adf8c" - ], - "markers": "python_version >= '3.5' and python_version < '4.0'", - "version": "==4.3.0" - }, - "tinyrecord": { - "hashes": [ - "sha256:eb6dc23601be359ee00f5a3d31a46adf3bad0a16f8d60af216cd67982ca75cf4" - ], - "markers": "python_version >= '3.5'", - "version": "==0.2.0" - }, - "tokenize-rt": { - "hashes": [ - "sha256:ab339b5ff829eb5e198590477f9c03c84e762b3e455e74c018956e7e326cbc70", - "sha256:b37251fa28c21e8cce2e42f7769a35fba2dd2ecafb297208f9a9a8add3ca7793" - ], - "markers": "python_full_version >= '3.6.1'", - "version": "==4.1.0" - }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "index": "pypi", - "version": "==0.10.2" - }, - "traitlets": { - "hashes": [ - "sha256:178f4ce988f69189f7e523337a3e11d91c786ded9360174a3d9ca83e79bc5396", - "sha256:69ff3f9d5351f31a7ad80443c2674b7099df13cc41fc5fa6e2f6d3b0330b0426" - ], - "markers": "python_version >= '3.7'", - "version": "==5.0.5" - }, - "typed-ast": { - "hashes": [ - "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1", - "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d", - "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6", - "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd", - "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37", - "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151", - "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07", - "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440", - "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70", - "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496", - "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea", - "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400", - "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc", - "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606", - "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc", - "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581", - "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412", - "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a", - "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2", - "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787", - "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f", - "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937", - "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64", - "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487", - "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b", - "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41", - "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a", - "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3", - "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166", - "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10" - ], - "version": "==1.4.2" - }, - "typepy": { - "extras": [ - "datetime" - ], - "hashes": [ - "sha256:30b4d955bc8b628e7ae39bf6f07e2a07939def893b84d7a6cd10ba49c5646717", - "sha256:afec7feeac73d6b01fe6b23314edc17eaf8469f93783d2460c229068ae9dc588" - ], - "markers": "python_version >= '3.5'", - "version": "==1.1.2" - }, - "typing-extensions": { - "hashes": [ - "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918", - "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c", - "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f" - ], - "version": "==3.7.4.3" - }, - "urllib3": { - "hashes": [ - "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80", - "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", - "version": "==1.26.3" - }, - "vermin": { - "hashes": [ - "sha256:ab0c03ec1199c477ea49196355e2320934bfedc64605186c40850df36f5c64a0" - ], - "index": "pypi", - "version": "==1.1.0" - }, - "whats-that-code": { - "hashes": [ - "sha256:7b07589f0e8ac296312256ad6c1533614e63976e441de5a381f861a770807623", - "sha256:e20cee08038a0904f962a53c69f0dd0db4e548bbbffe6d33786b5fbc59da9b10" - ], - "index": "pypi", - "version": "==0.1.10" - }, - "wrapt": { - "hashes": [ - "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" - ], - "version": "==1.12.1" - }, - "yarg": { - "hashes": [ - "sha256:4f9cebdc00fac946c9bf2783d634e538a71c7d280a4d806d45fd4dc0ef441492", - "sha256:55695bf4d1e3e7f756496c36a69ba32c40d18f821e38f61d028f6049e5e15911" - ], - "version": "==0.1.9" - } - }, - "develop": { - "apipkg": { - "hashes": [ - "sha256:37228cda29411948b422fae072f57e31d3396d2ee1c9783775980ee9c9990af6", - "sha256:58587dd4dc3daefad0487f6d9ae32b4542b185e1c36db6993290e7c41ca2b47c" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.5" - }, - "appdirs": { - "hashes": [ - "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", - "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128" - ], - "version": "==1.4.4" - }, - "atomicwrites": { - "hashes": [ - "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197", - "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a" - ], - "markers": "sys_platform == 'win32'", - "version": "==1.4.0" - }, - "attrs": { - "hashes": [ - "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6", - "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.3.0" - }, - "bcrypt": { - "hashes": [ - "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29", - "sha256:63d4e3ff96188e5898779b6057878fecf3f11cfe6ec3b313ea09955d587ec7a7", - "sha256:81fec756feff5b6818ea7ab031205e1d323d8943d237303baca2c5f9c7846f34", - "sha256:a67fb841b35c28a59cebed05fbd3e80eea26e6d75851f0574a9273c80f3e9b55", - "sha256:c95d4cbebffafcdd28bd28bb4e25b31c50f6da605c81ffd9ad8a3d1b2ab7b1b6", - "sha256:cd1ea2ff3038509ea95f687256c46b79f5fc382ad0aa3664d200047546d511d1", - "sha256:cdcdcb3972027f83fe24a48b1e90ea4b584d35f1cc279d76de6fc4b13376239d" - ], - "markers": "python_version >= '3.6'", - "version": "==3.2.0" - }, - "cachetools": { - "hashes": [ - "sha256:1d9d5f567be80f7c07d765e21b814326d78c61eb0c3a637dffc0e5d1796cb2e2", - "sha256:f469e29e7aa4cff64d8de4aad95ce76de8ea1125a16c68e0d93f65c3c3dc92e9" - ], - "markers": "python_version ~= '3.5'", - "version": "==4.2.1" - }, - "certifi": { - "hashes": [ - "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c", - "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830" - ], - "version": "==2020.12.5" - }, - "cffi": { - "hashes": [ - "sha256:00a1ba5e2e95684448de9b89888ccd02c98d512064b4cb987d48f4b40aa0421e", - "sha256:00e28066507bfc3fe865a31f325c8391a1ac2916219340f87dfad602c3e48e5d", - "sha256:045d792900a75e8b1e1b0ab6787dd733a8190ffcf80e8c8ceb2fb10a29ff238a", - "sha256:0638c3ae1a0edfb77c6765d487fee624d2b1ee1bdfeffc1f0b58c64d149e7eec", - "sha256:105abaf8a6075dc96c1fe5ae7aae073f4696f2905fde6aeada4c9d2926752362", - "sha256:155136b51fd733fa94e1c2ea5211dcd4c8879869008fc811648f16541bf99668", - "sha256:1a465cbe98a7fd391d47dce4b8f7e5b921e6cd805ef421d04f5f66ba8f06086c", - "sha256:1d2c4994f515e5b485fd6d3a73d05526aa0fcf248eb135996b088d25dfa1865b", - "sha256:2c24d61263f511551f740d1a065eb0212db1dbbbbd241db758f5244281590c06", - "sha256:51a8b381b16ddd370178a65360ebe15fbc1c71cf6f584613a7ea08bfad946698", - "sha256:594234691ac0e9b770aee9fcdb8fa02c22e43e5c619456efd0d6c2bf276f3eb2", - "sha256:5cf4be6c304ad0b6602f5c4e90e2f59b47653ac1ed9c662ed379fe48a8f26b0c", - "sha256:64081b3f8f6f3c3de6191ec89d7dc6c86a8a43911f7ecb422c60e90c70be41c7", - "sha256:6bc25fc545a6b3d57b5f8618e59fc13d3a3a68431e8ca5fd4c13241cd70d0009", - "sha256:798caa2a2384b1cbe8a2a139d80734c9db54f9cc155c99d7cc92441a23871c03", - "sha256:7c6b1dece89874d9541fc974917b631406233ea0440d0bdfbb8e03bf39a49b3b", - "sha256:840793c68105fe031f34d6a086eaea153a0cd5c491cde82a74b420edd0a2b909", - "sha256:8d6603078baf4e11edc4168a514c5ce5b3ba6e3e9c374298cb88437957960a53", - "sha256:9cc46bc107224ff5b6d04369e7c595acb700c3613ad7bcf2e2012f62ece80c35", - "sha256:9f7a31251289b2ab6d4012f6e83e58bc3b96bd151f5b5262467f4bb6b34a7c26", - "sha256:9ffb888f19d54a4d4dfd4b3f29bc2c16aa4972f1c2ab9c4ab09b8ab8685b9c2b", - "sha256:a5ed8c05548b54b998b9498753fb9cadbfd92ee88e884641377d8a8b291bcc01", - "sha256:a7711edca4dcef1a75257b50a2fbfe92a65187c47dab5a0f1b9b332c5919a3fb", - "sha256:af5c59122a011049aad5dd87424b8e65a80e4a6477419c0c1015f73fb5ea0293", - "sha256:b18e0a9ef57d2b41f5c68beefa32317d286c3d6ac0484efd10d6e07491bb95dd", - "sha256:b4e248d1087abf9f4c10f3c398896c87ce82a9856494a7155823eb45a892395d", - "sha256:ba4e9e0ae13fc41c6b23299545e5ef73055213e466bd107953e4a013a5ddd7e3", - "sha256:c6332685306b6417a91b1ff9fae889b3ba65c2292d64bd9245c093b1b284809d", - "sha256:d5ff0621c88ce83a28a10d2ce719b2ee85635e85c515f12bac99a95306da4b2e", - "sha256:d9efd8b7a3ef378dd61a1e77367f1924375befc2eba06168b6ebfa903a5e59ca", - "sha256:df5169c4396adc04f9b0a05f13c074df878b6052430e03f50e68adf3a57aa28d", - "sha256:ebb253464a5d0482b191274f1c8bf00e33f7e0b9c66405fbffc61ed2c839c775", - "sha256:ec80dc47f54e6e9a78181ce05feb71a0353854cc26999db963695f950b5fb375", - "sha256:f032b34669220030f905152045dfa27741ce1a6db3324a5bc0b96b6c7420c87b", - "sha256:f60567825f791c6f8a592f3c6e3bd93dd2934e3f9dac189308426bd76b00ef3b", - "sha256:f803eaa94c2fcda012c047e62bc7a51b0bdabda1cad7a92a522694ea2d76e49f" - ], - "version": "==1.14.4" - }, - "chardet": { - "hashes": [ - "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa", - "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.0.0" - }, - "checksumdir": { - "hashes": [ - "sha256:aa1be031a0c51653aa7ae08c9991def5c639001976d09b7890284919652782d5" - ], - "index": "pypi", - "version": "==1.1.7" - }, - "click": { - "hashes": [ - "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a", - "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==7.1.2" - }, - "colorama": { - "hashes": [ - "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff", - "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1" - ], - "markers": "platform_system == 'Windows' and sys_platform == 'win32'", - "version": "==0.4.3" - }, - "colorclass": { - "hashes": [ - "sha256:b05c2a348dfc1aff2d502527d78a5b7b7e2f85da94a96c5081210d8e9ee8e18b" - ], - "version": "==2.2.0" - }, - "configparser": { - "hashes": [ - "sha256:005c3b102c96f4be9b8f40dafbd4997db003d07d1caa19f37808be8031475f2a", - "sha256:08e8a59ef1817ac4ed810bb8e17d049566dd6e024e7566f6285c756db2bb4ff8" - ], - "markers": "python_version >= '3.6'", - "version": "==5.0.1" - }, - "coverage": { - "hashes": [ - "sha256:03ed2a641e412e42cc35c244508cf186015c217f0e4d496bf6d7078ebe837ae7", - "sha256:04b14e45d6a8e159c9767ae57ecb34563ad93440fc1b26516a89ceb5b33c1ad5", - "sha256:0cdde51bfcf6b6bd862ee9be324521ec619b20590787d1655d005c3fb175005f", - "sha256:0f48fc7dc82ee14aeaedb986e175a429d24129b7eada1b7e94a864e4f0644dde", - "sha256:107d327071061fd4f4a2587d14c389a27e4e5c93c7cba5f1f59987181903902f", - "sha256:1375bb8b88cb050a2d4e0da901001347a44302aeadb8ceb4b6e5aa373b8ea68f", - "sha256:14a9f1887591684fb59fdba8feef7123a0da2424b0652e1b58dd5b9a7bb1188c", - "sha256:16baa799ec09cc0dcb43a10680573269d407c159325972dd7114ee7649e56c66", - "sha256:1b811662ecf72eb2d08872731636aee6559cae21862c36f74703be727b45df90", - "sha256:1ccae21a076d3d5f471700f6d30eb486da1626c380b23c70ae32ab823e453337", - "sha256:2f2cf7a42d4b7654c9a67b9d091ec24374f7c58794858bff632a2039cb15984d", - "sha256:322549b880b2d746a7672bf6ff9ed3f895e9c9f108b714e7360292aa5c5d7cf4", - "sha256:32ab83016c24c5cf3db2943286b85b0a172dae08c58d0f53875235219b676409", - "sha256:3fe50f1cac369b02d34ad904dfe0771acc483f82a1b54c5e93632916ba847b37", - "sha256:4a780807e80479f281d47ee4af2eb2df3e4ccf4723484f77da0bb49d027e40a1", - "sha256:4a8eb7785bd23565b542b01fb39115a975fefb4a82f23d407503eee2c0106247", - "sha256:5bee3970617b3d74759b2d2df2f6a327d372f9732f9ccbf03fa591b5f7581e39", - "sha256:60a3307a84ec60578accd35d7f0c71a3a971430ed7eca6567399d2b50ef37b8c", - "sha256:6625e52b6f346a283c3d563d1fd8bae8956daafc64bb5bbd2b8f8a07608e3994", - "sha256:66a5aae8233d766a877c5ef293ec5ab9520929c2578fd2069308a98b7374ea8c", - "sha256:68fb816a5dd901c6aff352ce49e2a0ffadacdf9b6fae282a69e7a16a02dad5fb", - "sha256:6b588b5cf51dc0fd1c9e19f622457cc74b7d26fe295432e434525f1c0fae02bc", - "sha256:6c4d7165a4e8f41eca6b990c12ee7f44fef3932fac48ca32cecb3a1b2223c21f", - "sha256:6d2e262e5e8da6fa56e774fb8e2643417351427604c2b177f8e8c5f75fc928ca", - "sha256:6d9c88b787638a451f41f97446a1c9fd416e669b4d9717ae4615bd29de1ac135", - "sha256:755c56beeacac6a24c8e1074f89f34f4373abce8b662470d3aa719ae304931f3", - "sha256:7e40d3f8eb472c1509b12ac2a7e24158ec352fc8567b77ab02c0db053927e339", - "sha256:812eaf4939ef2284d29653bcfee9665f11f013724f07258928f849a2306ea9f9", - "sha256:84df004223fd0550d0ea7a37882e5c889f3c6d45535c639ce9802293b39cd5c9", - "sha256:859f0add98707b182b4867359e12bde806b82483fb12a9ae868a77880fc3b7af", - "sha256:87c4b38288f71acd2106f5d94f575bc2136ea2887fdb5dfe18003c881fa6b370", - "sha256:89fc12c6371bf963809abc46cced4a01ca4f99cba17be5e7d416ed7ef1245d19", - "sha256:9564ac7eb1652c3701ac691ca72934dd3009997c81266807aef924012df2f4b3", - "sha256:9754a5c265f991317de2bac0c70a746efc2b695cf4d49f5d2cddeac36544fb44", - "sha256:a565f48c4aae72d1d3d3f8e8fb7218f5609c964e9c6f68604608e5958b9c60c3", - "sha256:a636160680c6e526b84f85d304e2f0bb4e94f8284dd765a1911de9a40450b10a", - "sha256:a839e25f07e428a87d17d857d9935dd743130e77ff46524abb992b962eb2076c", - "sha256:b62046592b44263fa7570f1117d372ae3f310222af1fc1407416f037fb3af21b", - "sha256:b7f7421841f8db443855d2854e25914a79a1ff48ae92f70d0a5c2f8907ab98c9", - "sha256:ba7ca81b6d60a9f7a0b4b4e175dcc38e8fef4992673d9d6e6879fd6de00dd9b8", - "sha256:bb32ca14b4d04e172c541c69eec5f385f9a075b38fb22d765d8b0ce3af3a0c22", - "sha256:c0ff1c1b4d13e2240821ef23c1efb1f009207cb3f56e16986f713c2b0e7cd37f", - "sha256:c669b440ce46ae3abe9b2d44a913b5fd86bb19eb14a8701e88e3918902ecd345", - "sha256:c67734cff78383a1f23ceba3b3239c7deefc62ac2b05fa6a47bcd565771e5880", - "sha256:c6809ebcbf6c1049002b9ac09c127ae43929042ec1f1dbd8bb1615f7cd9f70a0", - "sha256:cd601187476c6bed26a0398353212684c427e10a903aeafa6da40c63309d438b", - "sha256:ebfa374067af240d079ef97b8064478f3bf71038b78b017eb6ec93ede1b6bcec", - "sha256:fbb17c0d0822684b7d6c09915677a32319f16ff1115df5ec05bdcaaee40b35f3", - "sha256:fff1f3a586246110f34dc762098b5afd2de88de507559e63553d7da643053786" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", - "version": "==5.4" - }, - "cryptography": { - "hashes": [ - "sha256:0003a52a123602e1acee177dc90dd201f9bb1e73f24a070db7d36c588e8f5c7d", - "sha256:0e85aaae861d0485eb5a79d33226dd6248d2a9f133b81532c8f5aae37de10ff7", - "sha256:594a1db4511bc4d960571536abe21b4e5c3003e8750ab8365fafce71c5d86901", - "sha256:69e836c9e5ff4373ce6d3ab311c1a2eed274793083858d3cd4c7d12ce20d5f9c", - "sha256:788a3c9942df5e4371c199d10383f44a105d67d401fb4304178020142f020244", - "sha256:7e177e4bea2de937a584b13645cab32f25e3d96fc0bc4a4cf99c27dc77682be6", - "sha256:83d9d2dfec70364a74f4e7c70ad04d3ca2e6a08b703606993407bf46b97868c5", - "sha256:84ef7a0c10c24a7773163f917f1cb6b4444597efd505a8aed0a22e8c4780f27e", - "sha256:9e21301f7a1e7c03dbea73e8602905a4ebba641547a462b26dd03451e5769e7c", - "sha256:9f6b0492d111b43de5f70052e24c1f0951cb9e6022188ebcb1cc3a3d301469b0", - "sha256:a69bd3c68b98298f490e84519b954335154917eaab52cf582fa2c5c7efc6e812", - "sha256:b4890d5fb9b7a23e3bf8abf5a8a7da8e228f1e97dc96b30b95685df840b6914a", - "sha256:c366df0401d1ec4e548bebe8f91d55ebcc0ec3137900d214dd7aac8427ef3030", - "sha256:dc42f645f8f3a489c3dd416730a514e7a91a59510ddaadc09d04224c098d3302" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==3.3.1" - }, - "distlib": { - "hashes": [ - "sha256:8c09de2c67b3e7deef7184574fc060ab8a793e7adbb183d942c389c8b13c52fb", - "sha256:edf6116872c863e1aa9d5bb7cb5e05a022c519a4594dc703843343a9ddd9bff1" - ], - "version": "==0.3.1" - }, - "dodgy": { - "hashes": [ - "sha256:28323cbfc9352139fdd3d316fa17f325cc0e9ac74438cbba51d70f9b48f86c3a", - "sha256:51f54c0fd886fa3854387f354b19f429d38c04f984f38bc572558b703c0542a6" - ], - "index": "pypi", - "version": "==0.2.1" - }, - "execnet": { - "hashes": [ - "sha256:7a13113028b1e1cc4c6492b28098b3c6576c9dccc7973bfe47b342afadafb2ac", - "sha256:b73c5565e517f24b62dea8a5ceac178c661c4309d3aa0c3e420856c072c411b4" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.8.0" - }, - "filelock": { - "hashes": [ - "sha256:18d82244ee114f543149c66a6e0c14e9c4f8a1044b5cdaadd0f82159d6a6ff59", - "sha256:929b7d63ec5b7d6b71b0fa5ac14e030b3f70b75747cef1b10da9b879fef15836" - ], - "version": "==3.0.12" - }, - "gitchangelog": { - "hashes": [ - "sha256:3d8d6a730450fbd5b0a9bc58d0dd3e269c967d7eb4fece0c5cff4372a3f77421", - "sha256:45f8b8e64cece0d9bb03a35ecd8ee62c1c7157f8dac0ef3cb68381bfcc1bde29" - ], - "index": "pypi", - "version": "==3.0.4" - }, - "gitdb": { - "hashes": [ - "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac", - "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9" - ], - "markers": "python_version >= '3.4'", - "version": "==4.0.5" - }, - "gitpython": { - "hashes": [ - "sha256:42dbefd8d9e2576c496ed0059f3103dcef7125b9ce16f9d5f9c834aed44a1dac", - "sha256:867ec3dfb126aac0f8296b19fb63b8c4a399f32b4b6fafe84c4b10af5fa9f7b5" - ], - "index": "pypi", - "version": "==3.1.12" - }, - "idna": { - "hashes": [ - "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6", - "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.10" - }, - "ifaddr": { - "hashes": [ - "sha256:1f9e8a6ca6f16db5a37d3356f07b6e52344f6f9f7e806d618537731669eb1a94", - "sha256:d1f603952f0a71c9ab4e705754511e4e03b02565bc4cec7188ad6415ff534cd3" - ], - "index": "pypi", - "version": "==0.1.7" - }, - "iniconfig": { - "hashes": [ - "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3", - "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32" - ], - "version": "==1.1.1" - }, - "isort": { - "hashes": [ - "sha256:dcab1d98b469a12a1a624ead220584391648790275560e1a43e54c5dceae65e7", - "sha256:dcaeec1b5f0eca77faea2a35ab790b4f3680ff75590bfcb7145986905aab2f58" - ], - "markers": "python_version >= '3.6' and python_version < '4.0'", - "version": "==5.6.4" - }, - "jake": { - "hashes": [ - "sha256:28bad026bfe2f912a191aa7916e6e166c6da9de43fb3049a2ff3327a6ae1715d", - "sha256:b593f2fb0b93d45509c58242681e48e0fc45e2225a2a97ce6480cc545c132bba" - ], - "index": "pypi", - "version": "==0.2.65" - }, - "lazy-object-proxy": { - "hashes": [ - "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d", - "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449", - "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08", - "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a", - "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50", - "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd", - "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239", - "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb", - "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea", - "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e", - "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156", - "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142", - "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442", - "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62", - "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db", - "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531", - "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383", - "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a", - "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357", - "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4", - "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.3" - }, - "liccheck": { - "hashes": [ - "sha256:f6b1361a874a26fdc639b3aaf691b6e4e61a72153bfe6becdcd860f354bd2045" - ], - "index": "pypi", - "version": "==0.4.3" - }, - "lxml": { - "hashes": [ - "sha256:0448576c148c129594d890265b1a83b9cd76fd1f0a6a04620753d9a6bcfd0a4d", - "sha256:127f76864468d6630e1b453d3ffbbd04b024c674f55cf0a30dc2595137892d37", - "sha256:1471cee35eba321827d7d53d104e7b8c593ea3ad376aa2df89533ce8e1b24a01", - "sha256:2363c35637d2d9d6f26f60a208819e7eafc4305ce39dc1d5005eccc4593331c2", - "sha256:2e5cc908fe43fe1aa299e58046ad66981131a66aea3129aac7770c37f590a644", - "sha256:2e6fd1b8acd005bd71e6c94f30c055594bbd0aa02ef51a22bbfa961ab63b2d75", - "sha256:366cb750140f221523fa062d641393092813b81e15d0e25d9f7c6025f910ee80", - "sha256:42ebca24ba2a21065fb546f3e6bd0c58c3fe9ac298f3a320147029a4850f51a2", - "sha256:4e751e77006da34643ab782e4a5cc21ea7b755551db202bc4d3a423b307db780", - "sha256:4fb85c447e288df535b17ebdebf0ec1cf3a3f1a8eba7e79169f4f37af43c6b98", - "sha256:50c348995b47b5a4e330362cf39fc503b4a43b14a91c34c83b955e1805c8e308", - "sha256:535332fe9d00c3cd455bd3dd7d4bacab86e2d564bdf7606079160fa6251caacf", - "sha256:535f067002b0fd1a4e5296a8f1bf88193080ff992a195e66964ef2a6cfec5388", - "sha256:5be4a2e212bb6aa045e37f7d48e3e1e4b6fd259882ed5a00786f82e8c37ce77d", - "sha256:60a20bfc3bd234d54d49c388950195d23a5583d4108e1a1d47c9eef8d8c042b3", - "sha256:648914abafe67f11be7d93c1a546068f8eff3c5fa938e1f94509e4a5d682b2d8", - "sha256:681d75e1a38a69f1e64ab82fe4b1ed3fd758717bed735fb9aeaa124143f051af", - "sha256:68a5d77e440df94011214b7db907ec8f19e439507a70c958f750c18d88f995d2", - "sha256:69a63f83e88138ab7642d8f61418cf3180a4d8cd13995df87725cb8b893e950e", - "sha256:6e4183800f16f3679076dfa8abf2db3083919d7e30764a069fb66b2b9eff9939", - "sha256:6fd8d5903c2e53f49e99359b063df27fdf7acb89a52b6a12494208bf61345a03", - "sha256:791394449e98243839fa822a637177dd42a95f4883ad3dec2a0ce6ac99fb0a9d", - "sha256:7a7669ff50f41225ca5d6ee0a1ec8413f3a0d8aa2b109f86d540887b7ec0d72a", - "sha256:7e9eac1e526386df7c70ef253b792a0a12dd86d833b1d329e038c7a235dfceb5", - "sha256:7ee8af0b9f7de635c61cdd5b8534b76c52cd03536f29f51151b377f76e214a1a", - "sha256:8246f30ca34dc712ab07e51dc34fea883c00b7ccb0e614651e49da2c49a30711", - "sha256:8c88b599e226994ad4db29d93bc149aa1aff3dc3a4355dd5757569ba78632bdf", - "sha256:923963e989ffbceaa210ac37afc9b906acebe945d2723e9679b643513837b089", - "sha256:94d55bd03d8671686e3f012577d9caa5421a07286dd351dfef64791cf7c6c505", - "sha256:97db258793d193c7b62d4e2586c6ed98d51086e93f9a3af2b2034af01450a74b", - "sha256:a9d6bc8642e2c67db33f1247a77c53476f3a166e09067c0474facb045756087f", - "sha256:cd11c7e8d21af997ee8079037fff88f16fda188a9776eb4b81c7e4c9c0a7d7fc", - "sha256:d8d3d4713f0c28bdc6c806a278d998546e8efc3498949e3ace6e117462ac0a5e", - "sha256:e0bfe9bb028974a481410432dbe1b182e8191d5d40382e5b8ff39cdd2e5c5931", - "sha256:f4822c0660c3754f1a41a655e37cb4dbbc9be3d35b125a37fab6f82d47674ebc", - "sha256:f83d281bb2a6217cd806f4cf0ddded436790e66f393e124dfe9731f6b3fb9afe", - "sha256:fc37870d6716b137e80d19241d0e2cff7a7643b925dfa49b4c8ebd1295eb506e" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==4.6.2" - }, - "mccabe": { - "hashes": [ - "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", - "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f" - ], - "version": "==0.6.1" - }, - "more-itertools": { - "hashes": [ - "sha256:8e1a2a43b2f2727425f2b5839587ae37093f19153dc26c0927d1048ff6557330", - "sha256:b3a9005928e5bed54076e6e549c792b306fddfe72b2d1d22dd63d42d5d3899cf" - ], - "markers": "python_version >= '3.5'", - "version": "==8.6.0" - }, - "oyaml": { - "hashes": [ - "sha256:03990464021274031c2905c3ee5c1345f318b30d0f247ea4368c44921e2b1d67", - "sha256:968d64dfa3ec1e0698f1b90f409f2993c2ef34f9def1ca5e785c4a2ef3bcfb07" - ], - "version": "==0.9" - }, - "packaging": { - "hashes": [ - "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5", - "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.9" - }, - "paramiko": { - "hashes": [ - "sha256:4f3e316fef2ac628b05097a637af35685183111d4bc1b5979bd397c2ab7b5898", - "sha256:7f36f4ba2c0d81d219f4595e35f70d56cc94f9ac40a6acdf51d6ca210ce65035" - ], - "version": "==2.7.2" - }, - "pebble": { - "hashes": [ - "sha256:2de3cd11aa068e0c4a4abbaf8d4ecfdac409d8bfb78a4c211a01f6a4fb17a35f", - "sha256:cae871610cc7f83d0ba780baab60e581ff762c7dd46bb601eed0727b070fcae3" - ], - "index": "pypi", - "version": "==4.5.0" - }, - "pip-check": { - "hashes": [ - "sha256:8793098131890c0eb86d46c572d34a60284e2f2833edca49d373c48c826a2e3f", - "sha256:dc64ba7f857a51148f85a0f642ac110d344aea3c263ca3353209b329f6fa4601" - ], - "index": "pypi", - "version": "==2.6" - }, - "pkginfo": { - "hashes": [ - "sha256:7424f2c8511c186cd5424bbf31045b77435b37a8d604990b79d4e70d741148bb", - "sha256:a6d9e40ca61ad3ebd0b72fbadd4fba16e4c0e4df0428c041e01e06eb6ee71f32" - ], - "version": "==1.5.0.1" - }, - "pluggy": { - "hashes": [ - "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", - "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==0.13.1" - }, - "polling": { - "hashes": [ - "sha256:6b187150ae9d240cfde3af4ae9e90219db9cdd19bf92229c59607ce8e9a072aa", - "sha256:fafdd9aeeb2d24f02cbd575ff1d99c822cb629e975b183eda6927d696c3abcf7" - ], - "version": "==0.3.1" - }, - "psutil": { - "hashes": [ - "sha256:094f899ac3ef72422b7e00411b4ed174e3c5a2e04c267db6643937ddba67a05b", - "sha256:10b7f75cc8bd676cfc6fa40cd7d5c25b3f45a0e06d43becd7c2d2871cbb5e806", - "sha256:1b1575240ca9a90b437e5a40db662acd87bbf181f6aa02f0204978737b913c6b", - "sha256:21231ef1c1a89728e29b98a885b8e0a8e00d09018f6da5cdc1f43f988471a995", - "sha256:28f771129bfee9fc6b63d83a15d857663bbdcae3828e1cb926e91320a9b5b5cd", - "sha256:70387772f84fa5c3bb6a106915a2445e20ac8f9821c5914d7cbde148f4d7ff73", - "sha256:b560f5cd86cf8df7bcd258a851ca1ad98f0d5b8b98748e877a0aec4e9032b465", - "sha256:b74b43fecce384a57094a83d2778cdfc2e2d9a6afaadd1ebecb2e75e0d34e10d", - "sha256:e85f727ffb21539849e6012f47b12f6dd4c44965e56591d8dec6e8bc9ab96f4a", - "sha256:fd2e09bb593ad9bdd7429e779699d2d47c1268cbde4dda95fcd1bd17544a0217", - "sha256:ffad8eb2ac614518bbe3c0b8eb9dffdb3a8d2e3a7d5da51c5b974fb723a5c5aa" - ], - "index": "pypi", - "version": "==5.6.7" - }, - "py": { - "hashes": [ - "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3", - "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.10.0" - }, - "pycparser": { - "hashes": [ - "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0", - "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.20" - }, - "pyfiglet": { - "hashes": [ - "sha256:c6c2321755d09267b438ec7b936825a4910fec696292139e664ca8670e103639", - "sha256:d555bcea17fbeaf70eaefa48bb119352487e629c9b56f30f383e2c62dd67a01c" - ], - "version": "==0.8.post1" - }, - "pynacl": { - "hashes": [ - "sha256:06cbb4d9b2c4bd3c8dc0d267416aaed79906e7b33f114ddbf0911969794b1cc4", - "sha256:11335f09060af52c97137d4ac54285bcb7df0cef29014a1a4efe64ac065434c4", - "sha256:2fe0fc5a2480361dcaf4e6e7cea00e078fcda07ba45f811b167e3f99e8cff574", - "sha256:30f9b96db44e09b3304f9ea95079b1b7316b2b4f3744fe3aaecccd95d547063d", - "sha256:4e10569f8cbed81cb7526ae137049759d2a8d57726d52c1a000a3ce366779634", - "sha256:511d269ee845037b95c9781aa702f90ccc36036f95d0f31373a6a79bd8242e25", - "sha256:537a7ccbea22905a0ab36ea58577b39d1fa9b1884869d173b5cf111f006f689f", - "sha256:54e9a2c849c742006516ad56a88f5c74bf2ce92c9f67435187c3c5953b346505", - "sha256:757250ddb3bff1eecd7e41e65f7f833a8405fede0194319f87899690624f2122", - "sha256:7757ae33dae81c300487591c68790dfb5145c7d03324000433d9a2c141f82af7", - "sha256:7c6092102219f59ff29788860ccb021e80fffd953920c4a8653889c029b2d420", - "sha256:8122ba5f2a2169ca5da936b2e5a511740ffb73979381b4229d9188f6dcb22f1f", - "sha256:9c4a7ea4fb81536c1b1f5cc44d54a296f96ae78c1ebd2311bd0b60be45a48d96", - "sha256:c914f78da4953b33d4685e3cdc7ce63401247a21425c16a39760e282075ac4a6", - "sha256:cd401ccbc2a249a47a3a1724c2918fcd04be1f7b54eb2a5a71ff915db0ac51c6", - "sha256:d452a6746f0a7e11121e64625109bc4468fc3100452817001dbe018bb8b08514", - "sha256:ea6841bc3a76fa4942ce00f3bda7d436fda21e2d91602b9e21b7ca9ecab8f3ff", - "sha256:f8851ab9041756003119368c1e6cd0b9c631f46d686b3904b18c0139f4419f80" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.0" - }, - "pynt": { - "hashes": [ - "sha256:be13be37f8237be4a6f6f3031aebcb0c2e61a1894a85a21b85a21e397961c7b3", - "sha256:f38b9b775804eff6e291bd6894669954d94c680b196adee56c96d082a135483c" - ], - "index": "pypi", - "version": "==0.8.2" - }, - "pynt-contrib": { - "hashes": [ - "sha256:99e0b3bb9ca674a49002fbde9e206d1c785a68912870ec9924d4d9362e5aaf50" - ], - "index": "pypi", - "version": "==0.2.0" - }, - "pyparsing": { - "hashes": [ - "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1", - "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b" - ], - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.4.7" - }, - "pytest": { - "hashes": [ - "sha256:85228d75db9f45e06e57ef9bf4429267f81ac7c0d742cc9ed63d09886a9fe6f4", - "sha256:8b6007800c53fdacd5a5c192203f4e531eb2a1540ad9c752e052ec0f7143dbad" - ], - "index": "pypi", - "version": "==6.0.1" - }, - "pytest-cov": { - "hashes": [ - "sha256:359952d9d39b9f822d9d29324483e7ba04a3a17dd7d05aa6beb7ea01e359e5f7", - "sha256:bdb9fdb0b85a7cc825269a4c56b48ccaa5c7e365054b6038772c32ddcdc969da" - ], - "index": "pypi", - "version": "==2.11.1" - }, - "pytest-forked": { - "hashes": [ - "sha256:6aa9ac7e00ad1a539c41bec6d21011332de671e938c7637378ec9710204e37ca", - "sha256:dc4147784048e70ef5d437951728825a131b81714b398d5d52f17c7c144d8815" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4'", - "version": "==1.3.0" - }, - "pytest-timeout": { - "hashes": [ - "sha256:20b3113cf6e4e80ce2d403b6fb56e9e1b871b510259206d40ff8d609f48bda76", - "sha256:541d7aa19b9a6b4e475c759fd6073ef43d7cdc9a92d95644c260076eb257a063" - ], - "index": "pypi", - "version": "==1.4.2" - }, - "pytest-xdist": { - "hashes": [ - "sha256:1d8edbb1a45e8e1f8e44b1260583107fc23f8bc8da6d18cb331ff61d41258ecf", - "sha256:f127e11e84ad37cc1de1088cb2990f3c354630d428af3f71282de589c5bb779b" - ], - "index": "pypi", - "version": "==2.2.0" - }, - "pyyaml": { - "hashes": [ - "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97", - "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76", - "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2", - "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e", - "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648", - "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf", - "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f", - "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2", - "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee", - "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a", - "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d", - "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c", - "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a" - ], - "version": "==5.3.1" - }, - "requests": { - "hashes": [ - "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804", - "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e" - ], - "index": "pypi", - "version": "==2.25.1" - }, - "semantic-version": { - "hashes": [ - "sha256:45e4b32ee9d6d70ba5f440ec8cc5221074c7f4b0e8918bdab748cc37912440a9", - "sha256:d2cb2de0558762934679b9a104e82eca7af448c9f4974d1f3eeccff651df8a54" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==2.8.5" - }, - "setuptools-scm": { - "hashes": [ - "sha256:1fc4e25df445351d172bb4788f4d07f9e9ce0e8b7dee6b19584e46110172ca13", - "sha256:48b31488d089270500f120efea723968c01abd85fd4876043a3b7c7ef7d0b761", - "sha256:62fa535edb31ece9fa65dc9dcb3056145b8020c8c26c0ef1018aef33db95c40d", - "sha256:b928021c4381f96d577847d540d6e03065f8f8851c768a0c9bc552d463bae0d4", - "sha256:c85b6b46d0edd40d2301038cdea96bb6adc14d62ef943e75afb08b3e7bcf142a", - "sha256:db4ab2e0c2644ba71b1e5212b14ff65dbf0af465796d314a75e0cf6128f605f7", - "sha256:e878036c2527dfd05818727846338be86b2be6955741b85fab2625f63d001021", - "sha256:eb19b46816fc106a4c2d4180022687eab40f9773cf61390b845afb093d1f4ecd" - ], - "index": "pypi", - "version": "==5.0.1" - }, - "six": { - "hashes": [ - "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259", - "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.15.0" - }, - "smmap": { - "hashes": [ - "sha256:7bfcf367828031dc893530a29cb35eb8c8f2d7c8f2d0989354d75d24c8573714", - "sha256:84c2751ef3072d4f6b2785ec7ee40244c6f45eb934d9e543e2c51f1bd3d54c50" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==3.0.5" - }, - "sshtunnel": { - "hashes": [ - "sha256:4a07cf989712e8ba76a370584bec922d14775054b3ff18e5d075507a298dc3ed", - "sha256:98e54c26f726ab8bd42b47a3a21fca5c3e60f58956f0f70de2fb8ab0046d0606", - "sha256:e7cb0ea774db81bf91844db22de72a40aae8f7b0f9bb9ba0f666d474ef6bf9fc" - ], - "index": "pypi", - "version": "==0.4.0" - }, - "tabulate": { - "hashes": [ - "sha256:ac64cb76d53b1231d364babcd72abbb16855adac7de6665122f97b593f1eb2ba", - "sha256:db2723a20d04bcda8522165c73eea7c300eda74e0ce852d9022e0159d7895007" - ], - "version": "==0.8.7" - }, - "termcolor": { - "hashes": [ - "sha256:1d6d69ce66211143803fbc56652b41d73b4a400a2891d7bf7a1cdf4c02de613b" - ], - "version": "==1.1.0" - }, - "terminaltables": { - "hashes": [ - "sha256:f3eb0eb92e3833972ac36796293ca0906e998dc3be91fbe1f8615b331b853b81" - ], - "version": "==3.1.0" - }, - "tinydb": { - "hashes": [ - "sha256:1d102d06f9bb22d739d8061b490c64d420de70dca5f95ebd43a492c43c7bd303", - "sha256:c8a8887269927e077f3aa16fddbf4debd176c10edc4ac8a5ce48ced0b10adf8c" - ], - "markers": "python_version >= '3.5' and python_version < '4.0'", - "version": "==4.3.0" - }, - "toml": { - "hashes": [ - "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", - "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" - ], - "index": "pypi", - "version": "==0.10.2" - }, - "tox": { - "hashes": [ - "sha256:76df3db6eee929bb62bdbacca5bb6bc840669d98e86a015b7a57b7df0a6eaf8b", - "sha256:854e6e4a71c614b488f81cb88df3b92edcb1a9ec43d4102e6289e9669bbf7f18" - ], - "index": "pypi", - "version": "==3.21.3" - }, - "typed-ast": { - "hashes": [ - "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1", - "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d", - "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6", - "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd", - "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37", - "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151", - "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07", - "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440", - "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70", - "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496", - "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea", - "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400", - "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc", - "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606", - "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc", - "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581", - "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412", - "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a", - "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2", - "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787", - "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f", - "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937", - "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64", - "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487", - "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b", - "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41", - "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a", - "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3", - "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166", - "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10" - ], - "version": "==1.4.2" - }, - "urllib3": { - "hashes": [ - "sha256:1b465e494e3e0d8939b50680403e3aedaa2bc434b7d5af64dfd3c958d7f5ae80", - "sha256:de3eedaad74a2683334e282005cd8d7f22f4d55fa690a2a1020a416cb0a47e73" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4.0'", - "version": "==1.26.3" - }, - "vendorize": { - "hashes": [ - "sha256:31f72bef2e49a6cec0e0335025eb687d21e4cdd9d81e7299d588a182c5a0c928", - "sha256:f05d756044657c30e7d46591a5f27009d4611903999df1cecbf791eebc3bc2ce" - ], - "index": "pypi", - "version": "==0.2.1" - }, - "virtualenv": { - "hashes": [ - "sha256:219ee956e38b08e32d5639289aaa5bd190cfbe7dafcb8fa65407fca08e808f9c", - "sha256:227a8fed626f2f20a6cdb0870054989f82dd27b2560a911935ba905a2a5e0034" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==20.4.0" - }, - "wimpy": { - "hashes": [ - "sha256:86aec5008c4bb88a4e81c262dcbe00df1acd4d1cc293b35237b630149c5f6ef7" - ], - "version": "==0.6" - }, - "wrapt": { - "hashes": [ - "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7" - ], - "version": "==1.12.1" - }, - "yaspin": { - "hashes": [ - "sha256:e88bf9c9fe4ac588e3620588aadae655dfc20f1f7460338394ef4693bdc2b800", - "sha256:efca3eb7162e575d3ab2e49743cd9bd1f5ec2adc7d85b9489ab145a3f6460ed4" - ], - "version": "==0.16.0" - } - } -} diff --git a/README.md b/README.md index c1da38f..0ef0d7d 100644 --- a/README.md +++ b/README.md @@ -2,38 +2,72 @@ so_pip ====== Everyone copies code from StackOverflow, but no one is formalizing it. -This will vendorize the source code of question or answer into a folder and -generate the accessory files to make it look like a python package. +`so_pip` will vendorize the source code of question or answer into a folder and +generate the files to make into a python package. -The feature-set overlaps a bit with [cookie cutter, vendorizing libraries and -stackoverflow search cli's](https://github.com/matthewdeanmartin/so_pip/blob/main/docs/prior_art.md). +`so_pip` is less like a package installer and more like a project template maker, [cookie cutter, vendorizing libraries +and stackoverflow search cli's](https://github.com/matthewdeanmartin/so_pip/blob/main/docs/prior_art.md). -[//]: # [![DepShield Badge](https://depshield.sonatype.org/badges/owner/repository/depshield.svg)](https://depshield.github.io) +## so_pip is dead, the AI version might actually be useful + +Ever think, "I wish I could pip install the answer to this stackoverflow question?" +You almost could with some markdown parsing and vendorizing techniques. + +But too many answers were not given in the form of a function or a class, so they lack +the minimal conditions for code re-use. There is no non-AI way to turn a script into +a re-usable function, so this approach was always fatally flawed. + +See the soon-to-be-posted "ai_pip" project that will do the same thing but use ChatGPT +to transform the answer into re-usable code. This will solve previously unsolvable problems, +like: + +- What code is this? Is that python or bash? +- Is this series of markdown blocks one code file per block? +- Is this series of markdown code blocks actually one code file with comments? +- What is a good name for the package? +- Is the code in the question part of the code in the answer? +- If this code was written to be re-usable, what would it look like? +- How do we upgrade the code to modern python? +- Is the code malicious or buggy? +- Where are the tests? + +Badges +------ + +![Libraries.io dependency status for latest release](https://img.shields.io/librariesio/release/pypi/so-pip) +[![Downloads](https://pepy.tech/badge/so-pip/month)](https://pepy.tech/project/so-pip/month) +[![CodeFactor](https://www.codefactor.io/repository/github/matthewdeanmartin/so_pip/badge)](https://www.codefactor.io/repository/github/matthewdeanmartin/so_pip) Installation ------------ -Requires Python 3.7+, tested with 3.7, 3.8, 3.9 +Requires Python 3.11+ + ``` pip install so_pip # or -pipenv install so_pip --pre --skip-lock +poetry install so_pip so_pip vendorize my_name --question=31049648 --output=output ``` Using via [dockerhub](https://hub.docker.com/repository/docker/matthewdeanmartin/so_pip) + ``` # for mac, unix, cmd.exe, powershell docker pull matthewdeanmartin/so_pip docker run --rm -i -v "$PWD/data:/data" matthewdeanmartin/so_pip --help ``` + If you use git bash/mingw64/cygwin, see [run.sh](https://github.com/matthewdeanmartin/so_pip/blob/main/docker/run.sh) because docker needs help doing a volume mount. Usage -------------- -Consider getting a [key](https://stackapps.com/apps/oauth/register) and adding a [.so_pip.ini file](https://github.com/matthewdeanmartin/so_pip/blob/main/.so_pip.ini) The app will make best efforts if you don't. +Consider getting a [key](https://stackapps.com/apps/oauth/register) and adding +a [.so_pip.ini file](https://github.com/matthewdeanmartin/so_pip/blob/main/.so_pip.ini) The app will make best efforts +if you don't. + ``` # Turn posts into nicely formated packages > so_pip vendorize my_name --question=31049648 | --answer=31049648 @@ -46,6 +80,7 @@ Consider getting a [key](https://stackapps.com/apps/oauth/register) and adding a Docs ----- + * [Examples](https://github.com/matthewdeanmartin/so_pip/tree/main/examples) * [Workflows](https://github.com/matthewdeanmartin/so_pip/blob/main/docs/workflows.md) * [CLI](https://github.com/matthewdeanmartin/so_pip/blob/main/docs/cli.md) @@ -53,7 +88,8 @@ Docs * [Features](https://github.com/matthewdeanmartin/so_pip/blob/main/docs/features.md) * [Security Considerations](https://github.com/matthewdeanmartin/so_pip/blob/main/docs/security.md) * [Prior Art](https://github.com/matthewdeanmartin/so_pip/blob/main/docs/prior_art.md) Similar and overlapping tools. -* [Contributing *answers* to StackOverflow](https://github.com/matthewdeanmartin/so_pip/blob/main/docs/contributing.md) AKA, fixing answers you found. +* [Contributing *answers* to StackOverflow](https://github.com/matthewdeanmartin/so_pip/blob/main/docs/contributing.md) + AKA, fixing answers you found. * [Attribution Compliance](https://github.com/matthewdeanmartin/so_pip/blob/main/docs/comply_with_cc_sa.md) * [Contributing to so_pip](https://github.com/matthewdeanmartin/so_pip/blob/main/CONTRIBUTING.md) * [Code of Conduct for so_pip](https://github.com/matthewdeanmartin/so_pip/blob/main/CODE_OF_CONDUCT.md) diff --git a/build.py b/build.py deleted file mode 100644 index d185d98..0000000 --- a/build.py +++ /dev/null @@ -1,845 +0,0 @@ -""" -Build tasks - -This file should be concerned with the work flow and some business rules -about what tasks to run. The parameters to those business rules should be handed -off to the relevant tool in the /commands/ folder - -- don't run cli commands directly here, put that in a separate file -- this is a good place for deciding if *this* project needs to run a command -- the commands may have code to handle if it makes sense to run a command, e.g. - don't run git commands if not in a repo - -Applying to new projects, for each tool (assuming all tools are value add) - -- does this apply at all? -- should it stop the build if it fails? eg. unit tests, mypy, lint should fail the build -- is it a periodic report? - -Decisions will vary based on: -- is the tool fast (do fast tools first so they can fail fast) -- does it change files (upgrade, reformat) - - These can't run in parallel, should run before quality checks - - Doesn't make sense on build server (no one there to check in changes) -- does it depend only on source (needs only re-run on source changes, not true of - integration tests) -- is it immediately actionable? - - Code size reports- Removing a sixth argument might make the code worse - - Code complexity reports - not safe to simplify the most complex code every day! - -""" - -import functools -import os -import subprocess -import sys - -try: - from dotenv import load_dotenv -except ModuleNotFoundError: - if "PIPENV_ACTIVE" in os.environ: - print("I can see we are in a pipenv environment, but dependencies are missing.") - if "POETRY_ACTIVE" in os.environ: - print("I can see we are in a poetry environment, but dependencies are missing.") - if "VIRTUAL_ENV" in os.environ: - print( - "I can see we are in a virtual environment," - " but dependencies are missing." - ) - - print( - "dotenv not found... most likely you need to create a virtual env\n" - "and install all the build dependencies, or activate it" - ) - print("\n see pipx_install.sh for things like black and pylint.") - print("\n Pipenv install --dev or the equivallent for everything else") - - exit(-1) -from navio_tasks.commands.cli_go_gitleaks import run_gitleaks -from navio_tasks.dependency_commands.cli_installs import do_dependency_installs -from navio_tasks.mutating_commands.cli_precommit import do_precommit -from navio_tasks.commands.cli_npm_pyright import do_pyright -from pebble import ProcessPool - -from navio.builder import task - -# on some shells print doesn't flush! -# pylint: disable=redefined-builtin,invalid-name -from navio_tasks.build_state import ( - timed, - skip_if_no_change, - skip_if_this_file_does_not_change, - reset_build_state, -) -from navio_tasks.clean import clean_old_files -from navio_tasks.cli_commands import check_command_exists, execute -from navio_tasks.commands.cli_bandit import do_bandit -from navio_tasks.commands.cli_compile_py import do_compile_py -from navio_tasks.commands.cli_detect_secrets import do_detect_secrets -from navio_tasks.commands.cli_flake8 import do_flake8 -from navio_tasks.commands.cli_get_secrets import do_git_secrets -from navio_tasks.commands.cli_mypy import do_mypy, evaluated_mypy_results -from navio_tasks.commands.cli_pylint import do_lint, evaluated_lint_results -from navio_tasks.commands.cli_pytest import do_pytest, do_pytest_coverage -from navio_tasks.commands.cli_tox import do_tox -from navio_tasks.commands.lib_dodgy import do_dodgy -from navio_tasks.dependency_commands.cli_liccheck import do_liccheck -from navio_tasks.dependency_commands.cli_pin_dependencies import ( - convert_pipenv_to_requirements, -) -from navio_tasks.dependency_commands.cli_pip import do_pip_check, do_register_scripts -from navio_tasks.dependency_commands.cli_safety import do_safety -from navio_tasks.deprecated_commands.cli_check_manifest import do_check_manifest -from navio_tasks.deprecated_commands.cli_pyroma import do_pyroma -from navio_tasks.deprecated_commands.cli_setup_py import ( - do_package, - do_project_validation_for_setup_py, -) -from navio_tasks.file_system import initialize_folders -from navio_tasks.mutating_commands.cli_black import do_formatting -from navio_tasks.mutating_commands.cli_isort import do_isort -from navio_tasks.mutating_commands.cli_jiggle_version import do_jiggle_version -from navio_tasks.mutating_commands.cli_pyupgrade import do_pyupgrade -from navio_tasks.non_breaking_commands.cli_mccabe import do_mccabe -from navio_tasks.non_breaking_commands.cli_scspell import do_spell_check -from navio_tasks.non_breaking_commands.cli_sonar import do_sonar -from navio_tasks.non_breaking_commands.cli_vulture import do_vulture -from navio_tasks.non_py_commands.cli_openapi import do_openapi_check -from navio_tasks.non_py_commands.cli_yamllint import do_yamllint -from navio_tasks.packaging_commands.cli_twine import do_upload_package -from navio_tasks.pure_reports.cli_gitchangelog import do_gitchangelog -from navio_tasks.pure_reports.cli_pygount import do_count_lines_of_code -from navio_tasks.pure_reports.cli_sphinx import do_docs -from navio_tasks.settings import ( - PROJECT_NAME, - POETRY_ACTIVE, - PIPENV_ACTIVE, - VENV_SHELL, - PROBLEMS_FOLDER, - IS_GITLAB, - PYTHON, - IS_INTERNAL_NETWORK, - SMALL_CODE_BASE_CUTOFF, - MAXIMUM_LINT, - MAXIMUM_MYPY, - IS_INTERACTIVE, - PACKAGE_WITH, - IS_SHELL_SCRIPT_LIKE, - RUN_ALL_TESTS_REGARDLESS_TO_NETWORK, -) - -print = functools.partial(print, flush=True) # noqa - -if os.path.exists(".env"): - load_dotenv() - -initialize_folders() - -# If node exists, we can run node build tools. -NODE_EXISTS = check_command_exists( - "node", throw_on_missing=False, exit_on_missing=False -) - -clean_old_files() - - -@task() -@timed() -def check_python_version() -> None: - """ - Possibly should look up min value in Pipenv or .pynt - """ - print(sys.version_info) - if sys.version_info[0] < 3: - print("Must be using Python 3.7") - sys.exit(-1) - if sys.version_info[1] < 7: - print("Must be using Python 3.7 or greater") - sys.exit(-1) - - -@task(check_python_version) -@skip_if_no_change("compile_py") -@timed() -def compile_py() -> None: - """ - Basic syntax check with compileall flag - """ - # policy decision, which python version to use. - do_compile_py(PYTHON) - - -@task() -@timed() -def validate_project_name() -> None: - """ - Verify that all projects/modules are explicitly declared - """ - do_project_validation_for_setup_py() - - -@task() -@timed() -@skip_if_this_file_does_not_change("installs", file="Pipfile") -def pipenv_installs() -> None: - """ - Catch up on installs - """ - # , but only when Pipfile changes because pipenv is so slow - do_dependency_installs(PIPENV_ACTIVE, POETRY_ACTIVE, PIPENV_ACTIVE) - - -@task() -@timed() -def gitchangelog() -> None: - """ - Create a change log from git comments - """ - do_gitchangelog() - - -@task() -@skip_if_no_change("git_leaks") -@timed() -def git_leaks() -> None: - """ - Depends on go! - """ - run_gitleaks() - - -@task() -@skip_if_no_change("git_secrets") -@timed() -def git_secrets() -> None: - """ - Run git secrets utility - """ - do_git_secrets() - - -@task() -@timed() -def reset() -> None: - """ - Delete all .build_state & to force all steps to re-run next build - """ - reset_build_state() - - -@task(pipenv_installs) -@skip_if_no_change("pyupgrade") -@timed() -def pyupgrade() -> str: - """ - Pyupgrade - """ - # supported py3, py36, py37, py38 - # Should be logically consistent with other minimum python version - # tools (vermin, compile_py, tox) - return do_pyupgrade(IS_INTERACTIVE, "py36") - - -@task() -@timed() -def isort() -> None: - """Sort the imports to discover import order bugs and prevent import order bugs""" - # This must run before black. black doesn't change import order but it wins - # any arguments about formatting. - # isort MUST be installed with pipx! It is not compatible with pylint in the same - # venv. Maybe someday, but it just isn't worth the effort. - do_isort() - - -@task(pipenv_installs, pyupgrade, compile_py, isort) -@skip_if_no_change("formatting") -@timed() -def formatting() -> None: - """ - Format main project with black - """ - do_formatting("", BLACK_STATE) - - -@task() -@skip_if_no_change("format_tests") -@timed() -def format_tests() -> None: - """ - Format unit tests with black - """ - do_formatting("test", {"check_already_done": False}) - - -BLACK_STATE = {"check_already_done": False} - - -@task(pipenv_installs, compile_py) -@timed() -def formatting_check() -> None: - """ - Call with check parameter - """ - do_formatting("--check", BLACK_STATE) - - -@task() -@timed() -@skip_if_this_file_does_not_change("pyroma", "setup.py") -def pyroma() -> None: - """ - Pyroma linter - """ - # technically, this can depend on setup.py or setup.cfg... - do_pyroma() - - -@task() -@skip_if_this_file_does_not_change("docker_lint", "Dockerfile") -@timed() -def docker_lint() -> None: - """ - Lint the dockerfile - """ - with open("Dockerfile") as my_input, open( - f"{PROBLEMS_FOLDER}/docker_lint.txt", "w" - ) as my_output: - # ignore = "" # "--ignore DL3003 --ignore DL3006" - command = "docker run --rm -i hadolint/hadolint hadolint -".strip() - _ = subprocess.run(command, stdin=my_input, stdout=my_output, check=True) - - -@task() -@timed() -def spell_check() -> None: - """ - Check spelling using scspell (pip install scspell3k) - """ - do_spell_check() - - -@task() -@skip_if_no_change("yamllint") -@timed() -def yaml_lint() -> str: - """ - Check yaml files for problems - """ - return do_yamllint() - - -@task() -@skip_if_no_change("count_lines_of_code") -@timed() -def count_lines_of_code() -> None: - """ - Count lines of code to set build strictness - """ - do_count_lines_of_code() - - -@task(formatting, compile_py) -@skip_if_this_file_does_not_change("liccheck", "Pipfile") -@timed() -def liccheck() -> None: - """ - Force an explicit decision about license of referenced packages - """ - do_liccheck() - - -@task(formatting, compile_py) -@skip_if_no_change("pyright") -@timed() -def pyright() -> None: - """ - Pyright checks. NODEJS TOOOL! - """ - do_pyright() - - -@task(formatting, compile_py) -@skip_if_no_change("flake8") -@timed() -def flake8() -> None: - """ - Lint with flake8 - """ - do_flake8() - - -@task(formatting, compile_py) -@skip_if_no_change("bandit") -@timed() -def bandit() -> None: - """ - Security linting with bandit - """ - # bandit thinks any use of subprocess is inherently insecure. - # These two exist for running shell commands. - # /scripts/ folder - # build.py itself - do_bandit(IS_SHELL_SCRIPT_LIKE) - - - - -@task(flake8) -@skip_if_no_change("mccabe") -@timed() -def mccabe() -> None: - """ - Complexity checking/reports with mccabe - """ - do_mccabe() - - -@task(formatting, compile_py) -@skip_if_no_change("dodgy") -@timed() -def dodgy_check() -> None: - """ - Linting with dodgy - """ - do_dodgy() - - -@task() -@skip_if_no_change("detect_secrets") -@timed() -def detect_secrets() -> None: - """ - Look for secrets using detect-secrets - """ - # pylint: disable=unreachable - do_detect_secrets() - - -@task(formatting_check) -@skip_if_no_change("precommit") -@timed() -def precommit() -> None: - """ - Build time execution of pre-commit checks. Modifies code so run before linter. - """ - do_precommit(IS_INTERACTIVE) - - -@task() -@timed() -def openapi_check(): - """Run several tools on the api yaml""" - do_openapi_check() - - -@task(compile_py, formatting, count_lines_of_code, openapi_check) -@skip_if_no_change("lint", expect_files=f"{PROBLEMS_FOLDER}/lint.txt") -@timed() -def lint() -> None: - """ - Lint with pylint - """ - lint_file = do_lint(PROJECT_NAME) - - fatals = ["no-member", "no-name-in-module", "import-error"] - evaluated_lint_results( - lint_output_file_name=lint_file, - small_code_base_cut_off=SMALL_CODE_BASE_CUTOFF, - maximum_lint=MAXIMUM_LINT, - fatals=fatals, - ) - - -@task(format_tests) -@skip_if_no_change("lint_tests", expect_files=f"{PROBLEMS_FOLDER}/lint_test.txt") -@timed() -def lint_tests() -> None: - """ - Lint only the tests by a different rule set - """ - lint_file = do_lint("test") - - evaluated_lint_results( - lint_output_file_name=lint_file, - small_code_base_cut_off=SMALL_CODE_BASE_CUTOFF, - maximum_lint=MAXIMUM_LINT, - fatals=[], - ) - - -@task() -@timed() -def tox() -> None: - """Check fast tests on current + next python""" - do_tox() - - -@task() -@skip_if_no_change("pytest", expect_files=f"{PROBLEMS_FOLDER}/pytest.txt") -@timed() -def pytest() -> None: - do_pytest() - - -@task() -@skip_if_no_change( - "coverage_report", expect_files=f"{PROBLEMS_FOLDER}/coverage_report.txt" -) -@timed() -def coverage_report() -> None: - """ - Just the coverage report - """ - # Integration vs non integration - # slow vs fast - # on network vs not on network - if IS_INTERNAL_NETWORK or RUN_ALL_TESTS_REGARDLESS_TO_NETWORK: - fast_only = False - else: - fast_only = True - do_pytest_coverage(fast_only=fast_only) - - -@task() -@skip_if_no_change("docs") -@timed() -def docs() -> None: - """ - Generate Sphynx documentation - """ - do_docs() - - -@task() -@skip_if_this_file_does_not_change("openapi_check", f"{PROJECT_NAME}/api.yaml") -@timed() -def openapi_check() -> None: - """ - Does swagger/openapi file parse - """ - do_openapi_check() - - -@task() -@timed() -@skip_if_this_file_does_not_change("pip_check", "Pipfile") -def pip_check() -> None: - """ - pip check the packages - """ - do_pip_check() - - -@task() -@timed() -@skip_if_this_file_does_not_change("safety", "Pipfile") -def safety() -> None: - """ - Run safety against pinned requirements - """ - do_safety() - - -@task() # this depends on coverage! blows up if xml file doesn't match source -@skip_if_no_change("sonar", expect_files="sonar.json") -@timed() -def sonar() -> None: - """ - Lint using remote sonar service - """ - do_sonar() - - -@task(count_lines_of_code) -@skip_if_no_change("mypy", expect_files=f"{PROBLEMS_FOLDER}/mypy_errors.txt") -@timed() -def mypy() -> None: - """ - Check types using mypy - """ - skips = [ - "tests.py", - "/test_", - "/tests_", - # No clear way to type a decorator - "Untyped decorator", - " not callable", - 'Returning Any from function declared to return "Callable[..., Any]"', - 'Missing type parameters for generic type "Callable"', - # certain modules - "pymarc", - ] - result = do_mypy() - evaluated_mypy_results(result, SMALL_CODE_BASE_CUTOFF, MAXIMUM_MYPY, skips) - - -@task() -@timed() -@skip_if_this_file_does_not_change("pin_dependencies", "Pipfile") -def pin_dependencies() -> None: - """ - Create requirement*.txt - """ - convert_pipenv_to_requirements(pipenv=True) - - -@task() -@skip_if_no_change("vulture", expect_files=f"{PROBLEMS_FOLDER}/dead_code.txt") -@timed() -def vulture() -> None: - """ - Find dead code using vulture - """ - do_vulture() - - -@task(count_lines_of_code) -@skip_if_no_change("check_manifest", f"{PROBLEMS_FOLDER}/manifest_errors.txt") -@timed() -def check_manifest() -> None: - """ - Find files missing from MANIFEST.in - """ - if PACKAGE_WITH == "setup.py": - do_check_manifest() - - -@task() -@timed() -def jiggle_version() -> None: - """ - Increase build number of version, but only if this is the master branch. - """ - do_jiggle_version(is_interactive=IS_INTERACTIVE) - - -@task( - formatting, # changes source - # TODO: switch to parallel - mypy, - detect_secrets, - git_secrets, - vulture, - compile_py, - lint, - flake8, - dodgy_check, - bandit, - mccabe, - pin_dependencies, - jiggle_version, - check_manifest, - # tests as slow as tests are. - pytest, - # nose - # package related - liccheck, - pyroma, - pip_check, - safety, - precommit, # I hope this doesn't change source anymore -) # docs ... later -@skip_if_no_change("package") -@timed() -def package() -> None: - """ - package, but don't upload - """ - do_package() - - -@task() -@timed() -@skip_if_no_change("parallel_checks") -def parallel_checks() -> None: - """ - Do all the checks that don't change code and can run in parallel. - """ - chores = [ - do_mypy, - do_detect_secrets, - do_git_secrets, - vulture, - do_compile_py, - do_lint, - do_flake8, - do_dodgy, - do_bandit, - do_mccabe, - do_check_manifest, - do_liccheck, - ] - if IS_GITLAB: - # other tasks assume there will be a LOC file by now. - do_count_lines_of_code() - for chore in chores: - print(chore()) - return - - # can't do pyroma because that needs a package, which might not exist yet. - - pool = ProcessPool(12) # max_workers=len(chores)) # cpu_count()) - # log_to_stderr(logging.DEBUG) - tasks = [] - for chore in chores: - tasks.append(pool.schedule(chore, args=())) - - print("close & join") - pool.close() - pool.join() - - for current_task in tasks: - # pylint: disable=broad-except - try: - result = current_task.result() - exception = current_task.exception() - if exception: - print(current_task.exception()) - print(result) - if "Abnormal" in str(result): - print("One or more parallel tasks failed.") - sys.exit(-1) - except Exception as ex: - print(ex) - sys.exit(-1) - - -@task( - mypy, # - detect_secrets, - git_secrets, - vulture, - compile_py, - lint, - flake8, - dodgy_check, - bandit, - mccabe, - check_manifest, - liccheck, # -) # docs ... later -@timed() -def slow() -> None: - """ - Same tasks as parallel checks but in serial. For perf comparisons - """ - - -@task( - formatting_check, # changes source - parallel_checks, - # package related checks - # pyroma, # depends on dist folder existing! - # pip_check, # depends on dist folder existing! - jiggle_version, # changes source - precommit, # changes source -) # docs ... later -@timed() -def fast_package() -> None: - """ - Run most tasks in parallel - """ - do_package() - - -@task() -@timed() -def just_package() -> None: - """Package, but do no checks or tests at all""" - print("WARNING: This skips all quality checks.") - do_package() - - -@task() -@timed() -def check_package() -> None: - """ - Run twine check - """ - check_command_exists("twine") - execute(*(f"{VENV_SHELL} twine check dist/*".strip().split(" "))) - - -@task() -@timed() -def upload_package() -> None: - """ - Send to private package repo - """ - do_upload_package() - - -# Conflicting dependencies and blows up on simple scan. -# def run_truffle_hog() -> None: -# """ -# Run truffle hog command -# """ -# # need to get the URL from 'git remote show origin' -# command = ( -# "trufflehog --entropy False " -# "ssh://git@git.loc.gov:7999/COP/public-records/search_ui.git" -# ) -# print(command) - - -# FAST. FATAL ERRORS. DON'T CHANGE THINGS THAT CHECK IN -@task(mypy, detect_secrets, git_secrets, check_package, compile_py, vulture) -@skip_if_no_change("pre_commit_hook") -@timed() -def pre_commit_hook() -> None: - """ - Everything that could be run as a pre_commit_hook - - Mostly superceded by precheck utility - """ - # Don't format or update version - # Don't do slow stuff- discourages frequent check in - # Run checks that are likely to have FATAL errors, not just sloppy coding. - - -# Don't break the build, but don't change source tree either. -@task(mypy, detect_secrets, git_secrets, pytest, check_package, compile_py, vulture) -@skip_if_no_change("pre_push_hook") -@timed() -def pre_push_hook() -> None: - """ - More stringent checks to run pre-push - """ - # Don't format or update version - # Don't do slow stuff- discourages frequent check in - # Run checks that are likely to have FATAL errors, not just sloppy coding. - - -@task() -@skip_if_no_change("config_scripts") -@timed() -def register_scripts() -> None: - do_register_scripts() - - -@task(gitchangelog) -@timed() -def reports() -> None: - """ - Some build tasks can only be read by a human and can't automatically fail a build. - For example, git activity reports, complexity metric reports and so on. - - TODO: - Git reformatting - Authors/Contributors, Changelog - complexity reports - Cure to complexity sometimes worse that the complexity - coverage,- Human HTML report runs separately from coverage as quality gate - dupe code & dead code - Unreliable at detecting real problems - "grades" - spelling - involves lengthy step of updating dictionary with false positives - tox - slow test to say if we can safely upgrade to next version of python/dep - upgrade report - query pypi for new versions - source reformating - Sphinx docs - """ - - -# Default task (if specified) is run when no task is specified in the command line -# make sure you define the variable __DEFAULT__ after the task is defined -# A good convention is to define it at the end of the module -# __DEFAULT__ is an optional member - -# __DEFAULT__ = echo diff --git a/Pipfile b/dead_code/Pipfile similarity index 81% rename from Pipfile rename to dead_code/Pipfile index 061df93..2dfc541 100644 --- a/Pipfile +++ b/dead_code/Pipfile @@ -5,19 +5,19 @@ verify_ssl = true [dev-packages] navio-builder-win = "*" -pytest = "==6.0.1" +pytest = ">=6.0.1" pytest-cov = ">=2.10.1" pytest-timeout = "*" pytest-xdist = ">=2.1.0" -pip-check = "==2.6" -pynt = "==0.8.2" +pip-check = ">=2.6" +pynt = ">=0.8.2" pynt-contrib = "==0.2.0" checksumdir = "==1.1.7" dodgy = "==0.2.1" -gitchangelog = "==3.0.4" +gitchangelog = ">=3.0.4" liccheck = "==0.4.3" -psutil = "==5.6.7" -pebble = "==4.5.0" +psutil = ">=5.6.7" +pebble = ">=4.5.0" gitpython = "*" # hypothesis = "*" sshtunnel = "*" @@ -30,6 +30,11 @@ tox = "*" setuptools-scm = "*" jake = "*" libyear = "*" +types-requests = "*" +types-toml = "*" +types-markdown = "*" +mypy = "*" +pre-commit = "*" [packages] random_names= "*" @@ -65,7 +70,4 @@ slpp-23 = "*" slpp = "*" [requires] -python_version = "3.8" - -[pipenv] -allow_prereleases = true +python_version = "3.11" diff --git a/navio_tasks/commands/__init__.py b/dead_code/md/__init__.py similarity index 100% rename from navio_tasks/commands/__init__.py rename to dead_code/md/__init__.py diff --git a/so_pip/parse_python/md/parse.md.py b/dead_code/md/parse.md.py similarity index 100% rename from so_pip/parse_python/md/parse.md.py rename to dead_code/md/parse.md.py diff --git a/so_pip/parse_python/md/post.md b/dead_code/md/post.md similarity index 100% rename from so_pip/parse_python/md/post.md rename to dead_code/md/post.md diff --git a/docker/Dockerfile b/docker/Dockerfile index 97106f2..eb1a6cc 100644 --- a/docker/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.9.7-slim-buster +FROM python:3.11.1-slim-buster WORKDIR /app ENV PIP_NO_CACHE_DIR=off ENV PYTHONUNBUFFERED=1 @@ -7,12 +7,12 @@ ENV MULTIDICT_NO_EXTENSIONS=1 # RUN apk add --no-cache linux-headers==4.19.36-r0 wget ENV PATH="/root/.local/bin:${PATH}" RUN python -m pip install --user pipx && python -m pipx ensurepath -# RUN python3 -m pipx ensurepath -# isort depends on pylint +# These two tools conflict or we could combine them in the same venv RUN pipx install isort && \ pipx install pylint RUN python -m pip install --no-cache-dir --upgrade pip --quiet \ - && pip install pipenv --no-cache-dir --quiet -COPY dist/so_pip-*-py3-none-any.whl /app/ -RUN pipenv install so_pip-*.whl --skip-lock -ENTRYPOINT ["pipenv", "run", "so_pip"] + && pip install poetry --no-cache-dir --quiet +# Github action doesn't build a local package. But we have one on pypi! +# inexplicable fail with pipenv. +RUN pipx install "so-pip>=0.2.1" +ENTRYPOINT ["so_pip"] diff --git a/docker/Dockerfile_local b/docker/Dockerfile_local new file mode 100644 index 0000000..1d46bb2 --- /dev/null +++ b/docker/Dockerfile_local @@ -0,0 +1,18 @@ +FROM python:3.11.1-slim-buster +WORKDIR /app +ENV PIP_NO_CACHE_DIR=off +ENV PYTHONUNBUFFERED=1 +# multidict doesnt have pre-compiled things for many OSs +ENV MULTIDICT_NO_EXTENSIONS=1 +# RUN apk add --no-cache linux-headers==4.19.36-r0 wget +ENV PATH="/root/.local/bin:${PATH}" +RUN python -m pip install --user pipx && python -m pipx ensurepath +# RUN python3 -m pipx ensurepath +# isort depends on pylint +RUN pipx install isort && \ + pipx install pylint +RUN python -m pip install --no-cache-dir --upgrade pip --quiet \ + && pip install poetry --no-cache-dir --quiet +COPY dist/so_pip-*-py3-none-any.whl /app/ +RUN pip install so_pip-*.whl +ENTRYPOINT ["so_pip"] diff --git a/docs/scenarios.md b/docs/scenarios.md index e4dc812..cb19500 100644 --- a/docs/scenarios.md +++ b/docs/scenarios.md @@ -151,7 +151,7 @@ If an answer is two blocks, if each starts with a shebang or `import` it likely For example, this probably is meant to be two files ``` import requests -requests.get("https://google.com") +requests.get("https://google.com", timeout=10) ``` ``` diff --git a/examples/self_managed_packages/.so_pip.ini b/examples/self_managed_packages/.so_pip.ini index de43455..69af91f 100644 --- a/examples/self_managed_packages/.so_pip.ini +++ b/examples/self_managed_packages/.so_pip.ini @@ -43,4 +43,4 @@ POSSIBLE_LANGUAGES = ["*"] # cli client stuff [SHELL_CONFIG] -SHELL = pipenv run +SHELL = poetry run diff --git a/examples/vendorize_to_src/.so_pip.ini b/examples/vendorize_to_src/.so_pip.ini index de43455..69af91f 100644 --- a/examples/vendorize_to_src/.so_pip.ini +++ b/examples/vendorize_to_src/.so_pip.ini @@ -43,4 +43,4 @@ POSSIBLE_LANGUAGES = ["*"] # cli client stuff [SHELL_CONFIG] -SHELL = pipenv run +SHELL = poetry run diff --git a/navio_tasks/README.md b/navio_tasks/README.md deleted file mode 100644 index 2cd2bde..0000000 --- a/navio_tasks/README.md +++ /dev/null @@ -1,27 +0,0 @@ - - -Tools that check, fix, package, etc. -- [Commands](Commands) are the wrappers around specific cli tools -- [lib_tools](lib_tools) are wrappers around tools w/o a cli interface - -Things for build scripts -- [Build state](build_state.py) keeps track of when source code last changed relative to last -successful run -- [Clean](clean.py) deletes old outputs so that you don't get a mix of new and old -- [cli_commands](cli_commands.py) are mostly wrappers around subprocess (shell) calls -- [settings](settings.py) Per project variations - -Features --------- -- Policies - - code size cut offs (some tools don't make sense on tiny code bases) - - strictness -- environment adaption - - mac/window - - container/not container - - workstation/build server/cloud machine - - VPN/Org Network vs No network vs Home network -- abstracting away the interface - - every tool has its own way of specifying the files/folder to act on - - environment variable input vs switches - - cli interface vs importable python interface diff --git a/navio_tasks/__init__.py b/navio_tasks/__init__.py deleted file mode 100644 index 3afdbef..0000000 --- a/navio_tasks/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -""" -Command line wrappers mostly -""" -from navio_tasks.settings import load_config - -load_config() diff --git a/navio_tasks/build_state.py b/navio_tasks/build_state.py deleted file mode 100644 index 05968f8..0000000 --- a/navio_tasks/build_state.py +++ /dev/null @@ -1,260 +0,0 @@ -""" -Make best efforts to decide if a task needs to run again, or if it is pointless -because the source code hasn't changed. - -Sometimes task depends on the world, not the source code - -Strategies -- folder or source tree changed -- file changed -- list of files changed - -Is it worse is lint counting. Move to different module? -""" -import functools -import hashlib -import os -import shutil -import sys -import time -from typing import Any, Callable, Optional, TypeVar, cast - -from checksumdir import dirhash - -from navio_tasks import settings as settings -from navio_tasks.settings import PROJECT_NAME, SRC -from navio_tasks.utils import inform - -# pylint: disable=invalid-name -FuncType = Callable[..., Any] -# pylint: disable=invalid-name -F = TypeVar("F", bound=FuncType) -CURRENT_HASH = None - -# bash to find what has change recently -# find src/ -type f -print0 | xargs -0 stat -f "%m %N" | sort -rn | head -10 | -# cut -f2- -d" " - - -class BuildState: - """ - Try not to re-do what doesn't need to be redone - """ - - def __init__(self, what: str, directory: str) -> None: - """ - Set initial state - """ - self.what = what - self.directory = directory - if not os.path.exists(f"{settings.CONFIG_FOLDER}/.build_state"): - os.makedirs(f"{settings.CONFIG_FOLDER}/.build_state") - self.state_file_name = ( - f"{settings.CONFIG_FOLDER}/.build_state/last_change_{what}.txt" - ) - - def oh_never_mind(self) -> None: - """ - If a task fails, we don't care if it didn't change since last, re-run, - """ - # noinspection PyBroadException - # pylint: disable=bare-except - try: - os.remove(self.state_file_name) - except: # noqa: B001 - pass - - def has_source_code_tree_changed(self) -> bool: - """ - If a task succeeds & is re-run and didn't change, we might not - want to re-run it if it depends *only* on source code - """ - # pylint: disable=global-statement - global CURRENT_HASH - directory = self.directory - - # if CURRENT_HASH is None: - # inform("hashing " + directory) - # inform(os.listdir(directory)) - CURRENT_HASH = dirhash( - directory, - "md5", - ignore_hidden=True, - # changing these exclusions can cause dirhas to skip EVERYTHING - # excluded_files=[".coverage", "lint.txt"], - excluded_extensions=[".pyc"], - ) - - inform("Searching " + self.state_file_name) - if os.path.isfile(self.state_file_name): - with open(self.state_file_name, "r+") as file: - last_hash = file.read() - if last_hash != CURRENT_HASH: - file.seek(0) - file.write(CURRENT_HASH) - file.truncate() - return True - return False - - # no previous file, by definition not the same. - with open(self.state_file_name, "w") as file: - file.write(CURRENT_HASH) - return True - - -def oh_never_mind(what: str) -> None: - """ - If task fails, remove file that says it was recently run. - Needs to be like this because tasks can change code (and change the hash) - """ - state = BuildState(what, PROJECT_NAME) - state.oh_never_mind() - - -def has_source_code_tree_changed( - task_name: str, expect_file: Optional[str] = None -) -> bool: - """ - Hash source code tree to know if it has changed - - Also check if an expected output file exists or not. - """ - if expect_file: - if os.path.isdir(expect_file) and not os.listdir(expect_file): - os.path.dirname(expect_file) - # output folder empty - return True - if not os.path.isfile(expect_file): - # output file gone - return True - state = BuildState(task_name, os.path.join(SRC, PROJECT_NAME)) - return state.has_source_code_tree_changed() - - -def skip_if_no_change(name: str, expect_files: Optional[str] = None) -> F: - """ - Don't run decorated task if nothing in the source has changed. - """ - - # https://stackoverflow.com/questions/5929107/decorators-with-parameters - def real_decorator(func: F) -> F: - """Wrapper""" - - @functools.wraps(func) - def wrapper(*args: Any, **kwargs: Any) -> Callable: - """Wrapper""" - if not has_source_code_tree_changed(name, expect_files): - inform("Nothing changed, won't re-" + name) - return lambda x: None - try: - return func(*args, **kwargs) - except: # noqa: B001 - oh_never_mind(name) - raise - - return cast(F, wrapper) - - return cast(F, real_decorator) - - -def hash_it(path: str) -> str: - """ - Hash a single file. Return constant if it doesn't exist. - """ - if not os.path.exists(path): - return "DOESNOTEXIST" - with open(path, "rb") as file_handle: - return hashlib.sha256(file_handle.read()).hexdigest() - - -def skip_if_this_file_does_not_change(name: str, file: str) -> F: - """ - Skip decorated task if this referenced file didn't change. Useful - if a task depends on a single file and not (potentially) any file in the source tree - """ - - def real_decorator(func: F) -> F: - """Wrapper""" - - @functools.wraps(func) - def wrapper(*args: Any, **kwargs: Any) -> Callable: - """Wrapper""" - state_file = ( - f"{settings.CONFIG_FOLDER}/.build_state/file_hash_" + name + ".txt" - ) - previous_hash = "catdog" - if os.path.exists(state_file): - with open(state_file) as old_file: - previous_hash = old_file.read() - - new_hash = hash_it(file) - if new_hash == previous_hash: - inform("Nothing changed, won't re-" + name) - return lambda x: f"Skipping {name}, no change" - if not os.path.exists(f"{settings.CONFIG_FOLDER}/.build_state"): - os.makedirs(f"{settings.CONFIG_FOLDER}/.build_state") - with open(state_file, "w+") as state: - state.write(new_hash) - try: - - return func(*args, **kwargs) - except: # noqa: B001 - # reset if step fails - os.remove(state_file) - raise - - return cast(F, wrapper) - - return cast(F, real_decorator) - - -def reset_build_state() -> None: - """ - Delete all .build_state & to force all steps to re-run next build - """ - if os.path.exists(f"{settings.CONFIG_FOLDER}/.build_state"): - shutil.rmtree(f"{settings.CONFIG_FOLDER}/.build_state") - if not os.path.exists(f"{settings.CONFIG_FOLDER}/.build_state"): - os.makedirs(f"{settings.CONFIG_FOLDER}/.build_state") - - -def timed() -> F: - """This decorator prints the execution time for the decorated function.""" - - def real_decorator(func: F) -> F: - """Wrapper""" - - @functools.wraps(func) - def wrapper(*args: Any, **kwargs: Any) -> Callable: - """Wrapper""" - start = time.time() - result = func(*args, **kwargs) - end = time.time() - inform("{} ran in {}s".format(func.__name__, round(end - start, 2))) - return result - - return cast(F, wrapper) - - return cast(F, real_decorator) - - -def is_it_worse(task_name: str, current_rows: int, margin: int) -> bool: - """ - Logic for dealing with a code base with very large amounts of lint. - - You will never fix it all, just don't make it worse. - """ - if not os.path.exists(f"{settings.CONFIG_FOLDER}/.build_state"): - os.makedirs(f"{settings.CONFIG_FOLDER}/.build_state") - file_name = f"{settings.CONFIG_FOLDER}/.build_state/last_count_{task_name}.txt" - - last_rows = sys.maxsize - if os.path.isfile(file_name): - with open(file_name, "r+") as file: - last_rows = int(file.read()) - if last_rows != current_rows: - file.seek(0) - file.write(str(current_rows)) - file.truncate() - - return current_rows > (last_rows + margin) diff --git a/navio_tasks/clean.py b/navio_tasks/clean.py deleted file mode 100644 index de4b2b5..0000000 --- a/navio_tasks/clean.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -Removing old crap. - -Trivial except when something has a lock on a file. -""" -import os - - -def clean_old_files() -> None: - """ - Output files all moved to /problems/ or /reports/, clean up - detritus left by old versions of build.py - """ - for file in [ - "dead_code.txt", - "lint.txt", - "mypy_errors.txt", - "line_counts.txt", - "manifest_errors.txt", - "detect-secrets-results.txt", - ]: - if os.path.exists(file): - os.remove(file) diff --git a/navio_tasks/cli_commands.py b/navio_tasks/cli_commands.py deleted file mode 100644 index afc1404..0000000 --- a/navio_tasks/cli_commands.py +++ /dev/null @@ -1,221 +0,0 @@ -""" -Generic tools for handling shell commands, as opposed to commands that -can be executed via `import tool` -""" -import io -import os -import re -import shlex -import shutil -import subprocess -import sys -from contextlib import redirect_stderr, redirect_stdout -from typing import Dict, Iterable, List, Optional, Tuple - -import psutil - -from navio_tasks import settings as settings -from navio_tasks.settings import PROJECT_NAME, VENV_SHELL -from navio_tasks.system_info import is_powershell -from navio_tasks.utils import inform - - -def config_pythonpath() -> Dict[str, str]: - """ - Add to PYTHONPATH - """ - my_env = { - "PYTHONIOENCODING": "utf-8", - "LC_ALL": "en_US.UTF-8", - "LANG": "en_US.UTF-8", - "PYTHONDONTWRITEBYTECODE": "", - } - for key, value in os.environ.items(): - my_env[key] = value - my_env["PYTHONPATH"] = my_env.get("PYTHONPATH", "") # + VENDOR_LIBS - return my_env - - -def is_cmd_exe() -> bool: - """ - Check if parent process or other ancestor process is cmd - """ - # ref https://stackoverflow.com/a/55598796/33264 - # Get the parent process name. - try: - process_name = psutil.Process(os.getppid()).name() - grand_process_name = psutil.Process(os.getppid()).parent().name() - # pylint: disable=bare-except, broad-except - try: - great_grand_process_name = ( - psutil.Process(os.getppid()).parent().parent().name() - ) - except: # noqa: B001 - great_grand_process_name = "No great grandparent" - - inform(process_name, grand_process_name, great_grand_process_name) - is_that_shell = bool(re.fullmatch("cmd|cmd.exe", process_name)) - if not is_that_shell: - is_that_shell = bool(re.fullmatch("cmd|cmd.exe", grand_process_name)) - if not is_that_shell: - is_that_shell = bool(re.fullmatch("cmd|cmd.exe", great_grand_process_name)) - except psutil.NoSuchProcess: - inform("Can't tell if this is cmd.exe, assuming not.") - is_that_shell = False - return is_that_shell - - -def check_command_exists( - command: str, throw_on_missing: bool = False, exit_on_missing: bool = True -) -> bool: - """ - Check if exists by a variety of methods that vary by shell - - # can this be replaced with shutil.which? - """ - - if not os.path.exists(f"{settings.CONFIG_FOLDER}/.build_state"): - os.makedirs(f"{settings.CONFIG_FOLDER}/.build_state") - state_file = f"{settings.CONFIG_FOLDER}/.build_state/exists_" + command + ".txt" - if os.path.exists(state_file): - return True - - # when I originally wrote this function, I didn't know about shutil.which - # if it performs well across many OSs, then we can phase out the rest. - if shutil.which(command): - already_found(command) - return True - venv_shell = [_ for _ in VENV_SHELL.split(" ") if _ != ""] - - # Build command & print. Must do here or the print gets redirected! - # these commands lack a --version. - if command in ["pyroma", "liccheck", "pipenv_to_requirements", "pyupgrade", "pyt"]: - # will fail unless bash shell - if is_powershell(): - cmd = venv_shell + ["powershell", "get-command", command] - else: - cmd = venv_shell + ["which", command] - else: - cmd = venv_shell + [command, "--version"] - - # pylint: disable=broad-except - try: - with io.StringIO() as buf, io.StringIO() as buf2, redirect_stdout( - buf - ), redirect_stderr(buf2): - # execute command built up above. - _ = subprocess.check_output(cmd) - output = buf.getvalue() - output2 = buf2.getvalue() - inform(output, output2) - if "not recognized" in output or "not recognized" in output2: - inform(f"Got error checking if {command} exists") - if throw_on_missing: - raise TypeError("Can't find command") - if exit_on_missing: - sys.exit(-1) - return False - already_found(command) - except OSError as os_error: - inform(os_error) - inform(f"Got error checking if {command} exists") - if throw_on_missing: - raise - if exit_on_missing: - sys.exit(-1) - return False - # pylint: disable=broad-except - except Exception as ex: - inform("Other error") - inform(ex) - inform(f"Got error checking if {command} exists") - if throw_on_missing: - raise - if exit_on_missing: - sys.exit(-1) - return False - return True - - -def already_found(command: str) -> None: - """Check if we already checked if this command exists.""" - with open( - f"{settings.CONFIG_FOLDER}/.build_state/exists_" + command + ".txt", "w+" - ) as handle: - handle.write("OK") - - -def prepinform_simple(command: str, no_project: bool = False) -> str: - """ - Deal with simple command that only takes project name as arg - """ - if no_project: - command = f"{VENV_SHELL} {command}".strip().replace(" ", " ") - else: - command = f"{VENV_SHELL} {command} {PROJECT_NAME}".strip().replace(" ", " ") - inform(command) - return command - - -def execute_get_text( - command: List[str], - ignore_error: bool = False, - # shell: bool = True, # causes cross plat probs, security warnings, etc. - env: Optional[Dict[str, str]] = None, -) -> str: - """ - Execute shell command and return stdout txt - """ - if env is None: - env = {} - - completed = None - try: - completed = subprocess.run( - command, - check=not ignore_error, - # shell=shell, # causes cross plat probs, security warnings, etc. - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - env=env, - ) - except subprocess.CalledProcessError: - if ignore_error and completed: - return completed.stdout.decode("utf-8") + completed.stderr.decode("utf-8") - raise - else: - return completed.stdout.decode("utf-8") + completed.stderr.decode("utf-8") - - -# from pynt.contrib -def execute(script: str, *args: Iterable[str]) -> int: - """ - Executes a command through the shell. Spaces should breakup the args. - Usage: execute('grep', 'TODO', '*') - """ - - popen_args = [script] + list(args) - # pylint: disable=broad-except - try: - return subprocess.check_call(popen_args, shell=False) # noqa - except subprocess.CalledProcessError as ex: - inform(ex) - sys.exit(ex.returncode) - except Exception as ex: - inform(f"Error: {ex} with script: {script} and args {args}") - sys.exit(1) - - -def execute_with_environment(command: str, env: Dict[str, str]) -> Tuple[bytes, bytes]: - """ - Yet another helper to execute a command - """ - # Python 2 code! Python 3 uses context managers. - command_text = command.strip().replace(" ", " ") - command_parts = shlex.split(command_text) - shell_process = subprocess.Popen(command_parts, env=env) - value = shell_process.communicate() # wait - if shell_process.returncode != 0: - inform(f"Didn't get a zero return code, got : {shell_process.returncode}") - sys.exit(-1) - return value diff --git a/navio_tasks/commands/README.md b/navio_tasks/commands/README.md deleted file mode 100644 index 737209c..0000000 --- a/navio_tasks/commands/README.md +++ /dev/null @@ -1,12 +0,0 @@ -All the commands in the folder - -- Break the build if there is a problem -- Represent governance -- Should each have a way to - - fix a problem - - ignore a problem, explicitly (ignore lint for 1 line of code) - - allow for a certain number of problems (e.g. 10 lines of lint) - - -It is fair to ask developers to make sure all of the tools in this folder -say the code is secure and has no problems that can be detected. diff --git a/navio_tasks/commands/cli_bandit.py b/navio_tasks/commands/cli_bandit.py deleted file mode 100644 index b06c203..0000000 --- a/navio_tasks/commands/cli_bandit.py +++ /dev/null @@ -1,30 +0,0 @@ -""" -Only reports -No file changes -Should break build on any issues. -Expect few issues -All issues should be addressable immediately. -""" - - -from navio_tasks.cli_commands import check_command_exists, execute, prepinform_simple - - -def do_bandit(is_shell_script_like: bool) -> str: - """ - Security Checks - - Generally returns a small number of problems to fix. - """ - if is_shell_script_like: - return ( - "Skipping bandit, this code is shell script-like so it has security" - "issues on purpose." - ) - - command = "bandit" - check_command_exists(command) - command = "bandit -r" - command = prepinform_simple(command) - execute(*(command.split(" "))) - return "bandit succeeded" diff --git a/navio_tasks/commands/cli_compile_py.py b/navio_tasks/commands/cli_compile_py.py deleted file mode 100644 index f3c5e82..0000000 --- a/navio_tasks/commands/cli_compile_py.py +++ /dev/null @@ -1,39 +0,0 @@ -""" -See if python compiles. - -TODO: Maybe implement vermin, another compilation checker. -""" - -import shlex - -from navio_tasks.cli_commands import ( - config_pythonpath, - execute_get_text, - prepinform_simple, -) -from navio_tasks.utils import inform - - -def do_compile_py(python: str) -> str: - """ - Catch only the worst syntax errors in the currently python version - """ - command_text = f"{python} -m compileall" - command_text = prepinform_simple(command_text) - command = shlex.split(command_text) - result = execute_get_text(command, env=config_pythonpath()) - for line in result.split("\n"): - if line and (line.startswith("Compiling") or line.startswith("Listing")): - pass - else: - inform(line) - return "compileall succeeded" - - -# Vermin sample output -# Tip: You're using potentially backported modules: argparse, configparser, typing -# If so, try using the following for better results: --backport argparse -# --backport configparser --backport typing -# -# Minimum required versions: 3.6 -# Incompatible versions: 2 diff --git a/navio_tasks/commands/cli_detect_secrets.py b/navio_tasks/commands/cli_detect_secrets.py deleted file mode 100644 index e48b12f..0000000 --- a/navio_tasks/commands/cli_detect_secrets.py +++ /dev/null @@ -1,76 +0,0 @@ -""" -Only reports -No file changes -Should break build on any issues. -Expect few issues -All issues should be addressable immediately. -""" -import json -import shlex -import sys - -from navio_tasks.cli_commands import ( - check_command_exists, - config_pythonpath, - execute_get_text, -) -from navio_tasks.output import say_and_exit -from navio_tasks.settings import PROBLEMS_FOLDER, VENV_SHELL -from navio_tasks.utils import inform - - -def do_detect_secrets() -> str: - """ - Call detect-secrets tool - - I think this is the problem: - - # Code expects to stream output to file and then expects - # interactive person, so code hangs. But also hangs in git-bash - detect-secrets scan test_data/config.env > foo.txt - detect-secrets audit foo.txt - """ - inform("Detect secrets broken ... can't figure out why") - return "nope" - - # pylint: disable=unreachable - check_command_exists("detect-secrets") - errors_file = f"{PROBLEMS_FOLDER}/detect-secrets-results.txt" - command_text = ( - f"{VENV_SHELL} detect-secrets scan " - "--base64-limit 4 " - # f"--exclude-files .idea|.min.js|.html|.xsd|" - # f"lock.json|.scss|Pipfile.lock|.secrets.baseline|" - # f"{PROBLEMS_FOLDER}/lint.txt|{errors_file}".strip().replace(" ", " ") - ) - inform(command_text) - command = shlex.split(command_text) - - with open(errors_file, "w") as outfile: - env = config_pythonpath() - output = execute_get_text(command, ignore_error=False, env=env) - outfile.write(output) - # subprocess.call(command, stdout=outfile, env=env) - - with open(errors_file, "w+") as file_handle: - text = file_handle.read() - if not text: - say_and_exit("Failed to check for secrets", "detect-secrets") - sys.exit(-1) - file_handle.write(text) - - try: - with open(errors_file) as json_file: - data = json.load(json_file) - - if data["results"]: - for result in data["results"]: - inform(result) - say_and_exit( - "detect-secrets has discovered high entropy strings, " - "possibly passwords?", - "detect-secrets", - ) - except json.JSONDecodeError: - pass - return "Detect secrets completed." diff --git a/navio_tasks/commands/cli_django_tests.py b/navio_tasks/commands/cli_django_tests.py deleted file mode 100644 index a773e6b..0000000 --- a/navio_tasks/commands/cli_django_tests.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -Only reports -No file changes -Should break build on any issues. -Expect few issues -All issues should be addressable immediately. -""" -import os - -from navio_tasks.cli_commands import config_pythonpath, execute_with_environment -from navio_tasks.settings import PYTHON - - -# Legacy code. Don't use nose. -def do_django_tests() -> None: - """ - manage.py tests - """ - - # check_command_exists("") - if os.path.exists("manage.py"): - do_django_tests_regardless() - - -def do_django_tests_regardless() -> None: - """ - Extracted function to make easier to test this task - """ - command = f"{PYTHON} manage.py test -v 2" - my_env = config_pythonpath() - execute_with_environment(command, env=my_env) diff --git a/navio_tasks/commands/cli_flake8.py b/navio_tasks/commands/cli_flake8.py deleted file mode 100644 index 7bfba1a..0000000 --- a/navio_tasks/commands/cli_flake8.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -Only reports -No file changes -Should break build on any issues. -Expect few issues -All issues should be addressable immediately. -------- -Rarely more than 1 or two issues if you have already worked pylint. -""" - -from navio_tasks import settings as settings -from navio_tasks.cli_commands import check_command_exists, execute, prepinform_simple - - -def do_flake8() -> str: - """ - Flake8 Checks - """ - command = "flake8" - check_command_exists(command) - command_text = f"flake8 --config {settings.CONFIG_FOLDER}/.flake8" - command_text = prepinform_simple(command_text) - execute(*(command_text.split(" "))) - return "flake 8 succeeded" diff --git a/navio_tasks/commands/cli_get_secrets.py b/navio_tasks/commands/cli_get_secrets.py deleted file mode 100644 index 6c5d01f..0000000 --- a/navio_tasks/commands/cli_get_secrets.py +++ /dev/null @@ -1,69 +0,0 @@ -""" -Only reports -No file changes -Should break build on any issues. -Expect few issues -All issues should be addressable immediately. -------- -""" -import shlex -import subprocess - -from navio_tasks.cli_commands import check_command_exists, execute, is_cmd_exe -from navio_tasks.settings import IS_GITLAB -from navio_tasks.system_info import check_is_aws, is_git_repo -from navio_tasks.utils import inform - - -def do_git_secrets() -> str: - """ - Install git secrets if possible. - """ - if is_cmd_exe(): - inform("git secrets is a bash script, only works in bash (or maybe PS") - return "skipped git secrets, this is cmd.exe shell" - # not sure how to check for a git subcommand - if not is_git_repo("."): - inform("This is not a git repo, won't run git-secrets") - return "Not a git repo, skipped" - check_command_exists("git") - - if check_is_aws(): - # no easy way to install git secrets on ubuntu. - return "This is AWS, not doing git-secrets" - if IS_GITLAB: - inform("Nothing is edited on gitlab build server") - return "This is gitlab, not doing git-secrets" - try: - # check to see if secrets even is a git command - - commands = ["git secrets --install", "git secrets --register-aws"] - for command in commands: - command_parts = shlex.split(command) - command_process = subprocess.run( - command_parts, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - check=True, - ) - for stream in [command_process.stdout, command_process.stderr]: - if stream: - for line in stream.decode().split("\n"): - inform("*" + line) - except subprocess.CalledProcessError as cpe: - inform(cpe) - installed = False - for stream in [cpe.stdout, cpe.stderr]: - if stream: - for line in stream.decode().split("\n"): - inform("-" + line) - if "commit-msg already exists" in line: - inform("git secrets installed.") - installed = True - break - if not installed: - raise - command_text = "git secrets --scan -r ./".strip().replace(" ", " ") - command_parts = shlex.split(command_text) - execute(*command_parts) - return "git-secrets succeeded" diff --git a/navio_tasks/commands/cli_go_gitleaks.py b/navio_tasks/commands/cli_go_gitleaks.py deleted file mode 100644 index e1afa36..0000000 --- a/navio_tasks/commands/cli_go_gitleaks.py +++ /dev/null @@ -1,39 +0,0 @@ -""" -Implemented in go. - -Hangs on my workstation. -""" -import os -import shlex -import subprocess - -from navio_tasks.settings import PROJECT_NAME -from navio_tasks.utils import inform - - -def run_gitleaks() -> None: - """ - Run the gitleaks command. - - Depends on go! - """ - # git remote get-url --all origin - # So far nothing works... as if current repo is corrupt - cwd = os.getcwd() - command_text = "gitleaks --repo-path={} --report=/tmp/{}.csv".format( - cwd, PROJECT_NAME - ).strip() - inform(command_text) - command = shlex.split(command_text) - _ = subprocess.run( - command, - stdout=subprocess.PIPE, - stderr=subprocess.PIPE, - env={ - **os.environ, - "GOPATH": os.path.expandvars("$HOME/gocode"), - "PATH": os.path.expandvars("$PATH/$GOPATH/bin"), - }, - # shell=False, # keep false if possible. - check=True, - ) diff --git a/navio_tasks/commands/cli_mypy.py b/navio_tasks/commands/cli_mypy.py deleted file mode 100644 index ec439a7..0000000 --- a/navio_tasks/commands/cli_mypy.py +++ /dev/null @@ -1,91 +0,0 @@ -""" -Type checking. Hardest to fix, most likely to find a real bug. -""" -import subprocess -import sys -from typing import List - -from navio_tasks.cli_commands import check_command_exists -from navio_tasks.output import say_and_exit -from navio_tasks.pure_reports.cli_pygount import total_loc - -# Anything that feels like governance/policy should be in build.py -from navio_tasks.settings import PROBLEMS_FOLDER, PROJECT_NAME, VENV_SHELL -from navio_tasks.utils import inform - - -def do_mypy() -> str: - """ - Are types ok? - """ - check_command_exists("mypy") - if sys.version_info < (3, 4): - inform("Mypy doesn't work on python < 3.4") - return "command is missing" - command = ( - f"{VENV_SHELL} mypy {PROJECT_NAME} " - "--ignore-missing-imports " - "--strict".strip().replace(" ", " ") - ) - inform(command) - bash_process = subprocess.Popen( - command.split(" "), stdout=subprocess.PIPE, stderr=subprocess.PIPE - ) - out, _ = bash_process.communicate() # wait - mypy_file = f"{PROBLEMS_FOLDER}/all_mypy_errors.txt" - with open(mypy_file, "w", encoding="utf-8") as out_file: - out_file.write(out.decode()) - return mypy_file - - -def evaluated_mypy_results( - mypy_file: str, small_code_base_cutoff: int, maximum_mypy: int, skips: List[str] -) -> str: - """ - Decided if the mypy is bad enough to stop the build. - """ - with open(mypy_file) as out_file: - out = out_file.read() - - def contains_a_skip(line_value: str) -> bool: - """ - Should this line be skipped - """ - # skips is a closure - for skip in skips: - if skip in line_value or line_value.startswith(skip): - return True - return False - - actually_bad_lines: List[str] = [] - total_lines = 0 - with open(mypy_file, "w+") as lint_file: - lines = out.split("\n") - for line in lines: - total_lines += 1 - if contains_a_skip(line): - continue - if not line.startswith(PROJECT_NAME): - continue - actually_bad_lines.append(line) - lint_file.writelines([line]) - - num_lines = len(actually_bad_lines) - if total_loc() > small_code_base_cutoff: - max_lines = maximum_mypy - else: - max_lines = 2 # off by 1 right now - - if num_lines > max_lines: - for line in actually_bad_lines: - inform(line) - say_and_exit(f"Too many lines of mypy : {num_lines}, max {max_lines}", "mypy") - sys.exit(-1) - - if num_lines == 0 and total_lines == 0: - # should always have at least 'found 0 errors' in output - say_and_exit( - "No mypy warnings at all, did mypy fail to run or is it installed?", "mypy" - ) - sys.exit(-1) - return "mypy succeeded" diff --git a/navio_tasks/commands/cli_npm_pyright.py b/navio_tasks/commands/cli_npm_pyright.py deleted file mode 100644 index 9f0bf8a..0000000 --- a/navio_tasks/commands/cli_npm_pyright.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -Code checks, but tool is a node app. -""" -from navio_tasks.cli_commands import check_command_exists, execute, prepinform_simple -from navio_tasks.utils import inform - - -def do_pyright() -> str: - """ - Execute pyright - """ - - command = "pyright" - if check_command_exists(command, throw_on_missing=False): - # subprocess.check_call(("npm install -g pyright").split(" "), shell=True) - inform( - "You must install pyright before doing pyright checks: " - "npm install -g pyright" - ) - command = prepinform_simple(command) - command += "/**/*.py" - execute(*(command.split(" "))) - return "Pyright finished" diff --git a/navio_tasks/commands/cli_poetry.py b/navio_tasks/commands/cli_poetry.py deleted file mode 100644 index e69de29..0000000 diff --git a/navio_tasks/commands/cli_pylint.py b/navio_tasks/commands/cli_pylint.py deleted file mode 100644 index 51132cf..0000000 --- a/navio_tasks/commands/cli_pylint.py +++ /dev/null @@ -1,146 +0,0 @@ -""" -Lots of code gripes. -""" -import os -import shlex -import subprocess -import sys -from typing import List - -from navio_tasks import settings as settings -from navio_tasks.cli_commands import check_command_exists, config_pythonpath -from navio_tasks.output import say_and_exit -from navio_tasks.pure_reports.cli_pygount import total_loc -from navio_tasks.settings import ( - IS_DJANGO, - IS_GITLAB, - PROBLEMS_FOLDER, - PROJECT_NAME, - VENV_SHELL, -) -from navio_tasks.utils import inform - - -def do_lint(folder_type: str) -> str: - """ - Execute pylint - """ - # pylint: disable=too-many-locals - check_command_exists("pylint") - if folder_type == PROJECT_NAME: - pylintrc = f"{settings.CONFIG_FOLDER}/.pylintrc" - lint_output_file_name = f"{PROBLEMS_FOLDER}/lint.txt" - else: - pylintrc = f"{settings.CONFIG_FOLDER}/.pylintrc_{folder_type}" - lint_output_file_name = f"{PROBLEMS_FOLDER}/lint_{folder_type}.txt" - - if os.path.isfile(lint_output_file_name): - os.remove(lint_output_file_name) - - if IS_DJANGO: - django_bits = "--load-plugins pylint_django " - else: - django_bits = "" - - # pylint: disable=pointless-string-statement - command_text = ( - f"{VENV_SHELL} pylint {django_bits} " f"--rcfile={pylintrc} {folder_type} " - ) - - command_text += " " - "--msg-template={path}:{line}: [{msg_id}({symbol}), {obj}] {msg}" - "".strip().replace(" ", " ") - - inform(command_text) - command = shlex.split(command_text) - - with open(lint_output_file_name, "w") as outfile: - env = config_pythonpath() - subprocess.call(command, stdout=outfile, env=env) - return lint_output_file_name - - -def evaluated_lint_results( - lint_output_file_name: str, - small_code_base_cut_off: int, - maximum_lint: int, - fatals: List[str], -) -> str: - """Deciding if the lint is bad enough to fail - Also treats certain errors as fatal even if under the maximum cutoff. - """ - with open(lint_output_file_name) as file_handle: - full_text = file_handle.read() - lint_did_indeed_run = "Your code has been rated at" in full_text - - with open(lint_output_file_name) as file_handle: - fatal_errors = sum(1 for line in file_handle if ": E" in line or ": F" in line) - for fatal in fatals: - for line in file_handle: - if fatal in file_handle or ": E" in line or ": F" in line: - fatal_errors += 1 - - if fatal_errors > 0: - with open(lint_output_file_name) as file_handle: - for line in file_handle: - if "*************" in line: - continue - if not line or not line.strip("\n "): - continue - inform(line.strip("\n ")) - - message = f"Fatal lint errors and possibly others, too : {fatal_errors}" - if IS_GITLAB: - with open(lint_output_file_name) as error_file: - inform(error_file.read()) - say_and_exit(message, "lint") - return message - with open(lint_output_file_name) as lint_file_handle: - for line in [ - line - for line in lint_file_handle - if not ( - "*************" in line - or "---------------------" in line - or "Your code has been rated at" in line - or line == "\n" - ) - ]: - inform(line) - - if total_loc() > small_code_base_cut_off: - cutoff = maximum_lint - else: - cutoff = 0 - with open(lint_output_file_name) as lint_file_handle: - num_lines = sum( - 1 - for line in lint_file_handle - if not ( - "*************" in line - or "---------------------" in line - or "Your code has been rated at" in line - or line == "\n" - ) - ) - if num_lines > cutoff: - say_and_exit(f"Too many lines of lint : {num_lines}, max {cutoff}", "pylint") - sys.exit(-1) - with open(lint_output_file_name) as lint_file_handle: - num_lines_all_output = sum(1 for _ in lint_file_handle) - if ( - not lint_did_indeed_run - and num_lines_all_output == 0 - and os.path.isfile(lint_output_file_name) - ): - # should always have at least 'found 0 errors' in output - - # force lint to re-run, because empty file will be missing - os.remove(lint_output_file_name) - say_and_exit( - "No lint messages at all, did pylint fail to run or is it installed?", - "pylint", - ) - sys.exit(-1) - - return "pylint succeeded" diff --git a/navio_tasks/commands/cli_pytest.py b/navio_tasks/commands/cli_pytest.py deleted file mode 100644 index 7ecd8b8..0000000 --- a/navio_tasks/commands/cli_pytest.py +++ /dev/null @@ -1,98 +0,0 @@ -""" -Only reports -No file changes -Should break build on any issues. -Expect few issues -All issues should be addressable immediately. ----------- -""" -import multiprocessing - -from navio_tasks.cli_commands import ( - check_command_exists, - config_pythonpath, - execute_with_environment, -) -from navio_tasks.settings import ( - IS_GITLAB, - IS_INTERNAL_NETWORK, - MINIMUM_TEST_COVERAGE, - PROJECT_NAME, - REPORTS_FOLDER, - RUN_ALL_TESTS_REGARDLESS_TO_NETWORK, - VENV_SHELL, -) -from navio_tasks.utils import inform - - -def do_pytest() -> None: - """ - Pytest and coverage, which replaces nose tests - """ - check_command_exists("pytest") - - # Somedays VPN just isn't there. - if IS_INTERNAL_NETWORK or RUN_ALL_TESTS_REGARDLESS_TO_NETWORK: - fast_only = False - else: - fast_only = True - if fast_only: - test_folder = "test/test_fast" - minimum_coverage = 48 - else: - test_folder = "test" - minimum_coverage = MINIMUM_TEST_COVERAGE - - my_env = config_pythonpath() - - command = ( - f"{VENV_SHELL} pytest {test_folder} -v " - f"--junitxml={REPORTS_FOLDER}/sonar-unit-test-results.xml " - "--cov-report xml " - f"--cov={PROJECT_NAME} " - f"--cov-fail-under {minimum_coverage}".strip().replace(" ", " ") - + " --quiet" # 15000 pages of call stack don't help anyone - ) - # when it works, it is FAST. when it doesn't, we get lots of timeouts. - # if not IS_GITLAB: - # command += f" -n {multiprocessing.cpu_count()} " - if not IS_GITLAB: - command += " -n 2 " - - inform(command) - execute_with_environment(command, my_env) - inform("Tests will not be re-run until code changes. Run pynt reset to force.") - - -def do_pytest_coverage(fast_only: bool) -> None: - """ - Just the coverage report - """ - # this is failing on windows - # check_command_exists("py.test") - - my_env = config_pythonpath() - - # generate report separate from cov-fail-under step. - # py.test incorrectly reports 0.00 coverage, - # but only when reports are generated. - - # Coverage report is (sometimes) broken. Need alternative to py.test? - # This is consuming too much time to figure out why it - # collects no tests & then fails on code 5 - - if fast_only: - test_folder = "test/test_fast" - else: - test_folder = "test" - - command = ( - f"{VENV_SHELL} pytest {test_folder} -v " - "--cov-report html:coverage " - f"--cov={PROJECT_NAME}".strip().replace(" ", " ") - ) - if not IS_GITLAB: - command += f" -n {multiprocessing.cpu_count()} " - inform(command) - execute_with_environment(command, my_env) - inform("Coverage will not rerun until code changes. Run `pynt reset` to force") diff --git a/navio_tasks/commands/cli_tox.py b/navio_tasks/commands/cli_tox.py deleted file mode 100644 index ab31354..0000000 --- a/navio_tasks/commands/cli_tox.py +++ /dev/null @@ -1,32 +0,0 @@ -""" -See if everything works with python 3.8 and upcoming libraries -""" -import shlex - -from navio_tasks import settings as settings -from navio_tasks.cli_commands import check_command_exists, execute -from navio_tasks.settings import VENV_SHELL -from navio_tasks.utils import inform - - -def do_tox() -> str: - """ - See if everything works with python 3.8 and upcoming libraries - """ - # If tox fails the build with 3.8 or some future library, that means - # we can't migrate to 3.8 yet, or that we should stay with currently pinned - # libraries. We should fail the overall build. - # - # Because we control our python version we don't have to support cross ver - # compatibility, i.e. we are not supporting 2.7 & 3.x! - if settings.TOX_ACTIVE: - # this happens when testing the build script itself. - return "tox already, not nesting" - command_name = "tox" - check_command_exists(command_name) - - command_text = f"{VENV_SHELL} {command_name}".strip().replace(" ", " ") - inform(command_text) - command = shlex.split(command_text) - execute(*command) - return "tox succeeded" diff --git a/navio_tasks/commands/lib_dodgy.py b/navio_tasks/commands/lib_dodgy.py deleted file mode 100644 index 5dfb891..0000000 --- a/navio_tasks/commands/lib_dodgy.py +++ /dev/null @@ -1,26 +0,0 @@ -""" -Security tool, rarely finds problems, cna't be called from commandline -""" -import os -import sys - -from dodgy import run as dodgy_runner - -from navio_tasks.output import say_and_exit -from navio_tasks.utils import inform - - -def do_dodgy() -> str: - """ - Checks for AWS keys, diffs, pem keys - """ - # Not using the shell command version because it mysteriously failed - # and this seems to work fine. - warnings = dodgy_runner.run_checks(os.getcwd()) - if warnings: - - for message in warnings: - inform(message) - say_and_exit("Dodgy found problems", "dodgy") - sys.exit(-1) - return "dodgy succeeded" diff --git a/navio_tasks/dependency_commands/__init__.py b/navio_tasks/dependency_commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/navio_tasks/dependency_commands/cli_installs.py b/navio_tasks/dependency_commands/cli_installs.py deleted file mode 100644 index 2f819e6..0000000 --- a/navio_tasks/dependency_commands/cli_installs.py +++ /dev/null @@ -1,46 +0,0 @@ -""" -Install dependencies so that build has a chance of succeeding. -""" -import os -import shlex - -from navio_tasks.cli_commands import check_command_exists, execute -from navio_tasks.utils import inform - - -def do_dependency_installs(pipenv: bool, poetry: bool, pip: bool) -> None: - """Catch up with missing deps""" - if pipenv: - check_command_exists("pipenv") - command_text = "pipenv install --dev --skip-lock" - inform(command_text) - command = shlex.split(command_text) - execute(*command) - elif poetry: - check_command_exists("poetry") - command_text = "poetry install" - inform(command_text) - command = shlex.split(command_text) - execute(*command) - elif pip: - # TODO: move code to deprecated section? - # TODO: Check for poetry. - if os.path.exists("Pipfile"): - raise TypeError("Found Pipfile, settings imply we aren't using Pipenv.") - if os.path.exists("requirements.txt"): - command_text = "pip install -r requirements.txt" - inform(command_text) - command = shlex.split(command_text) - execute(*command) - else: - inform("no requirements.txt file yet, can't install dependencies") - - if os.path.exists("requirements-dev.txt"): - command_text = "pip install -r requirements-dev.txt" - inform(command_text) - command = shlex.split(command_text) - execute(*command) - else: - inform("no requirements-dev.txt file yet, can't install dependencies") - else: - inform("VENV not previously activated, won't attempt to catch up on installs") diff --git a/navio_tasks/dependency_commands/cli_jake.py b/navio_tasks/dependency_commands/cli_jake.py deleted file mode 100644 index adfb0bb..0000000 --- a/navio_tasks/dependency_commands/cli_jake.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -Same as safety but managed by a different company. Probably a different -vulnerability database. Can integrate with on prem somatype server if available. - -Only reports -No file changes -Should break build on any issues. -Expect few issues -All issues should be addressable immediately. -""" -import shlex - -from navio_tasks.cli_commands import check_command_exists, execute -from navio_tasks.settings import VENV_SHELL -from navio_tasks.utils import inform - - -def do_jake() -> str: - """ - Check free database for vulnerabilities in active venv. - """ - # TODO: get an API key and start using - # .oss-index-config - command_name = "jake" - check_command_exists(command_name) - - command_text = f"{VENV_SHELL} {command_name} ddt".strip().replace(" ", " ") - inform(command_text) - command = shlex.split(command_text) - execute(*command) - return "jake succeeded" diff --git a/navio_tasks/dependency_commands/cli_liccheck.py b/navio_tasks/dependency_commands/cli_liccheck.py deleted file mode 100644 index a97991a..0000000 --- a/navio_tasks/dependency_commands/cli_liccheck.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -This just makes sure that some human got a chance to say, "nope, not going to use -this because of license issues" -""" - -import os - -from navio_tasks import settings as settings -from navio_tasks.cli_commands import check_command_exists, execute, prepinform_simple -from navio_tasks.utils import inform - - -def do_liccheck() -> str: - """ - Make an explicit decision about license of referenced packages - """ - - check_command_exists("liccheck") - if not os.path.exists(f"{settings.CONFIG_FOLDER}/requirements.txt"): - inform("No requirements.txt file, assuming we have no external deps") - return "Skipping, not requirements.txt" - command = ( - "liccheck " - f"-r {settings.CONFIG_FOLDER}/requirements.txt " - f"-s {settings.CONFIG_FOLDER}/.license_rules " - "-l paranoid" - ) - - command = prepinform_simple(command, no_project=True) - execute(*(command.split(" "))) - return "liccheck succeeded" diff --git a/navio_tasks/dependency_commands/cli_pin_dependencies.py b/navio_tasks/dependency_commands/cli_pin_dependencies.py deleted file mode 100644 index 16606a6..0000000 --- a/navio_tasks/dependency_commands/cli_pin_dependencies.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -Pin deps -""" -import os - -from navio_tasks import settings as settings -from navio_tasks.cli_commands import check_command_exists, execute -from navio_tasks.settings import VENV_SHELL -from navio_tasks.utils import inform - - -def convert_pipenv_to_requirements(pipenv: bool) -> None: - """ - Create requirement*.txt - """ - if not pipenv: - raise TypeError( - "Can't pin dependencies this way, we are only converting " - "pipfile to requirements.txt" - ) - check_command_exists("pipenv_to_requirements") - - execute( - *( - f"{VENV_SHELL} pipenv_to_requirements " - f"--dev-output {settings.CONFIG_FOLDER}/requirements-dev.txt " - f"--output {settings.CONFIG_FOLDER}/requirements.txt".strip().split(" ") - ) - ) - if not os.path.exists(f"{settings.CONFIG_FOLDER}/requirements.txt"): - inform( - "Warning: no requirements.txt found, assuming it is because there are" - "no external dependencies yet" - ) - else: - with open(f"{settings.CONFIG_FOLDER}/requirements.txt", "r+") as file: - lines = file.readlines() - file.seek(0) - for line in lines: - if line.find("-e .") == -1: - file.write(line) - file.truncate() - - with open(f"{settings.CONFIG_FOLDER}/requirements-dev.txt", "r+") as file: - lines = file.readlines() - file.seek(0) - for line in lines: - if line.find("-e .") == -1: - file.write(line) - file.truncate() diff --git a/navio_tasks/dependency_commands/cli_pip.py b/navio_tasks/dependency_commands/cli_pip.py deleted file mode 100644 index 6fba3a5..0000000 --- a/navio_tasks/dependency_commands/cli_pip.py +++ /dev/null @@ -1,84 +0,0 @@ -""" -Register scripts -""" -import os -import shlex -import sys - -from navio_tasks.cli_commands import ( - check_command_exists, - config_pythonpath, - execute, - execute_with_environment, - execute_get_text, -) -from navio_tasks.settings import ( - PIPENV_ACTIVE, - PROJECT_NAME, - VENV_SHELL, - PIP_CHECK_SKIPS, -) -from navio_tasks.utils import inform - - -def do_register_scripts() -> None: - """ - Without this console_scripts in the entrypoints section of setup.py aren't - available - :return: - """ - check_command_exists("pip") - - # This doesn't work, it can't tell if "install -e ." has already run - if dist_is_editable(): - inform("console_scripts already registered") - return - # install in "editable" mode - command_text = f"{VENV_SHELL} pip install -e ." - inform(command_text) - command_text = command_text.strip().replace(" ", " ") - command = shlex.split(command_text) - execute(*command) - - -def dist_is_editable() -> bool: - """Is distribution an editable install?""" - for path_item in sys.path: - egg_link = os.path.join(path_item, PROJECT_NAME + ".egg-link") - if os.path.isfile(egg_link): - return True - return False - - -def do_pip_check() -> str: - """ - Call as normal function - """ - - # TODO - result = execute_get_text( - command=["pip", "check"], ignore_error=True, env=config_pythonpath() - ) - problems = [] - if PIP_CHECK_SKIPS: - print(f"Ignoring pip incompat problems for : {PIP_CHECK_SKIPS}") - for line in result.split("\n"): - if not line.strip(): - continue - for skip in PIP_CHECK_SKIPS: - if skip in line: - pass - else: - problems.append(line) - if problems: - for problem in problems: - print(problem) - print("pip check problems, even after skips") - sys.exit(-1) - - environment = config_pythonpath() - environment["PIPENV_PYUP_API_KEY"] = "" - if PIPENV_ACTIVE: - # ignore 38414 until aws fixes awscli - execute_with_environment("pipenv check --ignore 38414", environment) - return "Pip(env) check run" diff --git a/navio_tasks/dependency_commands/cli_safety.py b/navio_tasks/dependency_commands/cli_safety.py deleted file mode 100644 index 8c508cb..0000000 --- a/navio_tasks/dependency_commands/cli_safety.py +++ /dev/null @@ -1,24 +0,0 @@ -""" -Only reports -No file changes -Should break build on any issues. -Expect few issues -All issues should be addressable immediately. -""" -import subprocess - -from navio_tasks import settings as settings -from navio_tasks.cli_commands import check_command_exists, execute - - -def do_safety() -> str: - """ - Check free database for vulnerabilities in pinned libraries. - """ - requirements_file_name = f"{settings.CONFIG_FOLDER}/requirements_for_safety.txt" - with open(requirements_file_name, "w+") as out: - subprocess.run(["pip", "freeze"], stdout=out, stderr=out, check=True) - check_command_exists("safety") - # ignore 38414 until aws fixes awscli - execute("safety", "check", "--ignore", "38414", "--file", requirements_file_name) - return "Package safety checked" diff --git a/navio_tasks/deprecated_commands/README.md b/navio_tasks/deprecated_commands/README.md deleted file mode 100644 index 10bcd80..0000000 --- a/navio_tasks/deprecated_commands/README.md +++ /dev/null @@ -1,2 +0,0 @@ -All the commands in the folder -- are obsolete and should not be used if possible. diff --git a/navio_tasks/deprecated_commands/__init__.py b/navio_tasks/deprecated_commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/navio_tasks/deprecated_commands/cli_check_manifest.py b/navio_tasks/deprecated_commands/cli_check_manifest.py deleted file mode 100644 index e396194..0000000 --- a/navio_tasks/deprecated_commands/cli_check_manifest.py +++ /dev/null @@ -1,87 +0,0 @@ -""" -This only matters if using setup.py/setup.cfg. -If using poetry + pyproject.toml you don't need setup.py, setup.cfg or MANIFEST.in - -Better than using check-manifest, try to stop using setup.py ------------ -Only reports -Has option to generate MANIFEST.in if it doesn't exist. -Should break build on any issues, but has high false positive rate. -Expect a few issues all the time. -All issues should be addressable immediately. -""" - -import os -import shlex -import subprocess -import sys -from typing import Dict - -from navio_tasks.cli_commands import check_command_exists, config_pythonpath -from navio_tasks.output import say_and_exit -from navio_tasks.pure_reports.cli_pygount import total_loc -from navio_tasks.settings import ( - MAXIMUM_MANIFEST_ERRORS, - PROBLEMS_FOLDER, - SMALL_CODE_BASE_CUTOFF, - VENV_SHELL, -) -from navio_tasks.utils import inform - - -def call_check_manifest_command(output_file_name: str, env: Dict[str, str]) -> None: - """ - To allow for checking in multiple passes - """ - check_command_exists("check-manifest") - - command_text = f"{VENV_SHELL} check-manifest".strip().replace(" ", " ") - - with open(output_file_name, "w") as outfile: - inform(command_text) - command = shlex.split(command_text) - subprocess.call(command, stdout=outfile, env=env) - - -def do_check_manifest() -> str: - """ - Require all files to be explicitly included/excluded from package - """ - if not os.path.exists("setup.py") and not os.path.exists("setup.cfg"): - inform("setup.py doesn't exists, not packaging.") - return "Nope" - env = config_pythonpath() - output_file_name = f"{PROBLEMS_FOLDER}/manifest_errors.txt" - call_check_manifest_command(output_file_name, env) - - with open(output_file_name) as outfile_reader: - text = outfile_reader.read() - - inform(text) - if not os.path.isfile("MANIFEST.in") and "no MANIFEST.in found" in text: - command_text = f"{VENV_SHELL} check-manifest -c".strip().replace(" ", " ") - command = shlex.split(command_text) - subprocess.call(command, env=env) - # inform("Had to create MANIFEST.in, please review and redo") - call_check_manifest_command(output_file_name, env) - - if total_loc() > SMALL_CODE_BASE_CUTOFF: - cutoff = 0 - else: - cutoff = MAXIMUM_MANIFEST_ERRORS - - with open(output_file_name) as file_handle: - num_lines = sum( - 1 - for line in file_handle - if line - and line.strip() != "" - and "lists of files in version control and sdist match" not in line - ) - if num_lines > cutoff: - say_and_exit( - f"Too many lines of manifest problems : {num_lines}, max {cutoff}", - "check-manifest", - ) - sys.exit(-1) - return "manifest check succeeded" diff --git a/navio_tasks/deprecated_commands/cli_pyroma.py b/navio_tasks/deprecated_commands/cli_pyroma.py deleted file mode 100644 index 9c665ac..0000000 --- a/navio_tasks/deprecated_commands/cli_pyroma.py +++ /dev/null @@ -1,32 +0,0 @@ -""" -Check if metadata stuff in setup.py is filled in sensibly -""" -import os - -from navio_tasks.cli_commands import check_command_exists, execute -from navio_tasks.settings import VENV_SHELL -from navio_tasks.utils import inform - - -def do_pyroma() -> str: - """ - Check package goodness (essentially lints setup.py) - """ - if os.path.exists("setup.py") or os.path.exists("setup.cfg"): - return do_pyroma_regardless() - return "Skipped, no setup.py/setup.cfg" - - -def do_pyroma_regardless() -> str: - """ - Check package goodness (essentially lints setup.py) - """ - if not os.path.exists("setup.py") and not os.path.exists("setup.cfg"): - inform("setup.py doesn't exists, not packaging.") - return "Nope" - command = "pyroma" - check_command_exists(command) - command = f"{VENV_SHELL} pyroma --directory --min=8 .".strip().replace(" ", " ") - inform(command) - execute(*(command.split(" "))) - return "pyroma succeeded" diff --git a/navio_tasks/deprecated_commands/cli_setup_py.py b/navio_tasks/deprecated_commands/cli_setup_py.py deleted file mode 100644 index 95773aa..0000000 --- a/navio_tasks/deprecated_commands/cli_setup_py.py +++ /dev/null @@ -1,136 +0,0 @@ -""" -Do the packaging. Anything but an sdist will be nonstop pain and breakage. Some -of the worst code in the entire python ecosystem (setuptools is.) -""" - -import os -import shlex -import shutil -import sys - -import setuptools - -from navio_tasks.cli_commands import ( - check_command_exists, - config_pythonpath, - execute, - execute_get_text, - prepinform_simple, -) -from navio_tasks.output import say_and_exit -from navio_tasks.settings import PROJECT_NAME, PYTHON, VENV_SHELL -from navio_tasks.utils import inform - - -def do_package() -> None: - """ - don't do anything that is potentially really slow or that modifies files. - """ - if not os.path.exists("setup.py") and not os.path.exists("setup.cfg"): - inform("setup.py doesn't exists, not packaging.") - return "Nope" - check_command_exists("twine") - - for folder in ["build", "dist", PROJECT_NAME + ".egg-info"]: - if os.path.exists(folder): - shutil.rmtree(folder) - original_umask = os.umask(0) - try: - try: - os.makedirs(folder, 0o770) - except PermissionError: - execute("cmd", "mkdir", folder) - finally: - os.umask(original_umask) - - # command = f"{PYTHON} setup.py sdist --formats=gztar,zip" - # bdist_wheel - command_text = f"{PYTHON} setup.py sdist --formats=gztar,zip" - command_text = prepinform_simple(command_text, no_project=True) - command = shlex.split(command_text) - result = execute_get_text(command, env=config_pythonpath()).replace("\r", "") - - error_count = 0 - for row in result.split("\n"): - check_row = str(row).lower() - if check_row.startswith("adding") or check_row.startswith("copying"): - # adding a file named error/warning isn't a problem - continue - if "no previously-included files found matching" in check_row: - # excluding a file that already doesn't exist is wonderful! - # why this is a warning boggles the mind. - continue - if "lib2to3" in check_row: - # python 3.9 has deprecated lib2to3, which shows up as a warning which - # causes the build to fail. Seems ignorable as we don - continue - # sometimes to avoid pyc getting out of sync with .py, on - # dev workstations you PYTHONDONTWRITEBYTECODE=1 which just disables - # pyc altogether. Why wheel cares, I don't know. - has_error = any( - value in check_row - for value in ["Errno", "Error", "failed", "error", "warning"] - ) - if has_error and "byte-compiling is disabled" not in check_row: - inform(row) - error_count += 1 - if error_count > 0: - say_and_exit("Package failed", "setup.py") - sys.exit(-1) - - # pylint: disable=broad-except - try: - # Twine check must run after package creation. Supersedes setup.py check - command_text = f"{VENV_SHELL} twine check dist/*".strip().replace(" ", " ") - inform(command_text) - command = shlex.split(command_text) - execute(*command) - except Exception as ex: - inform(ex) - command_text = ( - f"{VENV_SHELL} setup.py " - "sdist " - "--formats=gztar,zip".strip().replace(" ", " ") - ) - command = shlex.split(command_text) - execute(*command) - - def list_files(startpath: str) -> None: - """ - List all files, handy for remote build servers - """ - for root, _, files in os.walk(startpath): - level = root.replace(startpath, "").count(os.sep) - indent = " " * 4 * level - inform("{}{}/".format(indent, os.path.basename(root))) - subindent = " " * 4 * (level + 1) - for file in files: - inform(f"{subindent}{file}") - - inform("skipping twine check until I figure out what is up") - list_files(startpath=".") - return "Ok" - - -def do_project_validation_for_setup_py() -> None: - """ - Verify that all projects/modules are explicitly declared - """ - found = setuptools.find_packages() - # Just care about root - found = [name for name in found if "." not in name and name != "test"] - problems = 0 - if not found: - inform("Found more than no modules at all, did you forget __init__.py?") - problems += 1 - - # this is okay. - # if len(found) > 1: - # inform(f"Found more than one module, found {found}") - # problems += 1 - if PROJECT_NAME not in found: - inform(f"Can't find {PROJECT_NAME}, found {found}") - problems += 1 - if problems > 0: - say_and_exit("Modules not as expected, can't package", "setup.py") - sys.exit(-1) diff --git a/navio_tasks/file_system.py b/navio_tasks/file_system.py deleted file mode 100644 index f88a367..0000000 --- a/navio_tasks/file_system.py +++ /dev/null @@ -1,15 +0,0 @@ -""" -File system related -""" -import os - -from navio_tasks.settings import PROBLEMS_FOLDER, REPORTS_FOLDER - - -def initialize_folders() -> None: - """ - Create folders that are likely to be needed - """ - for folder in [PROBLEMS_FOLDER, REPORTS_FOLDER]: - if not os.path.exists(folder): - os.makedirs(folder) diff --git a/navio_tasks/mutating_commands/README.md b/navio_tasks/mutating_commands/README.md deleted file mode 100644 index fcee702..0000000 --- a/navio_tasks/mutating_commands/README.md +++ /dev/null @@ -1,6 +0,0 @@ -These commands change the source code. - -- On a build server, needing to change code should break the build. -- After changing code, the new code needs to be checked in. -- Mutating should happen before unit tests. -- Black should be the final mutator because only one formatter can "win" diff --git a/navio_tasks/mutating_commands/__init__.py b/navio_tasks/mutating_commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/navio_tasks/mutating_commands/cli_black.py b/navio_tasks/mutating_commands/cli_black.py deleted file mode 100644 index a867d9a..0000000 --- a/navio_tasks/mutating_commands/cli_black.py +++ /dev/null @@ -1,64 +0,0 @@ -""" -Modifies code. -- Modified code will have to be checked in. - -If code needs to be modified and we are on a build server, maybe break build. -""" - -import shlex -import sys -from typing import Dict - -from navio_tasks.cli_commands import ( - check_command_exists, - config_pythonpath, - execute, - execute_get_text, -) -from navio_tasks.settings import IS_GITLAB, PROJECT_NAME, VENV_SHELL -from navio_tasks.system_info import is_git_repo, is_windows -from navio_tasks.utils import inform - - -def do_formatting(check: str, state: Dict[str, bool]) -> None: - """ - Format with black - this will not modify code if check is --check - """ - - # check & format should be merged & use an arg - # global FORMATTING_CHECK_DONE - if state["check_already_done"]: - inform("Formatting check says black will not reformat, so no need to repeat") - return - if sys.version_info < (3, 6): - inform("Black doesn't work on python 2") - return - check_command_exists("black") - - command_text = f"{VENV_SHELL} black {PROJECT_NAME} {check}".strip().replace( - " ", " " - ) - inform(command_text) - command = shlex.split(command_text) - if check: - _ = execute(*command) - state["check_already_done"] = True - return - result = execute_get_text(command, env=config_pythonpath()) - assert result - changed = [] - for line in result.split("\n"): - if "reformatted " in line: - file = line[len("reformatted ") :].strip() - changed.append(file) - if not IS_GITLAB: - if not is_git_repo("."): - # don't need to git add anything because this isn't a git repo - return - for change in changed: - if is_windows(): - change = change.replace("\\", "/") - command_text = f"git add {change}" - inform(command_text) - command = shlex.split(command_text) - execute(*command) diff --git a/navio_tasks/mutating_commands/cli_isort.py b/navio_tasks/mutating_commands/cli_isort.py deleted file mode 100644 index fd642d0..0000000 --- a/navio_tasks/mutating_commands/cli_isort.py +++ /dev/null @@ -1,18 +0,0 @@ -""" -Reorg imports. Constant 4 way battle between black, isort, pycharm and mscode -""" -from navio_tasks.cli_commands import check_command_exists, execute, prepinform_simple - - -def do_isort() -> str: - """Sort the imports to discover import order bugs and prevent import order bugs""" - # This must run before black. black doesn't change import order but it wins - # any arguments about formatting. - # isort MUST be installed with pipx! It is not compatible with pylint in the same - # venv. Maybe someday, but it just isn't worth the effort. - - check_command_exists("isort") - command = "isort --profile black" - command = prepinform_simple(command) - execute(*(command.split(" "))) - return "isort succeeded" diff --git a/navio_tasks/mutating_commands/cli_jiggle_version.py b/navio_tasks/mutating_commands/cli_jiggle_version.py deleted file mode 100644 index e405738..0000000 --- a/navio_tasks/mutating_commands/cli_jiggle_version.py +++ /dev/null @@ -1,43 +0,0 @@ -""" -Increase version number, but only the last number in a semantic version triplet -""" -import shlex - -from git import InvalidGitRepositoryError, Repo - -from navio_tasks.cli_commands import check_command_exists, execute -from navio_tasks.settings import PROJECT_NAME -from navio_tasks.utils import inform - - -def do_jiggle_version( - is_interactive: bool, - target_branch: str = "", - increase_version_on_all_branches: bool = False, -) -> str: - """ - Increase version number, but only the last number in a semantic version triplet - """ - if not is_interactive: - inform( - "Not an interactive session, skipping jiggle_version, which changes files." - ) - return "Skipping" - # rorepo is a Repo instance pointing to the git-python repository. - # For all you know, the first argument to Repo is a path to the repository - # you want to work with - try: - repo = Repo(".") - active_branch = str(repo.active_branch) - except InvalidGitRepositoryError: - inform("Can't detect what branch we are on. Is this a git repo?") - active_branch = "don't know what branch we are on" - - if active_branch == target_branch or increase_version_on_all_branches: - check_command_exists("jiggle_version") - command = f"jiggle_version here --module={PROJECT_NAME}" - parts = shlex.split(command) - execute(*parts) - else: - inform("Not master branch, not incrementing version") - return "ok" diff --git a/navio_tasks/mutating_commands/cli_npm_prettier.py b/navio_tasks/mutating_commands/cli_npm_prettier.py deleted file mode 100644 index fd66045..0000000 --- a/navio_tasks/mutating_commands/cli_npm_prettier.py +++ /dev/null @@ -1,3 +0,0 @@ -""" -Reformat with prettier, which is a node tool. -""" diff --git a/navio_tasks/mutating_commands/cli_precommit.py b/navio_tasks/mutating_commands/cli_precommit.py deleted file mode 100644 index 44617ba..0000000 --- a/navio_tasks/mutating_commands/cli_precommit.py +++ /dev/null @@ -1,60 +0,0 @@ -""" -Precommit is a generic checker/build tool. It can contain a few or lots of -tools, many of them not python specific. -""" -import shlex -import sys - -from navio_tasks.cli_commands import ( - check_command_exists, - config_pythonpath, - execute, - execute_get_text, -) -from navio_tasks.output import say_and_exit -from navio_tasks.settings import VENV_SHELL -from navio_tasks.system_info import is_git_repo -from navio_tasks.utils import inform - - -def do_precommit(is_interactive: bool) -> None: - """ - Build time execution of pre-commit checks. Modifies code so run before linter. - """ - if not is_interactive: - inform("Not running precommit because it changes files") - return - check_command_exists("pre-commit") - - if is_git_repo("."): - # don't try to install because it isn't a git repo - command_text = f"{VENV_SHELL} pre-commit install".strip().replace(" ", " ") - inform(command_text) - command = shlex.split(command_text) - execute(*command) - - command_text = f"{VENV_SHELL} pre-commit run --all-files".strip().replace(" ", " ") - inform(command_text) - command = shlex.split(command_text) - result = execute_get_text(command, ignore_error=True, env=config_pythonpath()) - assert result - changed = [] - for line in result.split("\n"): - if "changed " in line: - file = line[len("reformatted ") :].strip() - changed.append(file) - if "FAILED" in result: - inform(result) - say_and_exit("Pre-commit Failed", "pre-commit") - sys.exit(-1) - - if is_interactive: - if not is_git_repo("."): - # don't need to git add anything because this isn't a git repo - return - for change in changed: - command_text = f"git add {change}" - inform(command_text) - # this breaks on windows! - # command = shlex.split(command_text) - execute(*command_text.split()) diff --git a/navio_tasks/mutating_commands/cli_pyupgrade.py b/navio_tasks/mutating_commands/cli_pyupgrade.py deleted file mode 100644 index 8a8a21b..0000000 --- a/navio_tasks/mutating_commands/cli_pyupgrade.py +++ /dev/null @@ -1,32 +0,0 @@ -""" -Reformat code to use py3 patterns when possible -""" - -import glob - -from navio_tasks.cli_commands import check_command_exists, execute -from navio_tasks.settings import PROJECT_NAME, VENV_SHELL -from navio_tasks.utils import inform - - -def do_pyupgrade(is_interactive: bool, minimum_python: str) -> str: - """Update syntax to most recent variety.""" - if not is_interactive: - inform("Not an interactive session, skipping pyupgrade wihch changes files.") - return "Skipping" - command = "pyupgrade" - check_command_exists(command) - - all_files = " ".join( - f for f in glob.glob(f"{PROJECT_NAME}/**/*.py", recursive=True) - ) - - # as of 2021, still doesn't appear to support recursive globs natively. - command = ( - f"{VENV_SHELL} pyupgrade " - f"--{minimum_python}-plus " - f"--exit-zero-even-if-changed {all_files}".strip().replace(" ", " ") - ) - inform(command) - execute(*(command.split(" "))) - return f"{command} succeeded" diff --git a/navio_tasks/network.py b/navio_tasks/network.py deleted file mode 100644 index a97ea33..0000000 --- a/navio_tasks/network.py +++ /dev/null @@ -1,34 +0,0 @@ -""" -Builds fail when they're not on VPN or can't reach remote servers -""" -import ifaddr -import requests - - -def check_public_ip(ipify: str = "https://api64.ipify.org/") -> str: - """ - Try to get the elastic IP for this machine - """ - # BUG: When this fails, it doesn't fail fast. - - # pylint: disable=bare-except,broad-except - # noinspection PyBroadException - try: - # https://api.ipify.org # fails on VPN. - # pylint: disable=invalid-name - ip = requests.get(ipify).text - return ip - except BaseException: # noqa - return "" - - -def is_known_network(prefix: str) -> bool: - """Are we on a known network""" - - adapters = ifaddr.get_adapters() - for adapter in adapters: - # pylint: disable=invalid-name - for ip in adapter.ips: - if str(ip.ip).startswith(prefix): - return True - return False diff --git a/navio_tasks/non_breaking_commands/README.md b/navio_tasks/non_breaking_commands/README.md deleted file mode 100644 index b278a37..0000000 --- a/navio_tasks/non_breaking_commands/README.md +++ /dev/null @@ -1,6 +0,0 @@ -These commands create some problem list, but it doesn't make sense to fix the immediately - -Counter example- syntax errors must be fixed immediately or the app can't run at all. - -Spelling errors, dead code, duplicate code, "complex" code doesn't necessarily -cause an immediately app failure, but might be worth working periodically. diff --git a/navio_tasks/non_breaking_commands/__init__.py b/navio_tasks/non_breaking_commands/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/navio_tasks/non_breaking_commands/cli_mccabe.py b/navio_tasks/non_breaking_commands/cli_mccabe.py deleted file mode 100644 index 4193501..0000000 --- a/navio_tasks/non_breaking_commands/cli_mccabe.py +++ /dev/null @@ -1,27 +0,0 @@ -""" -Complexity reports -""" - -import shlex - -from navio_tasks import settings as settings -from navio_tasks.cli_commands import check_command_exists, execute, prepinform_simple -from navio_tasks.settings import COMPLEXITY_CUT_OFF - - -def do_mccabe() -> str: - """ - Complexity Checker - """ - - check_command_exists("flake8") # yes, flake8, this is a plug in. - # mccabe doesn't have a direct way to run it - - command_text = ( - f"flake8 --max-complexity {COMPLEXITY_CUT_OFF} " - f"--config {settings.CONFIG_FOLDER}/.flake8" - ) - command_text = prepinform_simple(command_text) - command = shlex.split(command_text) - execute(*command) - return "mccabe succeeded" diff --git a/navio_tasks/non_breaking_commands/cli_scspell.py b/navio_tasks/non_breaking_commands/cli_scspell.py deleted file mode 100644 index 2dc2cbe..0000000 --- a/navio_tasks/non_breaking_commands/cli_scspell.py +++ /dev/null @@ -1,61 +0,0 @@ -""" -Spell check. Most work for something that doesn't change application behavior. -""" - -import os -import shlex - -from navio_tasks import settings as settings -from navio_tasks.cli_commands import config_pythonpath, execute_get_text -from navio_tasks.settings import PROBLEMS_FOLDER, PROJECT_NAME, VENV_SHELL -from navio_tasks.utils import inform - - -def do_spell_check() -> None: - """ - Check spelling using scspell (pip install scspell3k) - """ - # tool can't recurse through files - # tool returns a hard to parse format - # tool has a really cumbersome way of adding values to dictionary - walk_dir = PROJECT_NAME - files_to_check = [] - inform(walk_dir) - for root, _, files in os.walk(walk_dir): - if "pycache" in root: - continue - for file in files: - inform(root + "/" + file) - if file.endswith(".py"): - files_to_check.append(root + "/" + file) - - files_to_check_string = " ".join(files_to_check) - command_text = ( - f"{VENV_SHELL} scspell --report-only " - "--override-dictionary=spelling_dictionary.txt " - f"--use-builtin-base-dict {files_to_check_string}".strip().replace(" ", " ") - ) - inform(command_text) - command = shlex.split(command_text) - result = execute_get_text(command, ignore_error=True, env=config_pythonpath()) - with open(f"{PROBLEMS_FOLDER}/spelling.txt", "w+") as outfile: - outfile.write( - "\n".join( - [ - row - for row in result.replace("\r", "").split("\n") - if "dictionary" in row - ] - ) - ) - - def read_file() -> None: - with open(f"{settings.CONFIG_FOLDER}/spelling_dictionary.txt") as reading_file: - reading_result = reading_file.read() - inform( - "\n".join( - [row for row in reading_result.split("\n") if "dictionary" in row] - ) - ) - - read_file() diff --git a/navio_tasks/non_breaking_commands/cli_sonar.py b/navio_tasks/non_breaking_commands/cli_sonar.py deleted file mode 100644 index 349375e..0000000 --- a/navio_tasks/non_breaking_commands/cli_sonar.py +++ /dev/null @@ -1,78 +0,0 @@ -""" -Sonar complains about -- yaml formatting -- code complexity -- commented code -- (dead code?) -- duplicate code - -Not all of those are equally actionable -""" - -import json -import os -import sys - -import requests - -from navio_tasks.cli_commands import execute -from navio_tasks.output import say_and_exit -from navio_tasks.settings import PROJECT_NAME, VENV_SHELL -from navio_tasks.system_info import is_windows -from navio_tasks.utils import inform - - -def do_sonar() -> str: - """ - Upload code to sonar for review - """ - sonar_key = os.environ["SONAR_KEY"] - if is_windows(): - command_name = "sonar-scanner.bat" - else: - command_name = "sonar-scanner" - command = ( - f"{VENV_SHELL} {command_name} " - f"-Dsonar.login={sonar_key} " - "-Dproject.settings=" - "sonar-project.properties".strip().replace(" ", " ").split(" ") - ) - inform(command) - execute(*command) - url = ( - "https://code-quality-test.loc.gov/api/issues/search?" - f"componentKeys=public_record_{PROJECT_NAME}&resolved=false" - ) - - session = requests.Session() - session.auth = (sonar_key, "") - - response = session.get(url) - - errors_file = "sonar.json" - with open(errors_file, "w+") as file_handle: - inform(response.text) - text = response.text - if not text: - say_and_exit("Failed to check for sonar", "sonar") - sys.exit(-1) - file_handle.write(text) - - try: - with open(errors_file) as file_handle: - data = json.load(file_handle) - - if data["issues"]: - for result in data["issues"]: - inform( - "{} : {} line {}-{}".format( - result["component"], - result["message"], - result["textRange"]["startLine"], - result["textRange"]["endLine"], - ) - ) - say_and_exit("sonar has issues with this code", "sonar") - except json.JSONDecodeError: - pass - return "Sonar done" diff --git a/navio_tasks/non_breaking_commands/cli_vulture.py b/navio_tasks/non_breaking_commands/cli_vulture.py deleted file mode 100644 index 14fca87..0000000 --- a/navio_tasks/non_breaking_commands/cli_vulture.py +++ /dev/null @@ -1,51 +0,0 @@ -""" -Dead Code -""" -import shlex -import subprocess -import sys - -from navio_tasks.cli_commands import check_command_exists, config_pythonpath -from navio_tasks.output import say_and_exit -from navio_tasks.pure_reports.cli_pygount import total_loc -from navio_tasks.settings import ( - MAXIMUM_DEAD_CODE, - PROBLEMS_FOLDER, - PROJECT_NAME, - SMALL_CODE_BASE_CUTOFF, - VENV_SHELL, -) -from navio_tasks.utils import inform - - -def do_vulture() -> str: - """ - This also finds code you are working on today! - """ - - check_command_exists("vulture") - - # TODO: check if whitelist.py exists? - command_text = f"{VENV_SHELL} vulture {PROJECT_NAME} whitelist.py" - command_text = command_text.strip().replace(" ", " ") - inform(command_text) - command = shlex.split(command_text) - - output_file_name = f"{PROBLEMS_FOLDER}/dead_code.txt" - with open(output_file_name, "w") as outfile: - env = config_pythonpath() - subprocess.call(command, stdout=outfile, env=env) - - if total_loc() > SMALL_CODE_BASE_CUTOFF: - cutoff = MAXIMUM_DEAD_CODE - else: - cutoff = 0 - - with open(output_file_name) as file_handle: - num_lines = sum(1 for line in file_handle if line) - if num_lines > cutoff: - say_and_exit( - f"Too many lines of dead code : {num_lines}, max {cutoff}", "vulture" - ) - sys.exit(-1) - return "dead-code (vulture) succeeded" diff --git a/navio_tasks/non_py_commands/__init__.py b/navio_tasks/non_py_commands/__init__.py deleted file mode 100644 index e95c577..0000000 --- a/navio_tasks/non_py_commands/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -""" -Commands that related to packaging your code. -If you are deploying with just copy, you don't need any packaging. -""" diff --git a/navio_tasks/non_py_commands/cli_openapi.py b/navio_tasks/non_py_commands/cli_openapi.py deleted file mode 100644 index e6495b2..0000000 --- a/navio_tasks/non_py_commands/cli_openapi.py +++ /dev/null @@ -1,50 +0,0 @@ -""" -Does swagger/openapi file parse -""" - -import os -import shlex -import sys - -from navio_tasks.cli_commands import config_pythonpath, execute, execute_get_text -from navio_tasks.output import say_and_exit -from navio_tasks.settings import IS_GITLAB, IS_JENKINS, PROJECT_NAME, VENV_SHELL -from navio_tasks.utils import inform - - -def do_openapi_check() -> None: - """ - Does swagger/openapi file parse - """ - if not os.path.exists(f"{PROJECT_NAME}/api.yaml"): - inform("No api.yaml file, assuming this is not a microservice") - # TODO: should be able to check all y?ml files and look at header. - return - - command_text = ( - f"{VENV_SHELL} " - "openapi-spec-validator" - f" {PROJECT_NAME}/api.yaml".strip().replace(" ", " ") - ) - inform(command_text) - command = shlex.split(command_text) - execute(*command) - - if IS_JENKINS or IS_GITLAB: - inform("Jenkins/Gitlab and apistar don't work together, skipping") - return - - command_text = ( - f"{VENV_SHELL} apistar validate " - f"--path {PROJECT_NAME}/api.yaml " - "--format openapi " - "--encoding yaml".strip().replace(" ", " ") - ) - inform(command_text) - # subprocess.check_call(command.split(" "), shell=False) - command = shlex.split(command_text) - result = execute_get_text(command, ignore_error=True, env=config_pythonpath()) - if "OK" not in result and "2713" not in result and "✓" not in result: - inform(result) - say_and_exit("apistar didn't like this", "apistar") - sys.exit(-1) diff --git a/navio_tasks/non_py_commands/cli_yamllint.py b/navio_tasks/non_py_commands/cli_yamllint.py deleted file mode 100644 index e2e902c..0000000 --- a/navio_tasks/non_py_commands/cli_yamllint.py +++ /dev/null @@ -1,19 +0,0 @@ -""" -Check yaml, but doesn't reformat it -""" -from navio_tasks.cli_commands import check_command_exists, execute -from navio_tasks.settings import PROJECT_NAME, VENV_SHELL -from navio_tasks.utils import inform - - -def do_yamllint() -> str: - """ - Check yaml files for problems - """ - command = "yamllint" - check_command_exists(command) - - command = f"{VENV_SHELL} yamllint {PROJECT_NAME}".strip().replace(" ", " ") - inform(command) - execute(*(command.split(" "))) - return "yamllint succeeded" diff --git a/navio_tasks/output.py b/navio_tasks/output.py deleted file mode 100644 index dac170d..0000000 --- a/navio_tasks/output.py +++ /dev/null @@ -1,31 +0,0 @@ -""" -Console output related -""" -import subprocess -import sys - -from navio_tasks import settings as settings -from navio_tasks.cli_commands import check_command_exists -from navio_tasks.system_info import check_is_aws -from navio_tasks.utils import inform - - -def say_and_exit(message: str, source: str) -> None: - """ - Audibly notify the developer that the build is - done so that long builds wouldn't cause an attention problem - """ - inform(f"{source}:{message}") - if ( - settings.SPEAK_WHEN_BUILD_FAILS - and settings.IS_INTERACTIVE - and not check_is_aws() - ): - # TODO: check a profile option or something. - if check_command_exists("say", throw_on_missing=False, exit_on_missing=False): - subprocess.call(["say", message]) - elif check_command_exists( - "wsay.exe", throw_on_missing=False, exit_on_missing=False - ): - subprocess.call(["wsay", message]) - sys.exit(-1) diff --git a/navio_tasks/packaging_commands/README.md b/navio_tasks/packaging_commands/README.md deleted file mode 100644 index 77bc59e..0000000 --- a/navio_tasks/packaging_commands/README.md +++ /dev/null @@ -1,10 +0,0 @@ -If a packaging strategy is being used - -- Problems should fail a build if the app can't be packaged. - -Even if no packaging is being used - -- Dependencies need to be in place for a build to pass -- Dependencies should be pinned tight enough to get repeatable builds -- Not so tight that you can't get security fixes and fixes necessary to interact with -a changing world. diff --git a/navio_tasks/packaging_commands/__init__.py b/navio_tasks/packaging_commands/__init__.py deleted file mode 100644 index e95c577..0000000 --- a/navio_tasks/packaging_commands/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -""" -Commands that related to packaging your code. -If you are deploying with just copy, you don't need any packaging. -""" diff --git a/navio_tasks/packaging_commands/cli_poetry_package.py b/navio_tasks/packaging_commands/cli_poetry_package.py deleted file mode 100644 index 8879769..0000000 --- a/navio_tasks/packaging_commands/cli_poetry_package.py +++ /dev/null @@ -1,3 +0,0 @@ -""" -Run `poetry build` -""" diff --git a/navio_tasks/packaging_commands/cli_twine.py b/navio_tasks/packaging_commands/cli_twine.py deleted file mode 100644 index 62fdbc4..0000000 --- a/navio_tasks/packaging_commands/cli_twine.py +++ /dev/null @@ -1,44 +0,0 @@ -""" -Upload to pypi. Pypi is public, don't do that unless you mean to. -""" -import os - -from navio_tasks.cli_commands import check_command_exists, execute - - -def do_upload_package() -> None: - """ - Send to private package repo - """ - # devpi use http://localhost:3141 - # login with root... - # devpi login root --password= - # get indexes - # devpi use -l - # make an index - # devpi index -c dev bases=root/pypi - # devpi use root/dev - - # Must register (may go away with newer version of devpi), must be 1 file! - # twine register --config-file .pypirc -r devpi-root -u root - # -p PASSWORD dist/search_service-0.1.0.zip - # can be all files! - # twine upload --config-file .pypirc -r devpi-root -u root -p PASSWORD dist/* - - # which is installable using... - # pip install search-service --index-url=http://localhost:3141/root/dev/ - - check_command_exists("devpi") - password = os.environ["DEVPI_PASSWORD"] - any_zip = [file for file in os.listdir("dist") if file.endswith(".zip")][0] - register_command = ( - "twine register --config-file .pypirc -r devpi-root -u root" - f" -p {password} dist/{any_zip}" - ) - upload_command = ( - "twine upload --config-file .pypirc -r devpi-root " - f"-u root -p {password} dist/*" - ) - - execute(*(register_command.strip().split(" "))) - execute(*(upload_command.strip().split(" "))) diff --git a/navio_tasks/pure_reports/README.md b/navio_tasks/pure_reports/README.md deleted file mode 100644 index d7dead1..0000000 --- a/navio_tasks/pure_reports/README.md +++ /dev/null @@ -1,8 +0,0 @@ -These commands create some sort of report - -- Generally can't fail a build -- Doesn't involve a TODO list of problems to work -- Might be informational -- Not a lot of value to run every build if no one looks at them. - -e.g. count line counts, generating change log, docs, authors file diff --git a/navio_tasks/pure_reports/__init__.py b/navio_tasks/pure_reports/__init__.py deleted file mode 100644 index e95c577..0000000 --- a/navio_tasks/pure_reports/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -""" -Commands that related to packaging your code. -If you are deploying with just copy, you don't need any packaging. -""" diff --git a/navio_tasks/pure_reports/cli_gitchangelog.py b/navio_tasks/pure_reports/cli_gitchangelog.py deleted file mode 100644 index f74b6db..0000000 --- a/navio_tasks/pure_reports/cli_gitchangelog.py +++ /dev/null @@ -1,28 +0,0 @@ -""" -Extract commit comments from git to a report. Makes for a lousy CHANGELOG.md -""" -import shlex - -from navio_tasks.cli_commands import ( - check_command_exists, - config_pythonpath, - execute_get_text, -) -from navio_tasks.settings import VENV_SHELL -from navio_tasks.utils import inform - - -def do_gitchangelog() -> None: - """ - Extract commit comments from git to a report. Makes for a lousy CHANGELOG.md - """ - # TODO: this app has lots of features for cleaning up comments - command_name = "gitchangelog" - check_command_exists(command_name) - - command_text = f"{VENV_SHELL} {command_name}".strip().replace(" ", " ") - inform(command_text) - command = shlex.split(command_text) - with open("ChangeLog", "w+") as change_log: - result = execute_get_text(command, env=config_pythonpath()).replace("\r", "") - change_log.write(result) diff --git a/navio_tasks/pure_reports/cli_pygount.py b/navio_tasks/pure_reports/cli_pygount.py deleted file mode 100644 index 695af10..0000000 --- a/navio_tasks/pure_reports/cli_pygount.py +++ /dev/null @@ -1,69 +0,0 @@ -""" -Lines fo code counting -""" -import os -import shlex -import subprocess - -from navio_tasks import settings as settings -from navio_tasks.cli_commands import check_command_exists, prepinform_simple -from navio_tasks.output import say_and_exit -from navio_tasks.settings import REPORTS_FOLDER -from navio_tasks.utils import inform - - -def total_loc() -> int: - """ - Get Lines of Code for app - """ - if not os.path.exists(f"{settings.CONFIG_FOLDER}/.build_state"): - os.makedirs(f"{settings.CONFIG_FOLDER}/.build_state") - # pylint: disable=bare-except - try: - with open( - f"{settings.CONFIG_FOLDER}/.build_state/pygount_total_loc.txt" - ) as file_handle: - total_loc_value = file_handle.read() - except: # noqa: B001 - do_count_lines_of_code() - with open( - f"{settings.CONFIG_FOLDER}/.build_state/pygount_total_loc.txt" - ) as file_handle: - total_loc_value = file_handle.read() - - return int(total_loc_value) - - -def do_count_lines_of_code() -> None: - """ - Scale failure cut offs based on Lines of Code - """ - command_name = "pygount" - check_command_exists(command_name) - command_text = prepinform_simple(command_name) - - # keep out of src tree, causes extraneous change detections - if not os.path.exists(f"{REPORTS_FOLDER}"): - os.makedirs(f"{REPORTS_FOLDER}") - output_file_name = f"{REPORTS_FOLDER}/line_counts.txt" - command = shlex.split(command_text) - with open(output_file_name, "w") as outfile: - subprocess.call(command, stdout=outfile) - - with open(output_file_name) as file_handle: - lines = sum(int(line.split("\t")[0]) for line in file_handle if line != "\n") - - total_loc_local = lines - if not os.path.exists(f"{settings.CONFIG_FOLDER}/.build_state"): - os.makedirs(f"{settings.CONFIG_FOLDER}/.build_state") - with open( - f"{settings.CONFIG_FOLDER}/.build_state/pygount_total_loc.txt", "w+" - ) as state_file: - state_file.write(str(total_loc_local)) - - inform(f"Lines of code: {total_loc_local}") - if total_loc_local == 0: - say_and_exit( - "No code found to build or package. Maybe the PROJECT_NAME is wrong?", - "lines of code", - ) diff --git a/navio_tasks/pure_reports/cli_sphinx.py b/navio_tasks/pure_reports/cli_sphinx.py deleted file mode 100644 index 0313ac0..0000000 --- a/navio_tasks/pure_reports/cli_sphinx.py +++ /dev/null @@ -1,23 +0,0 @@ -""" -Generate docs based on rst. -""" -from navio_tasks.cli_commands import ( - check_command_exists, - config_pythonpath, - execute_with_environment, -) -from navio_tasks.settings import VENV_SHELL -from navio_tasks.utils import inform - - -def do_docs() -> str: - """ - Generate docs based on rst. - """ - check_command_exists("make") - - my_env = config_pythonpath() - command = f"{VENV_SHELL} make html".strip().replace(" ", " ") - inform(command) - execute_with_environment(command, env=my_env) - return "Docs generated" diff --git a/navio_tasks/settings.py b/navio_tasks/settings.py deleted file mode 100644 index 91fa7ee..0000000 --- a/navio_tasks/settings.py +++ /dev/null @@ -1,102 +0,0 @@ -""" -Settings loaded from pynt.ini - -Maybe move to pyproject.toml? -""" -import configparser -import os -import platform - -from navio_tasks.network import check_public_ip, is_known_network - -CONFIG_FOLDER = ".config" - - -def load_config() -> configparser.SectionProxy: - """ - Load config - """ - config = configparser.ConfigParser() - config.read(f"{CONFIG_FOLDER}/.pynt") - return config["DEFAULT"] - - -SECTION = load_config() -PROJECT_NAME = SECTION["PROJECT_NAME"] - -SRC = SECTION["SRC"] -PROBLEMS_FOLDER = SECTION["PROBLEMS_FOLDER"] -REPORTS_FOLDER = SECTION["REPORTS_FOLDER"] -IS_SHELL_SCRIPT_LIKE = SECTION["IS_SHELL_SCRIPT_LIKE"].lower() in ["true", "1"] -COMPLEXITY_CUT_OFF = SECTION["COMPLEXITY_CUT_OFF"] - -MINIMUM_TEST_COVERAGE = int(SECTION["MINIMUM_TEST_COVERAGE"]) -SMALL_CODE_BASE_CUTOFF = int(SECTION["SMALL_CODE_BASE_CUTOFF"]) -MAXIMUM_LINT = int(SECTION["MAXIMUM_LINT"]) -MAXIMUM_MYPY = int(SECTION["MAXIMUM_MYPY"]) -MAXIMUM_DEAD_CODE = int(SECTION["MAXIMUM_DEAD_CODE"]) -MAXIMUM_MANIFEST_ERRORS = int(SECTION["MAXIMUM_MANIFEST_ERRORS"]) - -VENV_SHELL = SECTION["VENV_SHELL"] - - -PACKAGE_WITH = SECTION["PACKAGE_WITH"] -if PACKAGE_WITH not in ["poetry", "setup.py", "None", "none"]: - raise TypeError("PACKAGE_WITH must be poetry, setup.py or None") -if PACKAGE_WITH in ["None", "none"]: - PACKAGE_WITH = "" - -# pylint: disable=simplifiable-if-expression -# uh... need mechanism to show preference for no venv, poetry or pipenv. -# WANT_TO_USE_PIPENV = True if VENV_SHELL else False -PIPENV_ACTIVE = "PIPENV_ACTIVE" in os.environ and os.environ["PIPENV_ACTIVE"] == "1" -POETRY_ACTIVE = "POETRY_ACTIVE" in os.environ and os.environ["POETRY_ACTIVE"] == "1" -PIP_ACTIVE = "VIRTUAL_ENV" in os.environ and not PIPENV_ACTIVE and not POETRY_ACTIVE -TOX_ACTIVE = "TOX_PACKAGE" in os.environ -if PIPENV_ACTIVE: - INSTALL_WITH = "pipenv" -elif POETRY_ACTIVE: - INSTALL_WITH = "poetry" -elif PIP_ACTIVE or TOX_ACTIVE: - INSTALL_WITH = "pip" -else: - for key, value in os.environ.items(): - print(key, value) - raise TypeError( - "neither pipenv, poetry, nor pip virtual env active. " - "Do we really want to use the system python?" - ) - - -if PIPENV_ACTIVE or POETRY_ACTIVE: - # activating each run is very, very slow. - VENV_SHELL = "" - -PYTHON = "python" -IS_DJANGO = False -IS_GITLAB = "GITLAB_CI" in os.environ -IS_WINDOWS = platform.system() == "Windows" -IS_ALPINE_DOCKER = os.path.exists("/etc/alpine-release") -IS_JENKINS = "FROM_JENKINS" in os.environ and os.environ["FROM_JENKINS"] == "TRUE" - -CURRENT_HASH = None - -VENDOR_LIBS = ":" - -# so that formatting doesn't run after check done once -FORMATTING_CHECK_DONE = False - -# network call -PUBLIC_IP = check_public_ip() -KNOWN_IP_PREFIX = SECTION["KNOWN_IP_PREFIX"] -RUN_ALL_TESTS_REGARDLESS_TO_NETWORK = ( - SECTION["RUN_ALL_TESTS_REGARDLESS_TO_NETWORK"] == "True" -) -IS_INTERNAL_NETWORK = is_known_network(KNOWN_IP_PREFIX) or PUBLIC_IP.startswith( - KNOWN_IP_PREFIX -) -IS_INTERACTIVE = not (IS_GITLAB or IS_JENKINS) - -SPEAK_WHEN_BUILD_FAILS = SECTION["SPEAK_WHEN_BUILD_FAILS"] == "True" - -PIP_CHECK_SKIPS = [_.strip() for _ in SECTION["PIP_CHECK_SKIPS"].split(",")] diff --git a/navio_tasks/system_info.py b/navio_tasks/system_info.py deleted file mode 100644 index de1a4b4..0000000 --- a/navio_tasks/system_info.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -Infering what machine we are on. -""" -import os -import platform -import re -import socket - -import git -import psutil - -from navio_tasks.utils import inform - - -def is_git_repo(path: str) -> bool: - """ - Are we in a git repo if not, several tools don't make sense to run - https://stackoverflow.com/a/39956572/33264 - """ - try: - _ = git.Repo(path).git_dir - return True - except git.exc.InvalidGitRepositoryError: - return False - - -def is_windows() -> bool: - """Guess if windows""" - platform_string = platform.system() - return os.name == "nt" or platform_string == "Windows" or "_NT" in platform_string - - -def is_powershell() -> bool: - """ - Check if parent process or other ancestor process is powershell - """ - # ref https://stackoverflow.com/a/55598796/33264 - # Get the parent process name. - - try: - process_name = psutil.Process(os.getppid()).name() - grand_process_name = psutil.Process(os.getppid()).parent().name() - # See if it is Windows PowerShell (powershell.exe) or PowerShell Core - # (pwsh[.exe]): - is_that_shell = bool(re.fullmatch("pwsh|pwsh.exe|powershell.exe", process_name)) - if not is_that_shell: - is_that_shell = bool( - re.fullmatch("pwsh|pwsh.exe|powershell.exe", grand_process_name) - ) - except psutil.NoSuchProcess: - inform("Can't tell if this is powershell, assuming not.") - is_that_shell = False - return is_that_shell - - -def check_is_aws() -> bool: - """ - Look at domain name to see if this is an ec2 machine - """ - # HACK: environment variable checking is much, much faster & reliable. - name = socket.getfqdn() - return "ip-" in name and ".ec2.internal" in name diff --git a/navio_tasks/utils.py b/navio_tasks/utils.py deleted file mode 100644 index 273959c..0000000 --- a/navio_tasks/utils.py +++ /dev/null @@ -1,58 +0,0 @@ -""" -Code from pynt until I can phase it out. -""" -import contextlib -import functools -import os -import sys -from subprocess import CalledProcessError, check_call -from typing import Any, Iterable - -__license__ = "MIT License" -__contact__ = "http://rags.github.com/pynt-contrib/" - -# pylint: disable=redefined-builtin -inform = functools.partial(print, flush=True) # no qa - - -@contextlib.contextmanager -def safe_cd(path: str) -> Any: - """ - Changes to a directory, yields, and changes back. - Additionally any error will also change the directory back. - - Usage: - # >>> with safe_cd('some/repo'): - # ... execute('git status') - """ - starting_directory = os.getcwd() - try: - os.chdir(path) - yield - finally: - os.chdir(starting_directory) - - -def execute(script: str, *args: Iterable[str]) -> int: - """ - Executes a command through the shell. Spaces should breakup the args. - Usage: execute('grep', 'TODO', '*') - """ - - popen_args = [script] + list(args) - # pylint: disable=broad-except - try: - return check_call(popen_args, shell=False) # noqa - except CalledProcessError as ex: - inform(ex) - sys.exit(ex.returncode) - except Exception as ex: - inform(f"Error: {ex} with script: {script} and args {args}") - sys.exit(1) - - -# -# def inform(*args: Any) -> None: -# print(args) - -# keep this one diff --git a/pipx_installs.sh b/pipx_installs.sh index 7e51f8b..8fc2269 100644 --- a/pipx_installs.sh +++ b/pipx_installs.sh @@ -1,6 +1,5 @@ # so these tools don't conflict with each other pipx install isort -pipx install pygount pipx install mypy pipx install vulture @@ -9,15 +8,4 @@ pipx install vulture #pipx install pyupgrade pipx install pylint pipx install radon -pipx install flake8 -pipx inject flake8 dlint mccabe pyflakes pep8-naming flake8-bugbear -pipx install pipenv-to-requirements -pipx install yamllint -pipx install apistar -pipx install openapi-spec-validator -pipx install jiggle_version -pipx install pyroma -pipx install twine pipx install bandit - -# pipx install "check-manifest==0.40" diff --git a/poetry.lock b/poetry.lock index 05a7da5..d243595 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,120 +1,211 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + [[package]] name = "2to3" version = "1.0" description = "Adds the 2to3 command directly to entry_points." -category = "main" optional = false python-versions = "*" +files = [ + {file = "2to3-1.0-py3-none-any.whl", hash = "sha256:a39fb204829c6ed90be1507f3aff1c2b4fa6734585d57a50286f039546b5fb7f"}, + {file = "2to3-1.0.tar.gz", hash = "sha256:958bc212c928bbdcbc778b72528e0a39ae4ee8040eda6af6c3b5dd640c98ce6d"}, +] [[package]] name = "aiohttp" -version = "3.6.2" +version = "3.8.6" description = "Async http client/server framework (asyncio)" -category = "main" optional = false -python-versions = ">=3.5.3" - -[package.dependencies] -async-timeout = ">=3.0,<4.0" +python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:41d55fc043954cddbbd82503d9cc3f4814a40bcef30b3569bc7b5e34130718c1"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1d84166673694841d8953f0a8d0c90e1087739d24632fe86b1a08819168b4566"}, + {file = "aiohttp-3.8.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:253bf92b744b3170eb4c4ca2fa58f9c4b87aeb1df42f71d4e78815e6e8b73c9e"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3fd194939b1f764d6bb05490987bfe104287bbf51b8d862261ccf66f48fb4096"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c5f938d199a6fdbdc10bbb9447496561c3a9a565b43be564648d81e1102ac22"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2817b2f66ca82ee699acd90e05c95e79bbf1dc986abb62b61ec8aaf851e81c93"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fa375b3d34e71ccccf172cab401cd94a72de7a8cc01847a7b3386204093bb47"}, + {file = "aiohttp-3.8.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9de50a199b7710fa2904be5a4a9b51af587ab24c8e540a7243ab737b45844543"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1d8cb0b56b3587c5c01de3bf2f600f186da7e7b5f7353d1bf26a8ddca57f965"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8e31e9db1bee8b4f407b77fd2507337a0a80665ad7b6c749d08df595d88f1cf5"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:7bc88fc494b1f0311d67f29fee6fd636606f4697e8cc793a2d912ac5b19aa38d"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ec00c3305788e04bf6d29d42e504560e159ccaf0be30c09203b468a6c1ccd3b2"}, + {file = "aiohttp-3.8.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad1407db8f2f49329729564f71685557157bfa42b48f4b93e53721a16eb813ed"}, + {file = "aiohttp-3.8.6-cp310-cp310-win32.whl", hash = "sha256:ccc360e87341ad47c777f5723f68adbb52b37ab450c8bc3ca9ca1f3e849e5fe2"}, + {file = "aiohttp-3.8.6-cp310-cp310-win_amd64.whl", hash = "sha256:93c15c8e48e5e7b89d5cb4613479d144fda8344e2d886cf694fd36db4cc86865"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e2f9cc8e5328f829f6e1fb74a0a3a939b14e67e80832975e01929e320386b34"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e6a00ffcc173e765e200ceefb06399ba09c06db97f401f920513a10c803604ca"}, + {file = "aiohttp-3.8.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:41bdc2ba359032e36c0e9de5a3bd00d6fb7ea558a6ce6b70acedf0da86458321"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14cd52ccf40006c7a6cd34a0f8663734e5363fd981807173faf3a017e202fec9"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2d5b785c792802e7b275c420d84f3397668e9d49ab1cb52bd916b3b3ffcf09ad"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1bed815f3dc3d915c5c1e556c397c8667826fbc1b935d95b0ad680787896a358"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96603a562b546632441926cd1293cfcb5b69f0b4159e6077f7c7dbdfb686af4d"}, + {file = "aiohttp-3.8.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d76e8b13161a202d14c9584590c4df4d068c9567c99506497bdd67eaedf36403"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3f1e3f1a1751bb62b4a1b7f4e435afcdade6c17a4fd9b9d43607cebd242924a"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:76b36b3124f0223903609944a3c8bf28a599b2cc0ce0be60b45211c8e9be97f8"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a2ece4af1f3c967a4390c284797ab595a9f1bc1130ef8b01828915a05a6ae684"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:16d330b3b9db87c3883e565340d292638a878236418b23cc8b9b11a054aaa887"}, + {file = "aiohttp-3.8.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:42c89579f82e49db436b69c938ab3e1559e5a4409eb8639eb4143989bc390f2f"}, + {file = "aiohttp-3.8.6-cp311-cp311-win32.whl", hash = "sha256:efd2fcf7e7b9d7ab16e6b7d54205beded0a9c8566cb30f09c1abe42b4e22bdcb"}, + {file = "aiohttp-3.8.6-cp311-cp311-win_amd64.whl", hash = "sha256:3b2ab182fc28e7a81f6c70bfbd829045d9480063f5ab06f6e601a3eddbbd49a0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fdee8405931b0615220e5ddf8cd7edd8592c606a8e4ca2a00704883c396e4479"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d25036d161c4fe2225d1abff2bd52c34ed0b1099f02c208cd34d8c05729882f0"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d791245a894be071d5ab04bbb4850534261a7d4fd363b094a7b9963e8cdbd31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0cccd1de239afa866e4ce5c789b3032442f19c261c7d8a01183fd956b1935349"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1f13f60d78224f0dace220d8ab4ef1dbc37115eeeab8c06804fec11bec2bbd07"}, + {file = "aiohttp-3.8.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8a9b5a0606faca4f6cc0d338359d6fa137104c337f489cd135bb7fbdbccb1e39"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:13da35c9ceb847732bf5c6c5781dcf4780e14392e5d3b3c689f6d22f8e15ae31"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:4d4cbe4ffa9d05f46a28252efc5941e0462792930caa370a6efaf491f412bc66"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:229852e147f44da0241954fc6cb910ba074e597f06789c867cb7fb0621e0ba7a"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:713103a8bdde61d13490adf47171a1039fd880113981e55401a0f7b42c37d071"}, + {file = "aiohttp-3.8.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:45ad816b2c8e3b60b510f30dbd37fe74fd4a772248a52bb021f6fd65dff809b6"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win32.whl", hash = "sha256:2b8d4e166e600dcfbff51919c7a3789ff6ca8b3ecce16e1d9c96d95dd569eb4c"}, + {file = "aiohttp-3.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:0912ed87fee967940aacc5306d3aa8ba3a459fcd12add0b407081fbefc931e53"}, + {file = "aiohttp-3.8.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e2a988a0c673c2e12084f5e6ba3392d76c75ddb8ebc6c7e9ead68248101cd446"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf3fd9f141700b510d4b190094db0ce37ac6361a6806c153c161dc6c041ccda"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3161ce82ab85acd267c8f4b14aa226047a6bee1e4e6adb74b798bd42c6ae1f80"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d95fc1bf33a9a81469aa760617b5971331cdd74370d1214f0b3109272c0e1e3c"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c43ecfef7deaf0617cee936836518e7424ee12cb709883f2c9a1adda63cc460"}, + {file = "aiohttp-3.8.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca80e1b90a05a4f476547f904992ae81eda5c2c85c66ee4195bb8f9c5fb47f28"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:90c72ebb7cb3a08a7f40061079817133f502a160561d0675b0a6adf231382c92"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bb54c54510e47a8c7c8e63454a6acc817519337b2b78606c4e840871a3e15349"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:de6a1c9f6803b90e20869e6b99c2c18cef5cc691363954c93cb9adeb26d9f3ae"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:a3628b6c7b880b181a3ae0a0683698513874df63783fd89de99b7b7539e3e8a8"}, + {file = "aiohttp-3.8.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:fc37e9aef10a696a5a4474802930079ccfc14d9f9c10b4662169671ff034b7df"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win32.whl", hash = "sha256:f8ef51e459eb2ad8e7a66c1d6440c808485840ad55ecc3cafefadea47d1b1ba2"}, + {file = "aiohttp-3.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:b2fe42e523be344124c6c8ef32a011444e869dc5f883c591ed87f84339de5976"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9e2ee0ac5a1f5c7dd3197de309adfb99ac4617ff02b0603fd1e65b07dc772e4b"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:01770d8c04bd8db568abb636c1fdd4f7140b284b8b3e0b4584f070180c1e5c62"}, + {file = "aiohttp-3.8.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3c68330a59506254b556b99a91857428cab98b2f84061260a67865f7f52899f5"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89341b2c19fb5eac30c341133ae2cc3544d40d9b1892749cdd25892bbc6ac951"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71783b0b6455ac8f34b5ec99d83e686892c50498d5d00b8e56d47f41b38fbe04"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f628dbf3c91e12f4d6c8b3f092069567d8eb17814aebba3d7d60c149391aee3a"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b04691bc6601ef47c88f0255043df6f570ada1a9ebef99c34bd0b72866c217ae"}, + {file = "aiohttp-3.8.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ee912f7e78287516df155f69da575a0ba33b02dd7c1d6614dbc9463f43066e3"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:9c19b26acdd08dd239e0d3669a3dddafd600902e37881f13fbd8a53943079dbc"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:99c5ac4ad492b4a19fc132306cd57075c28446ec2ed970973bbf036bcda1bcc6"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f0f03211fd14a6a0aed2997d4b1c013d49fb7b50eeb9ffdf5e51f23cfe2c77fa"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:8d399dade330c53b4106160f75f55407e9ae7505263ea86f2ccca6bfcbdb4921"}, + {file = "aiohttp-3.8.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ec4fd86658c6a8964d75426517dc01cbf840bbf32d055ce64a9e63a40fd7b771"}, + {file = "aiohttp-3.8.6-cp38-cp38-win32.whl", hash = "sha256:33164093be11fcef3ce2571a0dccd9041c9a93fa3bde86569d7b03120d276c6f"}, + {file = "aiohttp-3.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:bdf70bfe5a1414ba9afb9d49f0c912dc524cf60141102f3a11143ba3d291870f"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d52d5dc7c6682b720280f9d9db41d36ebe4791622c842e258c9206232251ab2b"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:4ac39027011414dbd3d87f7edb31680e1f430834c8cef029f11c66dad0670aa5"}, + {file = "aiohttp-3.8.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3f5c7ce535a1d2429a634310e308fb7d718905487257060e5d4598e29dc17f0b"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b30e963f9e0d52c28f284d554a9469af073030030cef8693106d918b2ca92f54"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:918810ef188f84152af6b938254911055a72e0f935b5fbc4c1a4ed0b0584aed1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:002f23e6ea8d3dd8d149e569fd580c999232b5fbc601c48d55398fbc2e582e8c"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fcf3eabd3fd1a5e6092d1242295fa37d0354b2eb2077e6eb670accad78e40e1"}, + {file = "aiohttp-3.8.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:255ba9d6d5ff1a382bb9a578cd563605aa69bec845680e21c44afc2670607a95"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d67f8baed00870aa390ea2590798766256f31dc5ed3ecc737debb6e97e2ede78"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:86f20cee0f0a317c76573b627b954c412ea766d6ada1a9fcf1b805763ae7feeb"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:39a312d0e991690ccc1a61f1e9e42daa519dcc34ad03eb6f826d94c1190190dd"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e827d48cf802de06d9c935088c2924e3c7e7533377d66b6f31ed175c1620e05e"}, + {file = "aiohttp-3.8.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bd111d7fc5591ddf377a408ed9067045259ff2770f37e2d94e6478d0f3fc0c17"}, + {file = "aiohttp-3.8.6-cp39-cp39-win32.whl", hash = "sha256:caf486ac1e689dda3502567eb89ffe02876546599bbf915ec94b1fa424eeffd4"}, + {file = "aiohttp-3.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:3f0e27e5b733803333bb2371249f41cf42bae8884863e8e8965ec69bebe53132"}, + {file = "aiohttp-3.8.6.tar.gz", hash = "sha256:b0cf2a4501bff9330a8a5248b4ce951851e415bdcce9dc158e76cfd55e15085c"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" attrs = ">=17.3.0" -chardet = ">=2.0,<4.0" -idna-ssl = {version = ">=1.0", markers = "python_version < \"3.7\""} -multidict = ">=4.5,<5.0" -typing-extensions = {version = ">=3.6.5", markers = "python_version < \"3.7\""} +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" yarl = ">=1.0,<2.0" [package.extras] -speedups = ["aiodns", "brotlipy", "cchardet"] +speedups = ["Brotli", "aiodns", "cchardet"] [[package]] -name = "apipkg" -version = "1.5" -description = "apipkg: namespace control and lazy-import mechanism" -category = "dev" +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" -optional = false -python-versions = "*" +[package.dependencies] +frozenlist = ">=1.1.0" [[package]] -name = "astroid" -version = "2.4.2" -description = "An abstract syntax tree for Python with inference support." -category = "main" +name = "anyio" +version = "4.0.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" +files = [ + {file = "anyio-4.0.0-py3-none-any.whl", hash = "sha256:cfdb2b588b9fc25ede96d8db56ed50848b0b649dca3dd1df0b11f683bb9e0b5f"}, + {file = "anyio-4.0.0.tar.gz", hash = "sha256:f7ed51751b2c2add651e5747c891b47e26d2a21be5d32d9311dfe9692f3e5d7a"}, +] [package.dependencies] -lazy-object-proxy = ">=1.4.0,<1.5.0" -six = ">=1.12,<2.0" -typed-ast = {version = ">=1.4.0,<1.5", markers = "implementation_name == \"cpython\" and python_version < \"3.8\""} -wrapt = ">=1.11,<2.0" +idna = ">=2.8" +sniffio = ">=1.1" + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.22)"] [[package]] -name = "async-timeout" +name = "astroid" version = "3.0.1" -description = "Timeout context manager for asyncio programs" -category = "main" +description = "An abstract syntax tree for Python with inference support." optional = false -python-versions = ">=3.5.3" +python-versions = ">=3.8.0" +files = [ + {file = "astroid-3.0.1-py3-none-any.whl", hash = "sha256:7d5895c9825e18079c5aeac0572bc2e4c83205c95d416e0b4fee8bc361d2d9ca"}, + {file = "astroid-3.0.1.tar.gz", hash = "sha256:86b0bb7d7da0be1a7c4aedb7974e391b32d4ed89e33de6ed6902b4b15c97577e"}, +] [[package]] -name = "atomicwrites" -version = "1.4.0" -description = "Atomic file writes." -category = "dev" +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] [[package]] name = "attrs" -version = "20.3.0" +version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "furo", "sphinx", "pre-commit"] -docs = ["furo", "sphinx", "zope.interface"] -tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] -tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six"] - -[[package]] -name = "bcrypt" -version = "3.2.0" -description = "Modern password hashing for your software and your servers" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cffi = ">=1.1" -six = ">=1.4.1" +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] [package.extras] -tests = ["pytest (>=3.2.1,!=3.3.0)"] -typecheck = ["mypy"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] name = "beautifulsoup4" -version = "4.9.1" +version = "4.12.2" description = "Screen-scraping library" -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] [package.dependencies] -soupsieve = [ - ">1.2", - "<2.0", -] +soupsieve = ">1.2" [package.extras] html5lib = ["html5lib"] @@ -124,738 +215,1384 @@ lxml = ["lxml"] name = "binary" version = "1.0.0" description = "" -category = "main" optional = false python-versions = "*" +files = [ + {file = "binary-1.0.0-py2.py3-none-any.whl", hash = "sha256:e1b61f3a5c002717d1a28e4d9d2dc8acbc9d6b12baf7b1e4ab25d743da97e323"}, + {file = "binary-1.0.0.tar.gz", hash = "sha256:6ec010e58f7331ebc8bc9638dbe6c66d635de60d5818b0723bef4dead0ec28a6"}, +] [[package]] name = "black" -version = "20.8b1" +version = "23.10.1" description = "The uncompromising code formatter." -category = "main" optional = false -python-versions = ">=3.6" - -[package.dependencies] -appdirs = "*" -click = ">=7.1.2" -dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""} +python-versions = ">=3.8" +files = [ + {file = "black-23.10.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:ec3f8e6234c4e46ff9e16d9ae96f4ef69fa328bb4ad08198c8cee45bb1f08c69"}, + {file = "black-23.10.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:1b917a2aa020ca600483a7b340c165970b26e9029067f019e3755b56e8dd5916"}, + {file = "black-23.10.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c74de4c77b849e6359c6f01987e94873c707098322b91490d24296f66d067dc"}, + {file = "black-23.10.1-cp310-cp310-win_amd64.whl", hash = "sha256:7b4d10b0f016616a0d93d24a448100adf1699712fb7a4efd0e2c32bbb219b173"}, + {file = "black-23.10.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:b15b75fc53a2fbcac8a87d3e20f69874d161beef13954747e053bca7a1ce53a0"}, + {file = "black-23.10.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:e293e4c2f4a992b980032bbd62df07c1bcff82d6964d6c9496f2cd726e246ace"}, + {file = "black-23.10.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d56124b7a61d092cb52cce34182a5280e160e6aff3137172a68c2c2c4b76bcb"}, + {file = "black-23.10.1-cp311-cp311-win_amd64.whl", hash = "sha256:3f157a8945a7b2d424da3335f7ace89c14a3b0625e6593d21139c2d8214d55ce"}, + {file = "black-23.10.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:cfcce6f0a384d0da692119f2d72d79ed07c7159879d0bb1bb32d2e443382bf3a"}, + {file = "black-23.10.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:33d40f5b06be80c1bbce17b173cda17994fbad096ce60eb22054da021bf933d1"}, + {file = "black-23.10.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:840015166dbdfbc47992871325799fd2dc0dcf9395e401ada6d88fe11498abad"}, + {file = "black-23.10.1-cp38-cp38-win_amd64.whl", hash = "sha256:037e9b4664cafda5f025a1728c50a9e9aedb99a759c89f760bd83730e76ba884"}, + {file = "black-23.10.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:7cb5936e686e782fddb1c73f8aa6f459e1ad38a6a7b0e54b403f1f05a1507ee9"}, + {file = "black-23.10.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:7670242e90dc129c539e9ca17665e39a146a761e681805c54fbd86015c7c84f7"}, + {file = "black-23.10.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed45ac9a613fb52dad3b61c8dea2ec9510bf3108d4db88422bacc7d1ba1243d"}, + {file = "black-23.10.1-cp39-cp39-win_amd64.whl", hash = "sha256:6d23d7822140e3fef190734216cefb262521789367fbdc0b3f22af6744058982"}, + {file = "black-23.10.1-py3-none-any.whl", hash = "sha256:d431e6739f727bb2e0495df64a6c7a5310758e87505f5f8cde9ff6c0f2d7e4fe"}, + {file = "black-23.10.1.tar.gz", hash = "sha256:1f8ce316753428ff68749c65a5f7844631aa18c8679dfd3ca9dc1a289979c258"}, +] + +[package.dependencies] +click = ">=8.0.0" mypy-extensions = ">=0.4.3" -pathspec = ">=0.6,<1" -regex = ">=2020.1.8" -toml = ">=0.10.1" -typed-ast = ">=1.4.0" -typing-extensions = ">=3.7.4" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "cachetools" -version = "4.2.1" +version = "5.3.2" description = "Extensible memoizing collections and decorators" -category = "main" optional = false -python-versions = "~=3.5" +python-versions = ">=3.7" +files = [ + {file = "cachetools-5.3.2-py3-none-any.whl", hash = "sha256:861f35a13a451f94e301ce2bec7cac63e881232ccce7ed67fab9b5df4d3beaa1"}, + {file = "cachetools-5.3.2.tar.gz", hash = "sha256:086ee420196f7b2ab9ca2db2520aca326318b68fe5ba8bc4d49cca91add450f2"}, +] [[package]] name = "certifi" -version = "2020.12.5" +version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] [[package]] -name = "cffi" -version = "1.14.5" -description = "Foreign Function Interface for Python calling C code." -category = "main" +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." optional = false -python-versions = "*" - -[package.dependencies] -pycparser = "*" +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] [[package]] name = "chardet" -version = "3.0.4" -description = "Universal encoding detector for Python 2 and 3" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "checksumdir" -version = "1.1.7" -description = "Compute a single hash of the file contents of a directory." -category = "dev" -optional = false -python-versions = "*" +version = "5.2.0" +description = "Universal encoding detector for Python 3" +optional = false +python-versions = ">=3.7" +files = [ + {file = "chardet-5.2.0-py3-none-any.whl", hash = "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970"}, + {file = "chardet-5.2.0.tar.gz", hash = "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] [[package]] name = "click" -version = "7.1.2" +version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "colorama" -version = "0.4.4" +version = "0.4.6" description = "Cross-platform colored terminal text." -category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "colorclass" -version = "2.2.0" +version = "2.2.2" description = "Colorful worry-free console applications for Linux, Mac OS X, and Windows." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "configparser" -version = "5.0.1" -description = "Updated configparser from Python 3.8 for Python 2.6+." -category = "dev" optional = false -python-versions = ">=3.6" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "pytest-black (>=0.3.7)", "pytest-mypy"] +python-versions = ">=2.6" +files = [ + {file = "colorclass-2.2.2-py2.py3-none-any.whl", hash = "sha256:6f10c273a0ef7a1150b1120b6095cbdd68e5cf36dfd5d0fc957a2500bbf99a55"}, + {file = "colorclass-2.2.2.tar.gz", hash = "sha256:6d4fe287766166a98ca7bc6f6312daf04a0481b1eda43e7173484051c0ab4366"}, +] [[package]] name = "coverage" -version = "5.4" +version = "7.3.2" description = "Code coverage measurement for Python" -category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" - -[package.extras] -toml = ["toml"] - -[[package]] -name = "cryptography" -version = "3.4.5" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cffi = ">=1.12" +python-versions = ">=3.8" +files = [ + {file = "coverage-7.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d872145f3a3231a5f20fd48500274d7df222e291d90baa2026cc5152b7ce86bf"}, + {file = "coverage-7.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:310b3bb9c91ea66d59c53fa4989f57d2436e08f18fb2f421a1b0b6b8cc7fffda"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f47d39359e2c3779c5331fc740cf4bce6d9d680a7b4b4ead97056a0ae07cb49a"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aa72dbaf2c2068404b9870d93436e6d23addd8bbe9295f49cbca83f6e278179c"}, + {file = "coverage-7.3.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:beaa5c1b4777f03fc63dfd2a6bd820f73f036bfb10e925fce067b00a340d0f3f"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:dbc1b46b92186cc8074fee9d9fbb97a9dd06c6cbbef391c2f59d80eabdf0faa6"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:315a989e861031334d7bee1f9113c8770472db2ac484e5b8c3173428360a9148"}, + {file = "coverage-7.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d1bc430677773397f64a5c88cb522ea43175ff16f8bfcc89d467d974cb2274f9"}, + {file = "coverage-7.3.2-cp310-cp310-win32.whl", hash = "sha256:a889ae02f43aa45032afe364c8ae84ad3c54828c2faa44f3bfcafecb5c96b02f"}, + {file = "coverage-7.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c0ba320de3fb8c6ec16e0be17ee1d3d69adcda99406c43c0409cb5c41788a611"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ac8c802fa29843a72d32ec56d0ca792ad15a302b28ca6203389afe21f8fa062c"}, + {file = "coverage-7.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:89a937174104339e3a3ffcf9f446c00e3a806c28b1841c63edb2b369310fd074"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e267e9e2b574a176ddb983399dec325a80dbe161f1a32715c780b5d14b5f583a"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2443cbda35df0d35dcfb9bf8f3c02c57c1d6111169e3c85fc1fcc05e0c9f39a3"}, + {file = "coverage-7.3.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4175e10cc8dda0265653e8714b3174430b07c1dca8957f4966cbd6c2b1b8065a"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0cbf38419fb1a347aaf63481c00f0bdc86889d9fbf3f25109cf96c26b403fda1"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:5c913b556a116b8d5f6ef834038ba983834d887d82187c8f73dec21049abd65c"}, + {file = "coverage-7.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1981f785239e4e39e6444c63a98da3a1db8e971cb9ceb50a945ba6296b43f312"}, + {file = "coverage-7.3.2-cp311-cp311-win32.whl", hash = "sha256:43668cabd5ca8258f5954f27a3aaf78757e6acf13c17604d89648ecc0cc66640"}, + {file = "coverage-7.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10c39c0452bf6e694511c901426d6b5ac005acc0f78ff265dbe36bf81f808a2"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:4cbae1051ab791debecc4a5dcc4a1ff45fc27b91b9aee165c8a27514dd160836"}, + {file = "coverage-7.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:12d15ab5833a997716d76f2ac1e4b4d536814fc213c85ca72756c19e5a6b3d63"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c7bba973ebee5e56fe9251300c00f1579652587a9f4a5ed8404b15a0471f216"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4"}, + {file = "coverage-7.3.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e9589bd04d0461a417562649522575d8752904d35c12907d8c9dfeba588faf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d51ac2a26f71da1b57f2dc81d0e108b6ab177e7d30e774db90675467c847bbdf"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:99b89d9f76070237975b315b3d5f4d6956ae354a4c92ac2388a5695516e47c84"}, + {file = "coverage-7.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a"}, + {file = "coverage-7.3.2-cp312-cp312-win32.whl", hash = "sha256:289fe43bf45a575e3ab10b26d7b6f2ddb9ee2dba447499f5401cfb5ecb8196bb"}, + {file = "coverage-7.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dbc3ed60e8659bc59b6b304b43ff9c3ed858da2839c78b804973f613d3e92ed"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f94b734214ea6a36fe16e96a70d941af80ff3bfd716c141300d95ebc85339738"}, + {file = "coverage-7.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:af3d828d2c1cbae52d34bdbb22fcd94d1ce715d95f1a012354a75e5913f1bda2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:630b13e3036e13c7adc480ca42fa7afc2a5d938081d28e20903cf7fd687872e2"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9eacf273e885b02a0273bb3a2170f30e2d53a6d53b72dbe02d6701b5296101c"}, + {file = "coverage-7.3.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8f17966e861ff97305e0801134e69db33b143bbfb36436efb9cfff6ec7b2fd9"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b4275802d16882cf9c8b3d057a0839acb07ee9379fa2749eca54efbce1535b82"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:72c0cfa5250f483181e677ebc97133ea1ab3eb68645e494775deb6a7f6f83901"}, + {file = "coverage-7.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:cb536f0dcd14149425996821a168f6e269d7dcd2c273a8bff8201e79f5104e76"}, + {file = "coverage-7.3.2-cp38-cp38-win32.whl", hash = "sha256:307adb8bd3abe389a471e649038a71b4eb13bfd6b7dd9a129fa856f5c695cf92"}, + {file = "coverage-7.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:88ed2c30a49ea81ea3b7f172e0269c182a44c236eb394718f976239892c0a27a"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b631c92dfe601adf8f5ebc7fc13ced6bb6e9609b19d9a8cd59fa47c4186ad1ce"}, + {file = "coverage-7.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d3d9df4051c4a7d13036524b66ecf7a7537d14c18a384043f30a303b146164e9"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5f7363d3b6a1119ef05015959ca24a9afc0ea8a02c687fe7e2d557705375c01f"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2f11cc3c967a09d3695d2a6f03fb3e6236622b93be7a4b5dc09166a861be6d25"}, + {file = "coverage-7.3.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:149de1d2401ae4655c436a3dced6dd153f4c3309f599c3d4bd97ab172eaf02d9"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3a4006916aa6fee7cd38db3bfc95aa9c54ebb4ffbfc47c677c8bba949ceba0a6"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9028a3871280110d6e1aa2df1afd5ef003bab5fb1ef421d6dc748ae1c8ef2ebc"}, + {file = "coverage-7.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9f805d62aec8eb92bab5b61c0f07329275b6f41c97d80e847b03eb894f38d083"}, + {file = "coverage-7.3.2-cp39-cp39-win32.whl", hash = "sha256:d1c88ec1a7ff4ebca0219f5b1ef863451d828cccf889c173e1253aa84b1e07ce"}, + {file = "coverage-7.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b4767da59464bb593c07afceaddea61b154136300881844768037fd5e859353f"}, + {file = "coverage-7.3.2-pp38.pp39.pp310-none-any.whl", hash = "sha256:ae97af89f0fbf373400970c0a21eef5aa941ffeed90aee43650b81f7d7f47637"}, + {file = "coverage-7.3.2.tar.gz", hash = "sha256:be32ad29341b0170e795ca590e1c07e81fc061cb5b10c74ce7203491484404ef"}, +] [package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -sdist = ["setuptools-rust (>=0.11.4)"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["pytest (>=6.0)", "pytest-cov", "pytest-subtests", "pytest-xdist", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,!=3.79.2)"] - -[[package]] -name = "dataclasses" -version = "0.8" -description = "A backport of the dataclasses module for Python 3.6" -category = "main" -optional = false -python-versions = ">=3.6, <3.7" +toml = ["tomli"] [[package]] name = "dataproperty" -version = "0.50.0" +version = "1.0.1" description = "Python library for extract property from data." -category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "DataProperty-1.0.1-py3-none-any.whl", hash = "sha256:0b8b07d4fb6453fcf975b53d35dea41f3cfd69c9d79b5010c3cf224ff0407a7a"}, + {file = "DataProperty-1.0.1.tar.gz", hash = "sha256:723e5729fa6e885e127a771a983ee1e0e34bb141aca4ffe1f0bfa7cde34650a4"}, +] [package.dependencies] mbstrdecoder = ">=1.0.0,<2" -typepy = {version = ">=1.1.1,<2", extras = ["datetime"]} +typepy = {version = ">=1.2.0,<2", extras = ["datetime"]} [package.extras] logging = ["loguru (>=0.4.1,<1)"] -test = ["pytest", "pytest-md-report", "termcolor"] - -[[package]] -name = "decorator" -version = "4.4.2" -description = "Decorators for Humans" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" +test = ["pytest (>=6.0.1)", "pytest-md-report (>=0.3)", "tcolorpy (>=0.1.2)"] [[package]] name = "defusedxml" -version = "0.6.0" +version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] [[package]] name = "diskcache" -version = "5.2.1" +version = "5.6.3" description = "Disk Cache -- Disk and file backed persistent cache." -category = "main" optional = false python-versions = ">=3" +files = [ + {file = "diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19"}, + {file = "diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc"}, +] [[package]] -name = "docopt" -version = "0.6.2" -description = "Pythonic argument parser, that will make you smile" -category = "main" +name = "distlib" +version = "0.3.7" +description = "Distribution utilities" optional = false python-versions = "*" +files = [ + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, +] [[package]] -name = "dodgy" -version = "0.2.1" -description = "Dodgy: Searches for dodgy looking lines in Python code" -category = "dev" +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" optional = false python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] [[package]] name = "dominate" -version = "2.6.0" +version = "2.8.0" description = "Dominate is a Python library for creating and manipulating HTML documents using an elegant DOM API." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "dominate-2.8.0-py2.py3-none-any.whl", hash = "sha256:1a916479c45b95fedba0d077b081d77c2d2e0f0f484ac827105087af23661d73"}, + {file = "dominate-2.8.0.tar.gz", hash = "sha256:4c90c3befaf88e612b71f4b39af7bcbef8977acfa855cec957225a8fbf504007"}, +] [[package]] -name = "dparse" -version = "0.5.1" -description = "A parser for Python dependency files" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -packaging = "*" -pyyaml = "*" -toml = "*" - -[package.extras] -pipenv = ["pipenv"] - -[[package]] -name = "execnet" -version = "1.8.0" -description = "execnet: rapid multi-Python deployment" -category = "dev" +name = "fake-useragent" +version = "0.1.14" +description = "Up-to-date simple useragent faker with real world database" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -apipkg = ">=1.4" - -[package.extras] -testing = ["pre-commit"] +python-versions = "*" +files = [ + {file = "fake-useragent-0.1.14.tar.gz", hash = "sha256:470c509fc645a4fb2799a6cdf35982c3d27e57af04f601b3f37ac0b5e46c0cc7"}, + {file = "fake_useragent-0.1.14-py3-none-any.whl", hash = "sha256:f51e7c58e3733be152f69e2d0751d19274f0d36dd7a75e6706e503163bc61d46"}, +] [[package]] -name = "gitchangelog" -version = "3.0.4" -description = "gitchangelog generates a changelog thanks to git log." -category = "dev" +name = "fastjsonschema" +version = "2.18.1" +description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" +files = [ + {file = "fastjsonschema-2.18.1-py3-none-any.whl", hash = "sha256:aec6a19e9f66e9810ab371cc913ad5f4e9e479b63a7072a2cd060a9369e329a8"}, + {file = "fastjsonschema-2.18.1.tar.gz", hash = "sha256:06dc8680d937628e993fa0cd278f196d20449a1adc087640710846b324d422ea"}, +] [package.extras] -Mako = ["mako"] -Mustache = ["pystache"] -test = ["mako", "minimock", "nose", "pystache"] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] [[package]] -name = "gitdb" -version = "4.0.5" -description = "Git Object Database" -category = "dev" +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." optional = false -python-versions = ">=3.4" +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] -[package.dependencies] -smmap = ">=3.0.1,<4" +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] [[package]] -name = "gitpython" -version = "3.1.13" -description = "Python Git Library" -category = "dev" -optional = false -python-versions = ">=3.4" - -[package.dependencies] -gitdb = ">=4.0.1,<5" +name = "frozenlist" +version = "1.4.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, +] [[package]] name = "google-api-core" -version = "1.26.0" +version = "2.12.0" description = "Google API client core library" -category = "main" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.7" +files = [ + {file = "google-api-core-2.12.0.tar.gz", hash = "sha256:c22e01b1e3c4dcd90998494879612c38d0a3411d1f7b679eb89e2abe3ce1f553"}, + {file = "google_api_core-2.12.0-py3-none-any.whl", hash = "sha256:ec6054f7d64ad13b41e43d96f735acbd763b0f3b695dabaa2d579673f6a6e160"}, +] [package.dependencies] -google-auth = ">=1.21.1,<2.0dev" -googleapis-common-protos = ">=1.6.0,<2.0dev" -grpcio = {version = ">=1.29.0,<2.0dev", optional = true, markers = "extra == \"grpc\""} -packaging = ">=14.3" -protobuf = ">=3.12.0" -pytz = "*" -requests = ">=2.18.0,<3.0.0dev" -six = ">=1.13.0" +google-auth = ">=2.14.1,<3.0.dev0" +googleapis-common-protos = ">=1.56.2,<2.0.dev0" +grpcio = [ + {version = ">=1.33.2,<2.0dev", optional = true, markers = "extra == \"grpc\""}, + {version = ">=1.49.1,<2.0dev", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, +] +grpcio-status = [ + {version = ">=1.33.2,<2.0.dev0", optional = true, markers = "extra == \"grpc\""}, + {version = ">=1.49.1,<2.0.dev0", optional = true, markers = "python_version >= \"3.11\" and extra == \"grpc\""}, +] +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" +requests = ">=2.18.0,<3.0.0.dev0" [package.extras] -grpc = ["grpcio (>=1.29.0,<2.0dev)"] -grpcgcp = ["grpcio-gcp (>=0.2.2)"] -grpcio-gcp = ["grpcio-gcp (>=0.2.2)"] +grpc = ["grpcio (>=1.33.2,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "grpcio-status (>=1.33.2,<2.0.dev0)", "grpcio-status (>=1.49.1,<2.0.dev0)"] +grpcgcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] +grpcio-gcp = ["grpcio-gcp (>=0.2.2,<1.0.dev0)"] [[package]] name = "google-auth" -version = "1.26.1" +version = "2.23.4" description = "Google Authentication Library" -category = "main" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.7" +files = [ + {file = "google-auth-2.23.4.tar.gz", hash = "sha256:79905d6b1652187def79d491d6e23d0cbb3a21d3c7ba0dbaa9c8a01906b13ff3"}, + {file = "google_auth-2.23.4-py2.py3-none-any.whl", hash = "sha256:d4bbc92fe4b8bfd2f3e8d88e5ba7085935da208ee38a134fc280e7ce682a05f2"}, +] [package.dependencies] -cachetools = ">=2.0.0,<5.0" +cachetools = ">=2.0.0,<6.0" pyasn1-modules = ">=0.2.1" -rsa = {version = ">=3.1.4,<5", markers = "python_version >= \"3.6\""} -six = ">=1.9.0" +rsa = ">=3.1.4,<5" [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0.dev0)", "requests (>=2.20.0,<3.0.0.dev0)"] +enterprise-cert = ["cryptography (==36.0.2)", "pyopenssl (==22.0.0)"] +pyopenssl = ["cryptography (>=38.0.3)", "pyopenssl (>=20.0.0)"] +reauth = ["pyu2f (>=0.1.5)"] +requests = ["requests (>=2.20.0,<3.0.0.dev0)"] [[package]] name = "google-cloud-bigquery" -version = "2.6.1" +version = "3.13.0" description = "Google BigQuery API client library" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "google-cloud-bigquery-3.13.0.tar.gz", hash = "sha256:794ccfc93ccb0e0ad689442f896f9c82de56da0fe18a195531bb37096c2657d6"}, + {file = "google_cloud_bigquery-3.13.0-py2.py3-none-any.whl", hash = "sha256:eda3dbcff676e17962c54e5224e415b55e4f6833a5c896c6c8902b69e7dba4b4"}, +] [package.dependencies] -google-api-core = {version = ">=1.23.0,<2.0.0dev", extras = ["grpc"]} -google-cloud-core = ">=1.4.1,<2.0dev" -google-resumable-media = ">=0.6.0,<2.0dev" -proto-plus = ">=1.10.0" -protobuf = ">=3.12.0" -six = ">=1.13.0,<2.0.0dev" +google-api-core = {version = ">=1.31.5,<2.0.dev0 || >2.3.0,<3.0.0dev", extras = ["grpc"]} +google-cloud-core = ">=1.6.0,<3.0.0dev" +google-resumable-media = ">=0.6.0,<3.0dev" +grpcio = {version = ">=1.49.1,<2.0dev", markers = "python_version >= \"3.11\""} +packaging = ">=20.0.0" +proto-plus = ">=1.15.0,<2.0.0dev" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.0 || >4.21.0,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0dev" +python-dateutil = ">=2.7.2,<3.0dev" +requests = ">=2.21.0,<3.0.0dev" [package.extras] -all = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.32.0,<2.0dev)", "pyarrow (>=1.0.0,<3.0dev)", "pandas (>=0.23.0)", "tqdm (>=4.7.4,<5.0.0dev)", "opentelemetry-api (==0.11b0)", "opentelemetry-sdk (==0.11b0)", "opentelemetry-instrumentation (==0.11b0)"] -bqstorage = ["google-cloud-bigquery-storage (>=2.0.0,<3.0.0dev)", "grpcio (>=1.32.0,<2.0dev)", "pyarrow (>=1.0.0,<3.0dev)"] -opentelemetry = ["opentelemetry-api (==0.11b0)", "opentelemetry-sdk (==0.11b0)", "opentelemetry-instrumentation (==0.11b0)"] -pandas = ["pandas (>=0.23.0)", "pyarrow (>=1.0.0,<3.0dev)"] +all = ["Shapely (>=1.8.4,<3.0.0dev)", "db-dtypes (>=0.3.0,<2.0.0dev)", "geopandas (>=0.9.0,<1.0dev)", "google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)", "ipywidgets (>=7.7.0)", "opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)", "tqdm (>=4.7.4,<5.0.0dev)"] +bqstorage = ["google-cloud-bigquery-storage (>=2.6.0,<3.0.0dev)", "grpcio (>=1.47.0,<2.0dev)", "grpcio (>=1.49.1,<2.0dev)", "pyarrow (>=3.0.0)"] +geopandas = ["Shapely (>=1.8.4,<3.0.0dev)", "geopandas (>=0.9.0,<1.0dev)"] +ipython = ["ipykernel (>=6.0.0)", "ipython (>=7.23.1,!=8.1.0)"] +ipywidgets = ["ipykernel (>=6.0.0)", "ipywidgets (>=7.7.0)"] +opentelemetry = ["opentelemetry-api (>=1.1.0)", "opentelemetry-instrumentation (>=0.20b0)", "opentelemetry-sdk (>=1.1.0)"] +pandas = ["db-dtypes (>=0.3.0,<2.0.0dev)", "pandas (>=1.1.0)", "pyarrow (>=3.0.0)"] tqdm = ["tqdm (>=4.7.4,<5.0.0dev)"] [[package]] name = "google-cloud-core" -version = "1.6.0" +version = "2.3.3" description = "Google Cloud API client core library" -category = "main" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">=3.7" +files = [ + {file = "google-cloud-core-2.3.3.tar.gz", hash = "sha256:37b80273c8d7eee1ae816b3a20ae43585ea50506cb0e60f3cf5be5f87f1373cb"}, + {file = "google_cloud_core-2.3.3-py2.py3-none-any.whl", hash = "sha256:fbd11cad3e98a7e5b0343dc07cb1039a5ffd7a5bb96e1f1e27cee4bda4a90863"}, +] [package.dependencies] -google-api-core = ">=1.21.0,<2.0.0dev" -google-auth = ">=1.24.0,<2.0dev" -six = ">=1.12.0" +google-api-core = ">=1.31.6,<2.0.dev0 || >2.3.0,<3.0.0dev" +google-auth = ">=1.25.0,<3.0dev" [package.extras] -grpc = ["grpcio (>=1.8.2,<2.0dev)"] +grpc = ["grpcio (>=1.38.0,<2.0dev)"] [[package]] name = "google-crc32c" -version = "1.1.2" +version = "1.5.0" description = "A python wrapper of the C library 'Google CRC32C'" -category = "main" optional = false -python-versions = ">=3.6" - -[package.dependencies] -cffi = ">=1.0.0" +python-versions = ">=3.7" +files = [ + {file = "google-crc32c-1.5.0.tar.gz", hash = "sha256:89284716bc6a5a415d4eaa11b1726d2d60a0cd12aadf5439828353662ede9dd7"}, + {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:596d1f98fc70232fcb6590c439f43b350cb762fb5d61ce7b0e9db4539654cc13"}, + {file = "google_crc32c-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:be82c3c8cfb15b30f36768797a640e800513793d6ae1724aaaafe5bf86f8f346"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:461665ff58895f508e2866824a47bdee72497b091c730071f2b7575d5762ab65"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e2096eddb4e7c7bdae4bd69ad364e55e07b8316653234a56552d9c988bd2d61b"}, + {file = "google_crc32c-1.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:116a7c3c616dd14a3de8c64a965828b197e5f2d121fedd2f8c5585c547e87b02"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5829b792bf5822fd0a6f6eb34c5f81dd074f01d570ed7f36aa101d6fc7a0a6e4"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:64e52e2b3970bd891309c113b54cf0e4384762c934d5ae56e283f9a0afcd953e"}, + {file = "google_crc32c-1.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:02ebb8bf46c13e36998aeaad1de9b48f4caf545e91d14041270d9dca767b780c"}, + {file = "google_crc32c-1.5.0-cp310-cp310-win32.whl", hash = "sha256:2e920d506ec85eb4ba50cd4228c2bec05642894d4c73c59b3a2fe20346bd00ee"}, + {file = "google_crc32c-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:07eb3c611ce363c51a933bf6bd7f8e3878a51d124acfc89452a75120bc436289"}, + {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cae0274952c079886567f3f4f685bcaf5708f0a23a5f5216fdab71f81a6c0273"}, + {file = "google_crc32c-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1034d91442ead5a95b5aaef90dbfaca8633b0247d1e41621d1e9f9db88c36298"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c42c70cd1d362284289c6273adda4c6af8039a8ae12dc451dcd61cdabb8ab57"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8485b340a6a9e76c62a7dce3c98e5f102c9219f4cfbf896a00cf48caf078d438"}, + {file = "google_crc32c-1.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77e2fd3057c9d78e225fa0a2160f96b64a824de17840351b26825b0848022906"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f583edb943cf2e09c60441b910d6a20b4d9d626c75a36c8fcac01a6c96c01183"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:a1fd716e7a01f8e717490fbe2e431d2905ab8aa598b9b12f8d10abebb36b04dd"}, + {file = "google_crc32c-1.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:72218785ce41b9cfd2fc1d6a017dc1ff7acfc4c17d01053265c41a2c0cc39b8c"}, + {file = "google_crc32c-1.5.0-cp311-cp311-win32.whl", hash = "sha256:66741ef4ee08ea0b2cc3c86916ab66b6aef03768525627fd6a1b34968b4e3709"}, + {file = "google_crc32c-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:ba1eb1843304b1e5537e1fca632fa894d6f6deca8d6389636ee5b4797affb968"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:98cb4d057f285bd80d8778ebc4fde6b4d509ac3f331758fb1528b733215443ae"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd8536e902db7e365f49e7d9029283403974ccf29b13fc7028b97e2295b33556"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19e0a019d2c4dcc5e598cd4a4bc7b008546b0358bd322537c74ad47a5386884f"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c65b9817512edc6a4ae7c7e987fea799d2e0ee40c53ec573a692bee24de876"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6ac08d24c1f16bd2bf5eca8eaf8304812f44af5cfe5062006ec676e7e1d50afc"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3359fc442a743e870f4588fcf5dcbc1bf929df1fad8fb9905cd94e5edb02e84c"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:1e986b206dae4476f41bcec1faa057851f3889503a70e1bdb2378d406223994a"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:de06adc872bcd8c2a4e0dc51250e9e65ef2ca91be023b9d13ebd67c2ba552e1e"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-win32.whl", hash = "sha256:d3515f198eaa2f0ed49f8819d5732d70698c3fa37384146079b3799b97667a94"}, + {file = "google_crc32c-1.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:67b741654b851abafb7bc625b6d1cdd520a379074e64b6a128e3b688c3c04740"}, + {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:c02ec1c5856179f171e032a31d6f8bf84e5a75c45c33b2e20a3de353b266ebd8"}, + {file = "google_crc32c-1.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:edfedb64740750e1a3b16152620220f51d58ff1b4abceb339ca92e934775c27a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84e6e8cd997930fc66d5bb4fde61e2b62ba19d62b7abd7a69920406f9ecca946"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:024894d9d3cfbc5943f8f230e23950cd4906b2fe004c72e29b209420a1e6b05a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:998679bf62b7fb599d2878aa3ed06b9ce688b8974893e7223c60db155f26bd8d"}, + {file = "google_crc32c-1.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:83c681c526a3439b5cf94f7420471705bbf96262f49a6fe546a6db5f687a3d4a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4c6fdd4fccbec90cc8a01fc00773fcd5fa28db683c116ee3cb35cd5da9ef6c37"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5ae44e10a8e3407dbe138984f21e536583f2bba1be9491239f942c2464ac0894"}, + {file = "google_crc32c-1.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37933ec6e693e51a5b07505bd05de57eee12f3e8c32b07da7e73669398e6630a"}, + {file = "google_crc32c-1.5.0-cp38-cp38-win32.whl", hash = "sha256:fe70e325aa68fa4b5edf7d1a4b6f691eb04bbccac0ace68e34820d283b5f80d4"}, + {file = "google_crc32c-1.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:74dea7751d98034887dbd821b7aae3e1d36eda111d6ca36c206c44478035709c"}, + {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c6c777a480337ac14f38564ac88ae82d4cd238bf293f0a22295b66eb89ffced7"}, + {file = "google_crc32c-1.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:759ce4851a4bb15ecabae28f4d2e18983c244eddd767f560165563bf9aefbc8d"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f13cae8cc389a440def0c8c52057f37359014ccbc9dc1f0827936bcd367c6100"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e560628513ed34759456a416bf86b54b2476c59144a9138165c9a1575801d0d9"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1674e4307fa3024fc897ca774e9c7562c957af85df55efe2988ed9056dc4e57"}, + {file = "google_crc32c-1.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:278d2ed7c16cfc075c91378c4f47924c0625f5fc84b2d50d921b18b7975bd210"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d5280312b9af0976231f9e317c20e4a61cd2f9629b7bfea6a693d1878a264ebd"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:8b87e1a59c38f275c0e3676fc2ab6d59eccecfd460be267ac360cc31f7bcde96"}, + {file = "google_crc32c-1.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7c074fece789b5034b9b1404a1f8208fc2d4c6ce9decdd16e8220c5a793e6f61"}, + {file = "google_crc32c-1.5.0-cp39-cp39-win32.whl", hash = "sha256:7f57f14606cd1dd0f0de396e1e53824c371e9544a822648cd76c034d209b559c"}, + {file = "google_crc32c-1.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:a2355cba1f4ad8b6988a4ca3feed5bff33f6af2d7f134852cf279c2aebfde541"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f314013e7dcd5cf45ab1945d92e713eec788166262ae8deb2cfacd53def27325"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3b747a674c20a67343cb61d43fdd9207ce5da6a99f629c6e2541aa0e89215bcd"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f24ed114432de109aa9fd317278518a5af2d31ac2ea6b952b2f7782b43da091"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8667b48e7a7ef66afba2c81e1094ef526388d35b873966d8a9a447974ed9178"}, + {file = "google_crc32c-1.5.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:1c7abdac90433b09bad6c43a43af253e688c9cfc1c86d332aed13f9a7c7f65e2"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6f998db4e71b645350b9ac28a2167e6632c239963ca9da411523bb439c5c514d"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c99616c853bb585301df6de07ca2cadad344fd1ada6d62bb30aec05219c45d2"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ad40e31093a4af319dadf503b2467ccdc8f67c72e4bcba97f8c10cb078207b5"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd67cf24a553339d5062eff51013780a00d6f97a39ca062781d06b3a73b15462"}, + {file = "google_crc32c-1.5.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:398af5e3ba9cf768787eef45c803ff9614cc3e22a5b2f7d7ae116df8b11e3314"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b1f8133c9a275df5613a451e73f36c2aea4fe13c5c8997e22cf355ebd7bd0728"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9ba053c5f50430a3fcfd36f75aff9caeba0440b2d076afdb79a318d6ca245f88"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:272d3892a1e1a2dbc39cc5cde96834c236d5327e2122d3aaa19f6614531bb6eb"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:635f5d4dd18758a1fbd1049a8e8d2fee4ffed124462d837d1a02a0e009c3ab31"}, + {file = "google_crc32c-1.5.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c672d99a345849301784604bfeaeba4db0c7aae50b95be04dd651fd2a7310b93"}, +] [package.extras] testing = ["pytest"] [[package]] name = "google-resumable-media" -version = "1.2.0" +version = "2.6.0" description = "Utilities for Google Media Downloads and Resumable Uploads" -category = "main" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*" +python-versions = ">= 3.7" +files = [ + {file = "google-resumable-media-2.6.0.tar.gz", hash = "sha256:972852f6c65f933e15a4a210c2b96930763b47197cdf4aa5f5bea435efb626e7"}, + {file = "google_resumable_media-2.6.0-py2.py3-none-any.whl", hash = "sha256:fc03d344381970f79eebb632a3c18bb1828593a2dc5572b5f90115ef7d11e81b"}, +] [package.dependencies] -google-crc32c = {version = ">=1.0,<2.0dev", markers = "python_version >= \"3.5\""} -six = "*" +google-crc32c = ">=1.0,<2.0dev" [package.extras] -aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)"] +aiohttp = ["aiohttp (>=3.6.2,<4.0.0dev)", "google-auth (>=1.22.0,<2.0dev)"] requests = ["requests (>=2.18.0,<3.0.0dev)"] [[package]] name = "googleapis-common-protos" -version = "1.52.0" +version = "1.61.0" description = "Common protobufs used in Google APIs" -category = "main" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +python-versions = ">=3.7" +files = [ + {file = "googleapis-common-protos-1.61.0.tar.gz", hash = "sha256:8a64866a97f6304a7179873a465d6eee97b7a24ec6cfd78e0f575e96b821240b"}, + {file = "googleapis_common_protos-1.61.0-py2.py3-none-any.whl", hash = "sha256:22f1915393bb3245343f6efe87f6fe868532efc12aa26b391b15132e1279f1c0"}, +] [package.dependencies] -protobuf = ">=3.6.0" +protobuf = ">=3.19.5,<3.20.0 || >3.20.0,<3.20.1 || >3.20.1,<4.21.1 || >4.21.1,<4.21.2 || >4.21.2,<4.21.3 || >4.21.3,<4.21.4 || >4.21.4,<4.21.5 || >4.21.5,<5.0.0.dev0" [package.extras] -grpc = ["grpcio (>=1.0.0)"] +grpc = ["grpcio (>=1.44.0,<2.0.0.dev0)"] [[package]] name = "grpcio" -version = "1.35.0" +version = "1.59.2" description = "HTTP/2-based RPC framework" -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "grpcio-1.59.2-cp310-cp310-linux_armv7l.whl", hash = "sha256:d2fa68a96a30dd240be80bbad838a0ac81a61770611ff7952b889485970c4c71"}, + {file = "grpcio-1.59.2-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:cf0dead5a2c5a3347af2cfec7131d4f2a2e03c934af28989c9078f8241a491fa"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:e420ced29b5904cdf9ee5545e23f9406189d8acb6750916c2db4793dada065c6"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b230028a008ae1d0f430acb227d323ff8a619017415cf334c38b457f814119f"}, + {file = "grpcio-1.59.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a4a3833c0e067f3558538727235cd8a49709bff1003200bbdefa2f09334e4b1"}, + {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6b25ed37c27e652db01be341af93fbcea03d296c024d8a0e680017a268eb85dd"}, + {file = "grpcio-1.59.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:73abb8584b0cf74d37f5ef61c10722adc7275502ab71789a8fe3cb7ef04cf6e2"}, + {file = "grpcio-1.59.2-cp310-cp310-win32.whl", hash = "sha256:d6f70406695e3220f09cd7a2f879333279d91aa4a8a1d34303b56d61a8180137"}, + {file = "grpcio-1.59.2-cp310-cp310-win_amd64.whl", hash = "sha256:3c61d641d4f409c5ae46bfdd89ea42ce5ea233dcf69e74ce9ba32b503c727e29"}, + {file = "grpcio-1.59.2-cp311-cp311-linux_armv7l.whl", hash = "sha256:3059668df17627f0e0fa680e9ef8c995c946c792612e9518f5cc1503be14e90b"}, + {file = "grpcio-1.59.2-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:72ca2399097c0b758198f2ff30f7178d680de8a5cfcf3d9b73a63cf87455532e"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:c978f864b35f2261e0819f5cd88b9830b04dc51bcf055aac3c601e525a10d2ba"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9411e24328a2302e279e70cae6e479f1fddde79629fcb14e03e6d94b3956eabf"}, + {file = "grpcio-1.59.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bb7e0fe6ad73b7f06d7e2b689c19a71cf5cc48f0c2bf8608469e51ffe0bd2867"}, + {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c2504eed520958a5b77cc99458297cb7906308cb92327f35fb7fbbad4e9b2188"}, + {file = "grpcio-1.59.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:2171c39f355ba5b551c5d5928d65aa6c69807fae195b86ef4a7d125bcdb860a9"}, + {file = "grpcio-1.59.2-cp311-cp311-win32.whl", hash = "sha256:d2794f0e68b3085d99b4f6ff9c089f6fdd02b32b9d3efdfbb55beac1bf22d516"}, + {file = "grpcio-1.59.2-cp311-cp311-win_amd64.whl", hash = "sha256:2067274c88bc6de89c278a672a652b4247d088811ece781a4858b09bdf8448e3"}, + {file = "grpcio-1.59.2-cp312-cp312-linux_armv7l.whl", hash = "sha256:535561990e075fa6bd4b16c4c3c1096b9581b7bb35d96fac4650f1181e428268"}, + {file = "grpcio-1.59.2-cp312-cp312-macosx_10_10_universal2.whl", hash = "sha256:a213acfbf186b9f35803b52e4ca9addb153fc0b67f82a48f961be7000ecf6721"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_aarch64.whl", hash = "sha256:6959fb07e8351e20501ffb8cc4074c39a0b7ef123e1c850a7f8f3afdc3a3da01"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e82c5cf1495244adf5252f925ac5932e5fd288b3e5ab6b70bec5593074b7236c"}, + {file = "grpcio-1.59.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023088764012411affe7db183d1ada3ad9daf2e23ddc719ff46d7061de661340"}, + {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:da2d94c15f88cd40d7e67f7919d4f60110d2b9d5b1e08cf354c2be773ab13479"}, + {file = "grpcio-1.59.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6009386a2df66159f64ac9f20425ae25229b29b9dd0e1d3dd60043f037e2ad7e"}, + {file = "grpcio-1.59.2-cp312-cp312-win32.whl", hash = "sha256:75c6ecb70e809cf1504465174343113f51f24bc61e22a80ae1c859f3f7034c6d"}, + {file = "grpcio-1.59.2-cp312-cp312-win_amd64.whl", hash = "sha256:cbe946b3e6e60a7b4618f091e62a029cb082b109a9d6b53962dd305087c6e4fd"}, + {file = "grpcio-1.59.2-cp37-cp37m-linux_armv7l.whl", hash = "sha256:f8753a6c88d1d0ba64302309eecf20f70d2770f65ca02d83c2452279085bfcd3"}, + {file = "grpcio-1.59.2-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:f1ef0d39bc1feb420caf549b3c657c871cad4ebbcf0580c4d03816b0590de0cf"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:4c93f4abbb54321ee6471e04a00139c80c754eda51064187963ddf98f5cf36a4"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08d77e682f2bf730a4961eea330e56d2f423c6a9b91ca222e5b1eb24a357b19f"}, + {file = "grpcio-1.59.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ff16d68bf453275466a9a46739061a63584d92f18a0f5b33d19fc97eb69867c"}, + {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4abb717e320e74959517dc8e84a9f48fbe90e9abe19c248541e9418b1ce60acd"}, + {file = "grpcio-1.59.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:36f53c2b3449c015880e7d55a89c992c357f176327b0d2873cdaaf9628a37c69"}, + {file = "grpcio-1.59.2-cp37-cp37m-win_amd64.whl", hash = "sha256:cc3e4cd087f07758b16bef8f31d88dbb1b5da5671d2f03685ab52dece3d7a16e"}, + {file = "grpcio-1.59.2-cp38-cp38-linux_armv7l.whl", hash = "sha256:27f879ae604a7fcf371e59fba6f3ff4635a4c2a64768bd83ff0cac503142fef4"}, + {file = "grpcio-1.59.2-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:7cf05053242f61ba94014dd3a986e11a083400a32664058f80bf4cf817c0b3a1"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:e1727c1c0e394096bb9af185c6923e8ea55a5095b8af44f06903bcc0e06800a2"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5d573e70a6fe77555fb6143c12d3a7d3fa306632a3034b4e7c59ca09721546f8"}, + {file = "grpcio-1.59.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31176aa88f36020055ace9adff2405a33c8bdbfa72a9c4980e25d91b2f196873"}, + {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11168ef43e4a43ff1b1a65859f3e0ef1a173e277349e7fb16923ff108160a8cd"}, + {file = "grpcio-1.59.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:53c9aa5ddd6857c0a1cd0287225a2a25873a8e09727c2e95c4aebb1be83a766a"}, + {file = "grpcio-1.59.2-cp38-cp38-win32.whl", hash = "sha256:3b4368b33908f683a363f376dfb747d40af3463a6e5044afee07cf9436addf96"}, + {file = "grpcio-1.59.2-cp38-cp38-win_amd64.whl", hash = "sha256:0a754aff9e3af63bdc4c75c234b86b9d14e14a28a30c4e324aed1a9b873d755f"}, + {file = "grpcio-1.59.2-cp39-cp39-linux_armv7l.whl", hash = "sha256:1f9524d1d701e399462d2c90ba7c193e49d1711cf429c0d3d97c966856e03d00"}, + {file = "grpcio-1.59.2-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:f93dbf58f03146164048be5426ffde298b237a5e059144847e4940f5b80172c3"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:6da6dea3a1bacf99b3c2187e296db9a83029ed9c38fd4c52b7c9b7326d13c828"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5f09cffa619adfb44799fa4a81c2a1ad77c887187613fb0a8f201ab38d89ba1"}, + {file = "grpcio-1.59.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c35aa9657f5d5116d23b934568e0956bd50c615127810fffe3ac356a914c176a"}, + {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:74100fecaec8a535e380cf5f2fb556ff84957d481c13e54051c52e5baac70541"}, + {file = "grpcio-1.59.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:128e20f57c5f27cb0157e73756d1586b83c1b513ebecc83ea0ac37e4b0e4e758"}, + {file = "grpcio-1.59.2-cp39-cp39-win32.whl", hash = "sha256:686e975a5d16602dc0982c7c703948d17184bd1397e16c8ee03511ecb8c4cdda"}, + {file = "grpcio-1.59.2-cp39-cp39-win_amd64.whl", hash = "sha256:242adc47725b9a499ee77c6a2e36688fa6c96484611f33b1be4c57ab075a92dd"}, + {file = "grpcio-1.59.2.tar.gz", hash = "sha256:d8f9cd4ad1be90b0cf350a2f04a38a36e44a026cac1e036ac593dc48efe91d52"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.59.2)"] + +[[package]] +name = "grpcio-status" +version = "1.59.2" +description = "Status proto mapping for gRPC" +optional = false +python-versions = ">=3.6" +files = [ + {file = "grpcio-status-1.59.2.tar.gz", hash = "sha256:a2c2b146e66b73ba80d021ab34fce5db4dd9be67ca4566cda40d36b185ce54f4"}, + {file = "grpcio_status-1.59.2-py3-none-any.whl", hash = "sha256:24bdf3b3b83b9112f43bd0626f82510d12cc1d919a45028ac20eb6919218e508"}, +] [package.dependencies] -six = ">=1.5.2" +googleapis-common-protos = ">=1.5.5" +grpcio = ">=1.59.2" +protobuf = ">=4.21.6" -[package.extras] -protobuf = ["grpcio-tools (>=1.35.0)"] +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] [[package]] name = "html2text" version = "2020.1.16" description = "Turn HTML into equivalent Markdown-structured text." -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "html2text-2020.1.16-py3-none-any.whl", hash = "sha256:c7c629882da0cf377d66f073329ccf34a12ed2adf0169b9285ae4e63ef54c82b"}, + {file = "html2text-2020.1.16.tar.gz", hash = "sha256:e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb"}, +] [[package]] -name = "idna" -version = "2.8" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" +name = "httpcore" +version = "1.0.1" +description = "A minimal low-level HTTP client." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" +files = [ + {file = "httpcore-1.0.1-py3-none-any.whl", hash = "sha256:c5e97ef177dca2023d0b9aad98e49507ef5423e9f1d94ffe2cfe250aa28e63b0"}, + {file = "httpcore-1.0.1.tar.gz", hash = "sha256:fce1ddf9b606cfb98132ab58865c3728c52c8e4c3c46e2aabb3674464a186e92"}, +] + +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.23.0)"] [[package]] -name = "idna-ssl" -version = "1.1.0" -description = "Patch ssl.match_hostname for Unicode(idna) domains support" -category = "main" +name = "httpx" +version = "0.25.1" +description = "The next generation HTTP client." optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "httpx-0.25.1-py3-none-any.whl", hash = "sha256:fec7d6cc5c27c578a391f7e87b9aa7d3d8fbcd034f6399f9f79b45bcc12a866a"}, + {file = "httpx-0.25.1.tar.gz", hash = "sha256:ffd96d5cf901e63863d9f1b4b6807861dbea4d301613415d9e6e57ead15fc5d0"}, +] [package.dependencies] -idna = ">=2.0" +anyio = "*" +certifi = "*" +httpcore = "*" +idna = "*" +sniffio = "*" -[[package]] -name = "ifaddr" -version = "0.1.7" -description = "Cross-platform network interface and IP address enumeration library" -category = "dev" -optional = false -python-versions = "*" +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] [[package]] -name = "importlib-metadata" -version = "3.4.0" -description = "Read metadata from Python packages" -category = "main" +name = "identify" +version = "2.5.31" +description = "File identification library for Python" optional = false -python-versions = ">=3.6" - -[package.dependencies] -typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} -zipp = ">=0.5" +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.31-py2.py3-none-any.whl", hash = "sha256:90199cb9e7bd3c5407a9b7e81b4abec4bb9d249991c79439ec8af740afc6293d"}, + {file = "identify-2.5.31.tar.gz", hash = "sha256:7736b3c7a28233637e3c36550646fc6389bedd74ae84cb788200cc8e2dd60b75"}, +] [package.extras] -docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] +license = ["ukkonen"] [[package]] -name = "iniconfig" -version = "1.1.1" -description = "iniconfig: brain-dead simple config-ini parsing" -category = "dev" +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = "*" +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] -name = "ipython-genutils" -version = "0.2.0" -description = "Vestigial utilities from IPython" -category = "main" +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] [[package]] name = "jinja2" -version = "2.11.3" +version = "3.1.2" description = "A very fast and expressive template engine." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, + {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, +] [package.dependencies] -MarkupSafe = ">=0.23" +MarkupSafe = ">=2.0" [package.extras] -i18n = ["Babel (>=0.8)"] +i18n = ["Babel (>=2.7)"] [[package]] name = "jsonschema" -version = "3.2.0" +version = "4.19.2" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.19.2-py3-none-any.whl", hash = "sha256:eee9e502c788e89cb166d4d37f43084e3b64ab405c795c03d343a4dbc2c810fc"}, + {file = "jsonschema-4.19.2.tar.gz", hash = "sha256:c9ff4d7447eed9592c23a12ccee508baf0dd0d59650615e847feb6cdca74f392"}, +] [package.dependencies] -attrs = ">=17.4.0" -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} -pyrsistent = ">=0.14.0" -six = ">=1.11.0" +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" [package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] [[package]] -name = "jupyter-core" -version = "4.7.1" -description = "Jupyter core package. A base package on which Jupyter projects rely." -category = "main" +name = "jsonschema-specifications" +version = "2023.7.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, + {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, +] [package.dependencies] -pywin32 = {version = ">=1.0", markers = "sys_platform == \"win32\""} -traitlets = "*" - -[[package]] -name = "lazy-object-proxy" -version = "1.4.3" -description = "A fast and thorough lazy object proxy." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +referencing = ">=0.28.0" [[package]] -name = "liccheck" -version = "0.4.3" -description = "Check python packages from requirement.txt and report issues" -category = "dev" +name = "jupyter-core" +version = "5.5.0" +description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false -python-versions = ">=2.7" +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.5.0-py3-none-any.whl", hash = "sha256:e11e02cd8ae0a9de5c6c44abf5727df9f2581055afe00b22183f621ba3585805"}, + {file = "jupyter_core-5.5.0.tar.gz", hash = "sha256:880b86053bf298a8724994f95e99b99130659022a4f7f45f563084b6223861d3"}, +] [package.dependencies] -configparser = {version = "*", markers = "python_version >= \"3.4\""} -semantic_version = "*" -toml = "*" +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] [[package]] name = "lxml" -version = "4.5.2" +version = "4.9.3" description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, != 3.4.*" +files = [ + {file = "lxml-4.9.3-cp27-cp27m-macosx_11_0_x86_64.whl", hash = "sha256:b0a545b46b526d418eb91754565ba5b63b1c0b12f9bd2f808c852d9b4b2f9b5c"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:075b731ddd9e7f68ad24c635374211376aa05a281673ede86cbe1d1b3455279d"}, + {file = "lxml-4.9.3-cp27-cp27m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:1e224d5755dba2f4a9498e150c43792392ac9b5380aa1b845f98a1618c94eeef"}, + {file = "lxml-4.9.3-cp27-cp27m-win32.whl", hash = "sha256:2c74524e179f2ad6d2a4f7caf70e2d96639c0954c943ad601a9e146c76408ed7"}, + {file = "lxml-4.9.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4f1026bc732b6a7f96369f7bfe1a4f2290fb34dce00d8644bc3036fb351a4ca1"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c0781a98ff5e6586926293e59480b64ddd46282953203c76ae15dbbbf302e8bb"}, + {file = "lxml-4.9.3-cp27-cp27mu-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:cef2502e7e8a96fe5ad686d60b49e1ab03e438bd9123987994528febd569868e"}, + {file = "lxml-4.9.3-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:b86164d2cff4d3aaa1f04a14685cbc072efd0b4f99ca5708b2ad1b9b5988a991"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:42871176e7896d5d45138f6d28751053c711ed4d48d8e30b498da155af39aebd"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:ae8b9c6deb1e634ba4f1930eb67ef6e6bf6a44b6eb5ad605642b2d6d5ed9ce3c"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:411007c0d88188d9f621b11d252cce90c4a2d1a49db6c068e3c16422f306eab8"}, + {file = "lxml-4.9.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:cd47b4a0d41d2afa3e58e5bf1f62069255aa2fd6ff5ee41604418ca925911d76"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e2cb47860da1f7e9a5256254b74ae331687b9672dfa780eed355c4c9c3dbd23"}, + {file = "lxml-4.9.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:1247694b26342a7bf47c02e513d32225ededd18045264d40758abeb3c838a51f"}, + {file = "lxml-4.9.3-cp310-cp310-win32.whl", hash = "sha256:cdb650fc86227eba20de1a29d4b2c1bfe139dc75a0669270033cb2ea3d391b85"}, + {file = "lxml-4.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:97047f0d25cd4bcae81f9ec9dc290ca3e15927c192df17331b53bebe0e3ff96d"}, + {file = "lxml-4.9.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:1f447ea5429b54f9582d4b955f5f1985f278ce5cf169f72eea8afd9502973dd5"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:57d6ba0ca2b0c462f339640d22882acc711de224d769edf29962b09f77129cbf"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:9767e79108424fb6c3edf8f81e6730666a50feb01a328f4a016464a5893f835a"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:71c52db65e4b56b8ddc5bb89fb2e66c558ed9d1a74a45ceb7dcb20c191c3df2f"}, + {file = "lxml-4.9.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d73d8ecf8ecf10a3bd007f2192725a34bd62898e8da27eb9d32a58084f93962b"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a3d3487f07c1d7f150894c238299934a2a074ef590b583103a45002035be120"}, + {file = "lxml-4.9.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e28c51fa0ce5674be9f560c6761c1b441631901993f76700b1b30ca6c8378d6"}, + {file = "lxml-4.9.3-cp311-cp311-win32.whl", hash = "sha256:0bfd0767c5c1de2551a120673b72e5d4b628737cb05414f03c3277bf9bed3305"}, + {file = "lxml-4.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:25f32acefac14ef7bd53e4218fe93b804ef6f6b92ffdb4322bb6d49d94cad2bc"}, + {file = "lxml-4.9.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:d3ff32724f98fbbbfa9f49d82852b159e9784d6094983d9a8b7f2ddaebb063d4"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:48d6ed886b343d11493129e019da91d4039826794a3e3027321c56d9e71505be"}, + {file = "lxml-4.9.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:9a92d3faef50658dd2c5470af249985782bf754c4e18e15afb67d3ab06233f13"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b4e4bc18382088514ebde9328da057775055940a1f2e18f6ad2d78aa0f3ec5b9"}, + {file = "lxml-4.9.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fc9b106a1bf918db68619fdcd6d5ad4f972fdd19c01d19bdb6bf63f3589a9ec5"}, + {file = "lxml-4.9.3-cp312-cp312-win_amd64.whl", hash = "sha256:d37017287a7adb6ab77e1c5bee9bcf9660f90ff445042b790402a654d2ad81d8"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:56dc1f1ebccc656d1b3ed288f11e27172a01503fc016bcabdcbc0978b19352b7"}, + {file = "lxml-4.9.3-cp35-cp35m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:578695735c5a3f51569810dfebd05dd6f888147a34f0f98d4bb27e92b76e05c2"}, + {file = "lxml-4.9.3-cp35-cp35m-win32.whl", hash = "sha256:704f61ba8c1283c71b16135caf697557f5ecf3e74d9e453233e4771d68a1f42d"}, + {file = "lxml-4.9.3-cp35-cp35m-win_amd64.whl", hash = "sha256:c41bfca0bd3532d53d16fd34d20806d5c2b1ace22a2f2e4c0008570bf2c58833"}, + {file = "lxml-4.9.3-cp36-cp36m-macosx_11_0_x86_64.whl", hash = "sha256:64f479d719dc9f4c813ad9bb6b28f8390360660b73b2e4beb4cb0ae7104f1c12"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:dd708cf4ee4408cf46a48b108fb9427bfa00b9b85812a9262b5c668af2533ea5"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c31c7462abdf8f2ac0577d9f05279727e698f97ecbb02f17939ea99ae8daa98"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e3cd95e10c2610c360154afdc2f1480aea394f4a4f1ea0a5eacce49640c9b190"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:4930be26af26ac545c3dffb662521d4e6268352866956672231887d18f0eaab2"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4aec80cde9197340bc353d2768e2a75f5f60bacda2bab72ab1dc499589b3878c"}, + {file = "lxml-4.9.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:14e019fd83b831b2e61baed40cab76222139926b1fb5ed0e79225bc0cae14584"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:0c0850c8b02c298d3c7006b23e98249515ac57430e16a166873fc47a5d549287"}, + {file = "lxml-4.9.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aca086dc5f9ef98c512bac8efea4483eb84abbf926eaeedf7b91479feb092458"}, + {file = "lxml-4.9.3-cp36-cp36m-win32.whl", hash = "sha256:50baa9c1c47efcaef189f31e3d00d697c6d4afda5c3cde0302d063492ff9b477"}, + {file = "lxml-4.9.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bef4e656f7d98aaa3486d2627e7d2df1157d7e88e7efd43a65aa5dd4714916cf"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:46f409a2d60f634fe550f7133ed30ad5321ae2e6630f13657fb9479506b00601"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:4c28a9144688aef80d6ea666c809b4b0e50010a2aca784c97f5e6bf143d9f129"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:141f1d1a9b663c679dc524af3ea1773e618907e96075262726c7612c02b149a4"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:53ace1c1fd5a74ef662f844a0413446c0629d151055340e9893da958a374f70d"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:17a753023436a18e27dd7769e798ce302963c236bc4114ceee5b25c18c52c693"}, + {file = "lxml-4.9.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7d298a1bd60c067ea75d9f684f5f3992c9d6766fadbc0bcedd39750bf344c2f4"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:081d32421db5df44c41b7f08a334a090a545c54ba977e47fd7cc2deece78809a"}, + {file = "lxml-4.9.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:23eed6d7b1a3336ad92d8e39d4bfe09073c31bfe502f20ca5116b2a334f8ec02"}, + {file = "lxml-4.9.3-cp37-cp37m-win32.whl", hash = "sha256:1509dd12b773c02acd154582088820893109f6ca27ef7291b003d0e81666109f"}, + {file = "lxml-4.9.3-cp37-cp37m-win_amd64.whl", hash = "sha256:120fa9349a24c7043854c53cae8cec227e1f79195a7493e09e0c12e29f918e52"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4d2d1edbca80b510443f51afd8496be95529db04a509bc8faee49c7b0fb6d2cc"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:8d7e43bd40f65f7d97ad8ef5c9b1778943d02f04febef12def25f7583d19baac"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:71d66ee82e7417828af6ecd7db817913cb0cf9d4e61aa0ac1fde0583d84358db"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:6fc3c450eaa0b56f815c7b62f2b7fba7266c4779adcf1cece9e6deb1de7305ce"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65299ea57d82fb91c7f019300d24050c4ddeb7c5a190e076b5f48a2b43d19c42"}, + {file = "lxml-4.9.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:eadfbbbfb41b44034a4c757fd5d70baccd43296fb894dba0295606a7cf3124aa"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:3e9bdd30efde2b9ccfa9cb5768ba04fe71b018a25ea093379c857c9dad262c40"}, + {file = "lxml-4.9.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:fcdd00edfd0a3001e0181eab3e63bd5c74ad3e67152c84f93f13769a40e073a7"}, + {file = "lxml-4.9.3-cp38-cp38-win32.whl", hash = "sha256:57aba1bbdf450b726d58b2aea5fe47c7875f5afb2c4a23784ed78f19a0462574"}, + {file = "lxml-4.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:92af161ecbdb2883c4593d5ed4815ea71b31fafd7fd05789b23100d081ecac96"}, + {file = "lxml-4.9.3-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:9bb6ad405121241e99a86efff22d3ef469024ce22875a7ae045896ad23ba2340"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8ed74706b26ad100433da4b9d807eae371efaa266ffc3e9191ea436087a9d6a7"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:fbf521479bcac1e25a663df882c46a641a9bff6b56dc8b0fafaebd2f66fb231b"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:303bf1edce6ced16bf67a18a1cf8339d0db79577eec5d9a6d4a80f0fb10aa2da"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:5515edd2a6d1a5a70bfcdee23b42ec33425e405c5b351478ab7dc9347228f96e"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:690dafd0b187ed38583a648076865d8c229661ed20e48f2335d68e2cf7dc829d"}, + {file = "lxml-4.9.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6420a005548ad52154c8ceab4a1290ff78d757f9e5cbc68f8c77089acd3c432"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bb3bb49c7a6ad9d981d734ef7c7193bc349ac338776a0360cc671eaee89bcf69"}, + {file = "lxml-4.9.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:d27be7405547d1f958b60837dc4c1007da90b8b23f54ba1f8b728c78fdb19d50"}, + {file = "lxml-4.9.3-cp39-cp39-win32.whl", hash = "sha256:8df133a2ea5e74eef5e8fc6f19b9e085f758768a16e9877a60aec455ed2609b2"}, + {file = "lxml-4.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:4dd9a263e845a72eacb60d12401e37c616438ea2e5442885f65082c276dfb2b2"}, + {file = "lxml-4.9.3-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6689a3d7fd13dc687e9102a27e98ef33730ac4fe37795d5036d18b4d527abd35"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:f6bdac493b949141b733c5345b6ba8f87a226029cbabc7e9e121a413e49441e0"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:05186a0f1346ae12553d66df1cfce6f251589fea3ad3da4f3ef4e34b2d58c6a3"}, + {file = "lxml-4.9.3-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c2006f5c8d28dee289f7020f721354362fa304acbaaf9745751ac4006650254b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-macosx_11_0_x86_64.whl", hash = "sha256:5c245b783db29c4e4fbbbfc9c5a78be496c9fea25517f90606aa1f6b2b3d5f7b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:4fb960a632a49f2f089d522f70496640fdf1218f1243889da3822e0a9f5f3ba7"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:50670615eaf97227d5dc60de2dc99fb134a7130d310d783314e7724bf163f75d"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9719fe17307a9e814580af1f5c6e05ca593b12fb7e44fe62450a5384dbf61b4b"}, + {file = "lxml-4.9.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:3331bece23c9ee066e0fb3f96c61322b9e0f54d775fccefff4c38ca488de283a"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-macosx_11_0_x86_64.whl", hash = "sha256:ed667f49b11360951e201453fc3967344d0d0263aa415e1619e85ae7fd17b4e0"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_24_i686.whl", hash = "sha256:8b77946fd508cbf0fccd8e400a7f71d4ac0e1595812e66025bac475a8e811694"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:e4da8ca0c0c0aea88fd46be8e44bd49716772358d648cce45fe387f7b92374a7"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:fe4bda6bd4340caa6e5cf95e73f8fea5c4bfc55763dd42f1b50a94c1b4a2fbd4"}, + {file = "lxml-4.9.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f3df3db1d336b9356dd3112eae5f5c2b8b377f3bc826848567f10bfddfee77e9"}, + {file = "lxml-4.9.3.tar.gz", hash = "sha256:48628bd53a426c9eb9bc066a923acaa0878d1e86129fd5359aee99285f4eed9c"}, +] [package.extras] cssselect = ["cssselect (>=0.7)"] html5 = ["html5lib"] -htmlsoup = ["beautifulsoup4"] -source = ["Cython (>=0.29.7)"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=0.29.35)"] [[package]] name = "markdown" -version = "3.3.3" -description = "Python implementation of Markdown." -category = "main" +version = "3.5.1" +description = "Python implementation of John Gruber's Markdown." optional = false -python-versions = ">=3.6" - -[package.dependencies] -importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.5.1-py3-none-any.whl", hash = "sha256:5874b47d4ee3f0b14d764324d2c94c03ea66bee56f2d929da9f2508d65e722dc"}, + {file = "Markdown-3.5.1.tar.gz", hash = "sha256:b65d7beb248dc22f2e8a31fb706d93798093c308dc1aba295aedeb9d41a813bd"}, +] [package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] testing = ["coverage", "pyyaml"] [[package]] name = "markupsafe" -version = "1.1.1" +version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] [[package]] name = "mbstrdecoder" -version = "1.0.1" -description = "multi-byte character string decoder" -category = "main" +version = "1.1.3" +description = "mbstrdecoder is a Python library for multi-byte character string decoder" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "mbstrdecoder-1.1.3-py3-none-any.whl", hash = "sha256:d66c1ed3f2dc4e7c5d87cd44a75be10bc5af4250f95b38bbaedd7851308ce938"}, + {file = "mbstrdecoder-1.1.3.tar.gz", hash = "sha256:dcfd2c759322eb44fe193a9e0b1b86c5b87f3ec5ea8e1bb43b3e9ae423f1e8fe"}, +] [package.dependencies] -chardet = ">=3.0.4,<5" +chardet = ">=3.0.4,<6" [package.extras] test = ["Faker (>=1.0.2)", "pytest (>=6.0.1)", "pytest-md-report (>=0.1)"] -[[package]] -name = "more-itertools" -version = "8.7.0" -description = "More routines for operating on iterables, beyond itertools" -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "msgfy" -version = "0.1.0" -description = "msgfy is a Python library for convert Exception instance to a human-readable error message." -category = "main" -optional = false -python-versions = ">=3.5" - -[package.extras] -test = ["pytest"] - [[package]] name = "multidict" -version = "4.7.6" +version = "6.0.4" description = "multidict implementation" -category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "mypy" +version = "1.6.1" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e5012e5cc2ac628177eaac0e83d622b2dd499e28253d4107a08ecc59ede3fc2c"}, + {file = "mypy-1.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d8fbb68711905f8912e5af474ca8b78d077447d8f3918997fecbf26943ff3cbb"}, + {file = "mypy-1.6.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21a1ad938fee7d2d96ca666c77b7c494c3c5bd88dff792220e1afbebb2925b5e"}, + {file = "mypy-1.6.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b96ae2c1279d1065413965c607712006205a9ac541895004a1e0d4f281f2ff9f"}, + {file = "mypy-1.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:40b1844d2e8b232ed92e50a4bd11c48d2daa351f9deee6c194b83bf03e418b0c"}, + {file = "mypy-1.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:81af8adaa5e3099469e7623436881eff6b3b06db5ef75e6f5b6d4871263547e5"}, + {file = "mypy-1.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8c223fa57cb154c7eab5156856c231c3f5eace1e0bed9b32a24696b7ba3c3245"}, + {file = "mypy-1.6.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8032e00ce71c3ceb93eeba63963b864bf635a18f6c0c12da6c13c450eedb183"}, + {file = "mypy-1.6.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4c46b51de523817a0045b150ed11b56f9fff55f12b9edd0f3ed35b15a2809de0"}, + {file = "mypy-1.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:19f905bcfd9e167159b3d63ecd8cb5e696151c3e59a1742e79bc3bcb540c42c7"}, + {file = "mypy-1.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:82e469518d3e9a321912955cc702d418773a2fd1e91c651280a1bda10622f02f"}, + {file = "mypy-1.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d4473c22cc296425bbbce7e9429588e76e05bc7342da359d6520b6427bf76660"}, + {file = "mypy-1.6.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59a0d7d24dfb26729e0a068639a6ce3500e31d6655df8557156c51c1cb874ce7"}, + {file = "mypy-1.6.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cfd13d47b29ed3bbaafaff7d8b21e90d827631afda134836962011acb5904b71"}, + {file = "mypy-1.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:eb4f18589d196a4cbe5290b435d135dee96567e07c2b2d43b5c4621b6501531a"}, + {file = "mypy-1.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:41697773aa0bf53ff917aa077e2cde7aa50254f28750f9b88884acea38a16169"}, + {file = "mypy-1.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7274b0c57737bd3476d2229c6389b2ec9eefeb090bbaf77777e9d6b1b5a9d143"}, + {file = "mypy-1.6.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbaf4662e498c8c2e352da5f5bca5ab29d378895fa2d980630656178bd607c46"}, + {file = "mypy-1.6.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bb8ccb4724f7d8601938571bf3f24da0da791fe2db7be3d9e79849cb64e0ae85"}, + {file = "mypy-1.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:68351911e85145f582b5aa6cd9ad666c8958bcae897a1bfda8f4940472463c45"}, + {file = "mypy-1.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:49ae115da099dcc0922a7a895c1eec82c1518109ea5c162ed50e3b3594c71208"}, + {file = "mypy-1.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8b27958f8c76bed8edaa63da0739d76e4e9ad4ed325c814f9b3851425582a3cd"}, + {file = "mypy-1.6.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:925cd6a3b7b55dfba252b7c4561892311c5358c6b5a601847015a1ad4eb7d332"}, + {file = "mypy-1.6.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8f57e6b6927a49550da3d122f0cb983d400f843a8a82e65b3b380d3d7259468f"}, + {file = "mypy-1.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:a43ef1c8ddfdb9575691720b6352761f3f53d85f1b57d7745701041053deff30"}, + {file = "mypy-1.6.1-py3-none-any.whl", hash = "sha256:4cbe68ef919c28ea561165206a2dcb68591c50f3bcf777932323bc208d949cf1"}, + {file = "mypy-1.6.1.tar.gz", hash = "sha256:4d01c00d09a0be62a4ca3f933e315455bde83f37f892ba4b08ce92f3cf44bcc1"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +typing-extensions = ">=4.1.0" -[[package]] -name = "mypy-extensions" -version = "0.4.3" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "main" -optional = false -python-versions = "*" +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +reports = ["lxml"] [[package]] -name = "navio-builder-win" -version = "0.1.52" -description = "navio-builder, but doesn't import sh and works on windows." -category = "main" +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." optional = false -python-versions = "*" - -[package.dependencies] -sh = "*" +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] [[package]] name = "nbformat" -version = "5.1.2" +version = "5.9.2" description = "The Jupyter Notebook format" -category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" +files = [ + {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, + {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, +] [package.dependencies] -ipython-genutils = "*" -jsonschema = ">=2.4,<2.5.0 || >2.5.0" +fastjsonschema = "*" +jsonschema = ">=2.6" jupyter-core = "*" -traitlets = ">=4.1" +traitlets = ">=5.1" [package.extras] -fast = ["fastjsonschema"] -test = ["check-manifest", "fastjsonschema", "testpath", "pytest", "pytest-cov"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] [[package]] -name = "packaging" -version = "20.9" -description = "Core utilities for Python packages" -category = "main" +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] [package.dependencies] -pyparsing = ">=2.0.2" +setuptools = "*" [[package]] -name = "paramiko" -version = "2.7.2" -description = "SSH2 protocol library" -category = "dev" +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" optional = false -python-versions = "*" - -[package.dependencies] -bcrypt = ">=3.1.3" -cryptography = ">=2.5" -pynacl = ">=1.0.1" - -[package.extras] -all = ["pyasn1 (>=0.1.7)", "pynacl (>=1.0.1)", "bcrypt (>=3.1.3)", "invoke (>=1.3)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] -ed25519 = ["pynacl (>=1.0.1)", "bcrypt (>=3.1.3)"] -gssapi = ["pyasn1 (>=0.1.7)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] -invoke = ["invoke (>=1.3)"] +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] [[package]] name = "pathspec" -version = "0.8.1" +version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] [[package]] name = "pathvalidate" -version = "2.3.2" +version = "3.2.0" description = "pathvalidate is a Python library to sanitize/validate a string such as filenames/file-paths/etc." -category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "pathvalidate-3.2.0-py3-none-any.whl", hash = "sha256:cc593caa6299b22b37f228148257997e2fa850eea2daf7e4cc9205cef6908dee"}, + {file = "pathvalidate-3.2.0.tar.gz", hash = "sha256:5e8378cf6712bff67fbe7a8307d99fa8c1a0cb28aa477056f8fc374f0dff24ad"}, +] [package.extras] -test = ["allpairspy", "click", "faker", "pytest (>=6.0.1)", "pytest-md-report (>=0.0.12)", "pytest-discord (>=0.0.5)"] - -[[package]] -name = "pebble" -version = "4.5.0" -description = "Threading and multiprocessing eye-candy." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "pip-check" -version = "2.6" -description = "Display installed pip packages and their update status.." -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -colorclass = "*" -terminaltables = "*" +docs = ["Sphinx (>=2.4)", "sphinx-rtd-theme (>=1.2.2)", "urllib3 (<2)"] +test = ["Faker (>=1.0.8)", "allpairspy (>=2)", "click (>=6.2)", "pytest (>=6.0.1)", "pytest-discord (>=0.1.4)", "pytest-md-report (>=0.4.1)"] [[package]] name = "pip-upgrader" version = "1.4.15" description = "An interactive pip requirements upgrader. It also updates the version in your requirements.txt file." -category = "main" optional = false python-versions = "*" +files = [ + {file = "pip_upgrader-1.4.15-py2.py3-none-any.whl", hash = "sha256:7ddfdfa3b6664469c00b50d23f3ed082d61b16babd0729f9d52090add54abdca"}, + {file = "pip_upgrader-1.4.15.tar.gz", hash = "sha256:ec07b93e06825d9cf40f475a8e021fc9d288446b479b40cb9aba406a6db65347"}, +] [package.dependencies] colorclass = "*" @@ -865,384 +1602,391 @@ requests = "*" terminaltables = "*" [package.extras] -test = ["coverage", "pytest", "pytest-cov", "pytest-pep8", "mock", "responses"] +test = ["coverage", "mock", "pytest", "pytest-cov", "pytest-pep8", "responses"] [[package]] name = "pipreqs" -version = "0.4.10" +version = "0.4.13" description = "Pip requirements.txt generator based on imports in project" -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "pipreqs-0.4.13-py2.py3-none-any.whl", hash = "sha256:e522b9ed54aa3e8b7978ff251ab7a9af2f75d2cd8de4c102e881b666a79a308e"}, + {file = "pipreqs-0.4.13.tar.gz", hash = "sha256:a17f167880b6921be37533ce4c81ddc6e22b465c107aad557db43b1add56a99b"}, +] [package.dependencies] docopt = "*" yarg = "*" +[[package]] +name = "platformdirs" +version = "3.11.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.11.0-py3-none-any.whl", hash = "sha256:e9d171d00af68be50e9202731309c4e658fd8bc76f55c11c7dd760d023bda68e"}, + {file = "platformdirs-3.11.0.tar.gz", hash = "sha256:cf8ee52a3afdb965072dcc652433e0c7e3e40cf5ea1477cd4b3b1d2eb75495b3"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + [[package]] name = "pluggy" -version = "0.13.1" +version = "1.3.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] [package.extras] dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] -name = "proto-plus" -version = "1.13.0" -description = "Beautiful, Pythonic protocol buffers." -category = "main" +name = "pre-commit" +version = "3.5.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"}, + {file = "pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"}, +] [package.dependencies] -protobuf = ">=3.12.0" - -[package.extras] -testing = ["google-api-core[grpc] (>=1.22.2)"] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" [[package]] -name = "protobuf" -version = "3.14.0" -description = "Protocol Buffers" -category = "main" +name = "prettytable" +version = "3.9.0" +description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "prettytable-3.9.0-py3-none-any.whl", hash = "sha256:a71292ab7769a5de274b146b276ce938786f56c31cf7cea88b6f3775d82fe8c8"}, + {file = "prettytable-3.9.0.tar.gz", hash = "sha256:f4ed94803c23073a90620b201965e5dc0bccf1760b7a7eaf3158cab8aaffdf34"}, +] [package.dependencies] -six = ">=1.9" +wcwidth = "*" + +[package.extras] +tests = ["pytest", "pytest-cov", "pytest-lazy-fixture"] [[package]] -name = "psutil" -version = "5.6.7" -description = "Cross-platform lib for process and system monitoring in Python." -category = "dev" +name = "proto-plus" +version = "1.22.3" +description = "Beautiful, Pythonic protocol buffers." optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.6" +files = [ + {file = "proto-plus-1.22.3.tar.gz", hash = "sha256:fdcd09713cbd42480740d2fe29c990f7fbd885a67efc328aa8be6ee3e9f76a6b"}, + {file = "proto_plus-1.22.3-py3-none-any.whl", hash = "sha256:a49cd903bc0b6ab41f76bf65510439d56ca76f868adf0274e738bfdd096894df"}, +] + +[package.dependencies] +protobuf = ">=3.19.0,<5.0.0dev" [package.extras] -enum = ["enum34"] +testing = ["google-api-core[grpc] (>=1.31.5)"] + +[[package]] +name = "protobuf" +version = "4.25.0" +description = "" +optional = false +python-versions = ">=3.8" +files = [ + {file = "protobuf-4.25.0-cp310-abi3-win32.whl", hash = "sha256:5c1203ac9f50e4853b0a0bfffd32c67118ef552a33942982eeab543f5c634395"}, + {file = "protobuf-4.25.0-cp310-abi3-win_amd64.whl", hash = "sha256:c40ff8f00aa737938c5378d461637d15c442a12275a81019cc2fef06d81c9419"}, + {file = "protobuf-4.25.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:cf21faba64cd2c9a3ed92b7a67f226296b10159dbb8fbc5e854fc90657d908e4"}, + {file = "protobuf-4.25.0-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:32ac2100b0e23412413d948c03060184d34a7c50b3e5d7524ee96ac2b10acf51"}, + {file = "protobuf-4.25.0-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:683dc44c61f2620b32ce4927de2108f3ebe8ccf2fd716e1e684e5a50da154054"}, + {file = "protobuf-4.25.0-cp38-cp38-win32.whl", hash = "sha256:1a3ba712877e6d37013cdc3476040ea1e313a6c2e1580836a94f76b3c176d575"}, + {file = "protobuf-4.25.0-cp38-cp38-win_amd64.whl", hash = "sha256:b2cf8b5d381f9378afe84618288b239e75665fe58d0f3fd5db400959274296e9"}, + {file = "protobuf-4.25.0-cp39-cp39-win32.whl", hash = "sha256:63714e79b761a37048c9701a37438aa29945cd2417a97076048232c1df07b701"}, + {file = "protobuf-4.25.0-cp39-cp39-win_amd64.whl", hash = "sha256:d94a33db8b7ddbd0af7c467475fb9fde0c705fb315a8433c0e2020942b863a1f"}, + {file = "protobuf-4.25.0-py3-none-any.whl", hash = "sha256:1a53d6f64b00eecf53b65ff4a8c23dc95df1fa1e97bb06b8122e5a64f49fc90a"}, + {file = "protobuf-4.25.0.tar.gz", hash = "sha256:68f7caf0d4f012fd194a301420cf6aa258366144d814f358c5b32558228afa7c"}, +] [[package]] name = "pur" -version = "5.3.0" +version = "7.3.1" description = "Update packages in a requirements.txt file to latest versions." -category = "main" optional = false python-versions = "*" +files = [ + {file = "pur-7.3.1.tar.gz", hash = "sha256:ac693e4c1b7c8fa376b198ce797488befa65f0965ce13b4a8659fd44113a24ba"}, +] [package.dependencies] -click = ">=0.7" - -[[package]] -name = "py" -version = "1.10.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +click = ">=8.0.0" [[package]] name = "py-stackexchange" version = "2.2.7" description = "A Python binding to the StackExchange (Stack Overflow, Server Fault, etc.) website APIs." -category = "main" optional = false python-versions = "*" +files = [ + {file = "py-stackexchange-2.2.7.tar.gz", hash = "sha256:848bf85d98b95706750c61572fc2a2677cb8566e96b078bbe6261f0e2d8252b4"}, +] [package.dependencies] six = ">=1.8.0" [[package]] name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" -category = "main" +version = "0.5.0" +description = "Pure-Python implementation of ASN.1 types and DER/BER/CER codecs (X.208)" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1-0.5.0-py2.py3-none-any.whl", hash = "sha256:87a2121042a1ac9358cabcaf1d07680ff97ee6404333bacca15f76aa8ad01a57"}, + {file = "pyasn1-0.5.0.tar.gz", hash = "sha256:97b7290ca68e62a832558ec3976f15cbf911bf5d7c7039d8b861c2a0ece69fde"}, +] [[package]] name = "pyasn1-modules" -version = "0.2.8" -description = "A collection of ASN.1-based protocols modules." -category = "main" +version = "0.3.0" +description = "A collection of ASN.1-based protocols modules" optional = false -python-versions = "*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "pyasn1_modules-0.3.0-py2.py3-none-any.whl", hash = "sha256:d3ccd6ed470d9ffbc716be08bd90efbd44d0734bc9303818f7336070984a162d"}, + {file = "pyasn1_modules-0.3.0.tar.gz", hash = "sha256:5bd01446b736eb9d31512a30d46c1ac3395d676c6f3cafa4c03eb54b9925631c"}, +] [package.dependencies] -pyasn1 = ">=0.4.6,<0.5.0" - -[[package]] -name = "pycparser" -version = "2.20" -description = "C parser in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +pyasn1 = ">=0.4.6,<0.6.0" [[package]] name = "pyflakes" -version = "2.2.0" -description = "passive checker of Python programs" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pygments" -version = "2.8.0" -description = "Pygments is a syntax highlighting package written in Python." -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "pynacl" -version = "1.4.0" -description = "Python binding to the Networking and Cryptography (NaCl) library" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.dependencies] -cffi = ">=1.4.1" -six = "*" - -[package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] -tests = ["pytest (>=3.2.1,!=3.3.0)", "hypothesis (>=3.27.0)"] - -[[package]] -name = "pynt" -version = "0.8.2" -description = "Lightweight Python Build Tool." -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "pynt-contrib" -version = "0.2.0" -description = "Common pynt tasks." -category = "dev" +version = "3.1.0" +description = "passive checker of Python programs" optional = false -python-versions = "*" - -[package.dependencies] -pynt = ">=0.8.1" +python-versions = ">=3.8" +files = [ + {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"}, + {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"}, +] [[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "main" +name = "pygments" +version = "2.16.1" +description = "Pygments is a syntax highlighting package written in Python." optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, +] + +[package.extras] +plugins = ["importlib-metadata"] [[package]] name = "pypinfo" -version = "18.0.1" +version = "21.0.0" description = "View PyPI download statistics with ease." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "pypinfo-21.0.0-py3-none-any.whl", hash = "sha256:1b37ecee9d187b9d5e2b3e3389ddba29884ba02fbd1a61303ea739c9f23dbce7"}, + {file = "pypinfo-21.0.0.tar.gz", hash = "sha256:4a500a989977de2f2ea2b05e4d84a5a0caef7d43dffbe40ab581cbf60cc78293"}, +] [package.dependencies] -appdirs = "*" binary = "*" click = "*" -google-cloud-bigquery = ">=0.29.0" +google-cloud-bigquery = ">=2.11.0" +packaging = ">=16.2" +platformdirs = "*" tinydb = ">=4" tinyrecord = ">=0.2.0" [[package]] name = "pypistats" -version = "0.12.1" +version = "1.5.0" description = "Python interface to PyPI Stats API https://pypistats.org/api" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "pypistats-1.5.0-py3-none-any.whl", hash = "sha256:0a453772e946ec9b0b568afdf901fdcae083ab3cd61392b12e8c2ccc8ddf59d7"}, + {file = "pypistats-1.5.0.tar.gz", hash = "sha256:ed2660d8a073572f5254eaaeec4e031f7e6f837ee386fe9792f8085126d32e9d"}, +] [package.dependencies] -appdirs = "*" -pytablewriter = {version = ">=0.48", extras = ["html"]} +httpx = ">=0.19" +platformdirs = "*" +prettytable = ">=2.4" +pytablewriter = {version = ">=0.63", extras = ["html"]} python-dateutil = "*" python-slugify = "*" -requests = "*" +termcolor = ">=2.1" [package.extras] numpy = ["numpy"] pandas = ["pandas"] -tests = ["freezegun", "pytest", "pytest-cov", "requests-mock"] +tests = ["freezegun", "pytest", "pytest-cov", "respx (>=0.11)"] + +[[package]] +name = "pyproject-api" +version = "1.6.1" +description = "API to interact with the python pyproject.toml based projects" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pyproject_api-1.6.1-py3-none-any.whl", hash = "sha256:4c0116d60476b0786c88692cf4e325a9814965e2469c5998b830bba16b183675"}, + {file = "pyproject_api-1.6.1.tar.gz", hash = "sha256:1817dc018adc0d1ff9ca1ed8c60e1623d5aaca40814b953af14a9cf9a5cae538"}, +] + +[package.dependencies] +packaging = ">=23.1" + +[package.extras] +docs = ["furo (>=2023.8.19)", "sphinx (<7.2)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "setuptools (>=68.1.2)", "wheel (>=0.41.2)"] [[package]] name = "pyrankvote" -version = "2.0.2" +version = "2.0.6" description = "PyRankVote is a python library for different ranked voting methods, like instant-runoff voting, single transferable vote and preferential block voting, created by Jon Tingvold." -category = "main" optional = false python-versions = "*" +files = [ + {file = "pyrankvote-2.0.6-py3-none-any.whl", hash = "sha256:9199080b842d9885f948623a7bfab9c2245c544ed0eb711189e5e2021a38f19c"}, + {file = "pyrankvote-2.0.6.tar.gz", hash = "sha256:93b39a0f010d8647bc60a94d2136271cc6979b626a2607ad185368fc505fa142"}, +] [package.dependencies] tabulate = "*" -[[package]] -name = "pyrsistent" -version = "0.17.3" -description = "Persistent/Functional/Immutable data structures" -category = "main" -optional = false -python-versions = ">=3.5" - [[package]] name = "pytablewriter" -version = "0.58.0" -description = "pytablewriter is a Python library to write a table in various formats: CSV / Elasticsearch / HTML / JavaScript / JSON / LaTeX / LDJSON / LTSV / Markdown / MediaWiki / NumPy / Excel / Pandas / Python / reStructuredText / SQLite / TOML / TSV / YAML." -category = "main" +version = "1.2.0" +description = "pytablewriter is a Python library to write a table in various formats: AsciiDoc / CSV / Elasticsearch / HTML / JavaScript / JSON / LaTeX / LDJSON / LTSV / Markdown / MediaWiki / NumPy / Excel / Pandas / Python / reStructuredText / SQLite / TOML / TSV / YAML." optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "pytablewriter-1.2.0-py3-none-any.whl", hash = "sha256:4a30e2bb4bf5bc1069b1d2b2bc41947577c4517ab0875b23a5b194d296f543d8"}, + {file = "pytablewriter-1.2.0.tar.gz", hash = "sha256:0204a4bb684a22140d640f2599f09e137bcdc18b3dd49426f4a555016e246b46"}, +] [package.dependencies] -DataProperty = ">=0.50.0,<2" +DataProperty = ">=1.0.1,<2" dominate = {version = ">=2.1.5,<3", optional = true, markers = "extra == \"html\""} mbstrdecoder = ">=1.0.0,<2" -msgfy = ">=0.1.0,<1" -pathvalidate = ">=2.3.0,<3" -tabledata = ">=1.1.3,<2" +pathvalidate = ">=2.3.0,<4" +setuptools = ">=38.3.0" +tabledata = ">=1.3.1,<2" tcolorpy = ">=0.0.5,<1" -typepy = {version = ">=1.1.1,<2", extras = ["datetime"]} +typepy = {version = ">=1.3.2,<2", extras = ["datetime"]} [package.extras] -all = ["xlwt", "XlsxWriter (>=0.9.6,<2)", "elasticsearch (>=7.0.5,<8)", "pytablereader (>=0.30.0,<2)", "dominate (>=2.1.5,<3)", "loguru (>=0.4.1,<1)", "SimpleSQLite (>=1.1.3,<2)", "pytablewriter-altrow-theme (>=0.0.2,<1)", "toml (>=0.9.3,<1)", "PyYAML (>=3.11,<6)", "simplejson (>=3.8.1,<4)"] -docs = ["sphinx-rtd-theme", "Sphinx (>=2.4)"] -es = ["elasticsearch (>=7.0.5,<8)"] -es5 = ["elasticsearch (>=5.5.3,<6)"] -es6 = ["elasticsearch (>=6.3.1,<7)"] -es7 = ["elasticsearch (>=7.0.5,<8)"] -excel = ["xlwt", "XlsxWriter (>=0.9.6,<2)"] -from = ["pytablereader (>=0.30.0,<2)"] +all = ["PyYAML (>=3.11,<7)", "SimpleSQLite (>=1.3.2,<2)", "XlsxWriter (>=0.9.6,<4)", "dominate (>=2.1.5,<3)", "elasticsearch (>=8.0.1,<9)", "loguru (>=0.4.1,<1)", "pandas (>=0.25.3,<3)", "pytablereader (>=0.31.3,<2)", "pytablewriter-altcol-theme (>=0.1.0,<1)", "pytablewriter-altrow-theme (>=0.2.0,<1)", "simplejson (>=3.8.1,<4)", "toml (>=0.9.3,<1)", "xlwt"] +docs = ["PyYAML (>=3.11,<7)", "SimpleSQLite (>=1.3.2,<2)", "Sphinx (>=2.4)", "XlsxWriter (>=0.9.6,<4)", "dominate (>=2.1.5,<3)", "elasticsearch (>=8.0.1,<9)", "loguru (>=0.4.1,<1)", "pandas (>=0.25.3,<3)", "pytablereader (>=0.31.3,<2)", "pytablewriter-altcol-theme (>=0.1.0,<1)", "pytablewriter-altrow-theme (>=0.2.0,<1)", "simplejson (>=3.8.1,<4)", "sphinx-rtd-theme (>=1.2.2)", "toml (>=0.9.3,<1)", "xlwt"] +es = ["elasticsearch (>=8.0.1,<9)"] +es8 = ["elasticsearch (>=8.0.1,<9)"] +excel = ["XlsxWriter (>=0.9.6,<4)", "xlwt"] +from = ["pytablereader (>=0.31.3,<2)"] html = ["dominate (>=2.1.5,<3)"] logging = ["loguru (>=0.4.1,<1)"] -sqlite = ["SimpleSQLite (>=1.1.3,<2)"] -test = ["XlsxWriter (>=0.9.6,<2)", "SimpleSQLite (>=1.1.3,<2)", "pytablereader (>=0.30.0,<2)", "pytest-md-report (>=0.1)", "pytest-discord (>=0.0.5)", "dominate (>=2.1.5,<3)", "loguru (>=0.4.1,<1)", "toml (>=0.9.3,<1)", "tablib", "elasticsearch (>=7.0.5,<8)", "pytest (>=6.0.1)", "sqliteschema", "xlwt", "pytablereader[sqlite,excel] (>=0.29)", "PyYAML (>=3.11,<6)", "simplejson (>=3.8.1,<4)", "pytablewriter-altrow-theme (>=0.0.2,<1)"] -theme = ["pytablewriter-altrow-theme (>=0.0.2,<1)"] +pandas = ["pandas (>=0.25.3,<3)"] +sqlite = ["SimpleSQLite (>=1.3.2,<2)"] +test = ["PyYAML (>=3.11,<7)", "SimpleSQLite (>=1.3.2,<2)", "XlsxWriter (>=0.9.6,<4)", "beautifulsoup4 (>=4.10)", "dominate (>=2.1.5,<3)", "elasticsearch (>=8.0.1,<9)", "loguru (>=0.4.1,<1)", "pandas (>=0.25.3,<3)", "pytablereader (>=0.31.3,<2)", "pytablereader[excel,sqlite] (>=0.31.3)", "pytablewriter-altcol-theme (>=0.1.0,<1)", "pytablewriter-altrow-theme (>=0.2.0,<1)", "pytest (>=6.0.1)", "pytest-md-report (>=0.4.1)", "simplejson (>=3.8.1,<4)", "sqliteschema (>=1.3.0)", "tablib (>=3.2.0)", "toml (>=0.9.3,<1)", "xlwt"] +theme = ["pytablewriter-altcol-theme (>=0.1.0,<1)", "pytablewriter-altrow-theme (>=0.2.0,<1)"] toml = ["toml (>=0.9.3,<1)"] -yaml = ["PyYAML (>=3.11,<6)"] +yaml = ["PyYAML (>=3.11,<7)"] [[package]] name = "pytest" -version = "6.0.1" +version = "7.4.3" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.3-py3-none-any.whl", hash = "sha256:0d009c083ea859a71b76adf7c1d502e4bc170b80a8ef002da5806527b9591fac"}, + {file = "pytest-7.4.3.tar.gz", hash = "sha256:d989d136982de4e3b29dabcc838ad581c64e8ed52c11fbe86ddebd9da0818cd5"}, +] [package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=17.4.0" colorama = {version = "*", markers = "sys_platform == \"win32\""} -importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} iniconfig = "*" -more-itertools = ">=4.0.0" packaging = "*" -pluggy = ">=0.12,<1.0" -py = ">=1.8.2" -toml = "*" +pluggy = ">=0.12,<2.0" [package.extras] -checkqa_mypy = ["mypy (==0.780)"] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] [[package]] name = "pytest-cov" -version = "2.11.1" +version = "4.1.0" description = "Pytest plugin for measuring coverage." -category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] [package.dependencies] -coverage = ">=5.2.1" +coverage = {version = ">=5.2.1", extras = ["toml"]} pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests (==2.0.2)", "six", "pytest-xdist", "virtualenv"] - -[[package]] -name = "pytest-forked" -version = "1.3.0" -description = "run tests in isolated forked subprocesses" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.dependencies] -py = "*" -pytest = ">=3.10" - -[[package]] -name = "pytest-timeout" -version = "1.4.2" -description = "py.test plugin to abort hanging tests" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -pytest = ">=3.6.0" - -[[package]] -name = "pytest-xdist" -version = "2.2.1" -description = "pytest xdist plugin for distributed testing and loop-on-failing modes" -category = "dev" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -execnet = ">=1.1" -pytest = ">=6.0.0" -pytest-forked = "*" - -[package.extras] -psutil = ["psutil (>=3.0)"] -testing = ["filelock"] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] [[package]] name = "python-dateutil" -version = "2.8.1" +version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] [package.dependencies] six = ">=1.5" [[package]] name = "python-dotenv" -version = "0.11.0" -description = "Add .env support to your django/flask apps in development and deployments" -category = "main" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] [package.extras] cli = ["click (>=5.0)"] [[package]] name = "python-slugify" -version = "4.0.1" -description = "A Python Slugify application that handles Unicode" -category = "main" +version = "8.0.1" +description = "A Python slugify application that also handles Unicode" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" +files = [ + {file = "python-slugify-8.0.1.tar.gz", hash = "sha256:ce0d46ddb668b3be82f4ed5e503dbc33dd815d83e2eb6824211310d3fb172a27"}, + {file = "python_slugify-8.0.1-py2.py3-none-any.whl", hash = "sha256:70ca6ea68fe63ecc8fa4fcf00ae651fc8a5d02d93dcd12ae6d4fc7ca46c4d395"}, +] [package.dependencies] text-unidecode = ">=1.3" @@ -1252,214 +1996,436 @@ unidecode = ["Unidecode (>=1.1.1)"] [[package]] name = "pytz" -version = "2021.1" +version = "2023.3.post1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] [[package]] name = "pyupgrade" -version = "2.0.2" +version = "3.15.0" description = "A tool to automatically upgrade syntax for newer versions." -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8.1" +files = [ + {file = "pyupgrade-3.15.0-py2.py3-none-any.whl", hash = "sha256:8dc8ebfaed43566e2c65994162795017c7db11f531558a74bc8aa077907bc305"}, + {file = "pyupgrade-3.15.0.tar.gz", hash = "sha256:a7fde381060d7c224f55aef7a30fae5ac93bbc428367d27e70a603bc2acd4f00"}, +] [package.dependencies] -tokenize-rt = ">=3.2.0" +tokenize-rt = ">=5.2.0" [[package]] name = "pywin32" -version = "300" +version = "306" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] [[package]] name = "pyyaml" -version = "5.4.1" +version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] [[package]] name = "random-names" -version = "0.1.0" +version = "0.2.0" description = "Convert int to random name, like tree_dance and convert it back to same int." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "random_names-0.2.0-py3-none-any.whl", hash = "sha256:ee9a052f8cc8627d7e0002c0f3eb047ff0f7a197e6ec7c082fe9bfb484117a31"}, + {file = "random_names-0.2.0.tar.gz", hash = "sha256:d61c65d75c72588c04d223bc688f1f4752d74a17611b277eae13a6b0890b3e4d"}, +] [[package]] -name = "regex" -version = "2020.11.13" -description = "Alternative regular expression module, to replace re." -category = "main" +name = "referencing" +version = "0.30.2" +description = "JSON Referencing + Python" optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, + {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" [[package]] name = "requests" -version = "2.22.0" +version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] [package.dependencies] certifi = ">=2017.4.17" -chardet = ">=3.0.2,<3.1.0" -idna = ">=2.5,<2.9" -urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" [package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)"] -socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rpds-py" +version = "0.10.6" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.10.6-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:6bdc11f9623870d75692cc33c59804b5a18d7b8a4b79ef0b00b773a27397d1f6"}, + {file = "rpds_py-0.10.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:26857f0f44f0e791f4a266595a7a09d21f6b589580ee0585f330aaccccb836e3"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7f5e15c953ace2e8dde9824bdab4bec50adb91a5663df08d7d994240ae6fa31"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:61fa268da6e2e1cd350739bb61011121fa550aa2545762e3dc02ea177ee4de35"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c48f3fbc3e92c7dd6681a258d22f23adc2eb183c8cb1557d2fcc5a024e80b094"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0503c5b681566e8b722fe8c4c47cce5c7a51f6935d5c7012c4aefe952a35eed"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:734c41f9f57cc28658d98270d3436dba65bed0cfc730d115b290e970150c540d"}, + {file = "rpds_py-0.10.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a5d7ed104d158c0042a6a73799cf0eb576dfd5fc1ace9c47996e52320c37cb7c"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e3df0bc35e746cce42579826b89579d13fd27c3d5319a6afca9893a9b784ff1b"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:73e0a78a9b843b8c2128028864901f55190401ba38aae685350cf69b98d9f7c9"}, + {file = "rpds_py-0.10.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5ed505ec6305abd2c2c9586a7b04fbd4baf42d4d684a9c12ec6110deefe2a063"}, + {file = "rpds_py-0.10.6-cp310-none-win32.whl", hash = "sha256:d97dd44683802000277bbf142fd9f6b271746b4846d0acaf0cefa6b2eaf2a7ad"}, + {file = "rpds_py-0.10.6-cp310-none-win_amd64.whl", hash = "sha256:b455492cab07107bfe8711e20cd920cc96003e0da3c1f91297235b1603d2aca7"}, + {file = "rpds_py-0.10.6-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:e8cdd52744f680346ff8c1ecdad5f4d11117e1724d4f4e1874f3a67598821069"}, + {file = "rpds_py-0.10.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:66414dafe4326bca200e165c2e789976cab2587ec71beb80f59f4796b786a238"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc435d059f926fdc5b05822b1be4ff2a3a040f3ae0a7bbbe672babb468944722"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8e7f2219cb72474571974d29a191714d822e58be1eb171f229732bc6fdedf0ac"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3953c6926a63f8ea5514644b7afb42659b505ece4183fdaaa8f61d978754349e"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2bb2e4826be25e72013916eecd3d30f66fd076110de09f0e750163b416500721"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bf347b495b197992efc81a7408e9a83b931b2f056728529956a4d0858608b80"}, + {file = "rpds_py-0.10.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:102eac53bb0bf0f9a275b438e6cf6904904908562a1463a6fc3323cf47d7a532"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40f93086eef235623aa14dbddef1b9fb4b22b99454cb39a8d2e04c994fb9868c"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e22260a4741a0e7a206e175232867b48a16e0401ef5bce3c67ca5b9705879066"}, + {file = "rpds_py-0.10.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f4e56860a5af16a0fcfa070a0a20c42fbb2012eed1eb5ceeddcc7f8079214281"}, + {file = "rpds_py-0.10.6-cp311-none-win32.whl", hash = "sha256:0774a46b38e70fdde0c6ded8d6d73115a7c39d7839a164cc833f170bbf539116"}, + {file = "rpds_py-0.10.6-cp311-none-win_amd64.whl", hash = "sha256:4a5ee600477b918ab345209eddafde9f91c0acd931f3776369585a1c55b04c57"}, + {file = "rpds_py-0.10.6-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:5ee97c683eaface61d38ec9a489e353d36444cdebb128a27fe486a291647aff6"}, + {file = "rpds_py-0.10.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0713631d6e2d6c316c2f7b9320a34f44abb644fc487b77161d1724d883662e31"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5a53f5998b4bbff1cb2e967e66ab2addc67326a274567697379dd1e326bded7"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a555ae3d2e61118a9d3e549737bb4a56ff0cec88a22bd1dfcad5b4e04759175"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:945eb4b6bb8144909b203a88a35e0a03d22b57aefb06c9b26c6e16d72e5eb0f0"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:52c215eb46307c25f9fd2771cac8135d14b11a92ae48d17968eda5aa9aaf5071"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1b3cd23d905589cb205710b3988fc8f46d4a198cf12862887b09d7aaa6bf9b9"}, + {file = "rpds_py-0.10.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:64ccc28683666672d7c166ed465c09cee36e306c156e787acef3c0c62f90da5a"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:516a611a2de12fbea70c78271e558f725c660ce38e0006f75139ba337d56b1f6"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9ff93d3aedef11f9c4540cf347f8bb135dd9323a2fc705633d83210d464c579d"}, + {file = "rpds_py-0.10.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d858532212f0650be12b6042ff4378dc2efbb7792a286bee4489eaa7ba010586"}, + {file = "rpds_py-0.10.6-cp312-none-win32.whl", hash = "sha256:3c4eff26eddac49d52697a98ea01b0246e44ca82ab09354e94aae8823e8bda02"}, + {file = "rpds_py-0.10.6-cp312-none-win_amd64.whl", hash = "sha256:150eec465dbc9cbca943c8e557a21afdcf9bab8aaabf386c44b794c2f94143d2"}, + {file = "rpds_py-0.10.6-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:cf693eb4a08eccc1a1b636e4392322582db2a47470d52e824b25eca7a3977b53"}, + {file = "rpds_py-0.10.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4134aa2342f9b2ab6c33d5c172e40f9ef802c61bb9ca30d21782f6e035ed0043"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e782379c2028a3611285a795b89b99a52722946d19fc06f002f8b53e3ea26ea9"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2f6da6d842195fddc1cd34c3da8a40f6e99e4a113918faa5e60bf132f917c247"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b4a9fe992887ac68256c930a2011255bae0bf5ec837475bc6f7edd7c8dfa254e"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b788276a3c114e9f51e257f2a6f544c32c02dab4aa7a5816b96444e3f9ffc336"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:caa1afc70a02645809c744eefb7d6ee8fef7e2fad170ffdeacca267fd2674f13"}, + {file = "rpds_py-0.10.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:bddd4f91eede9ca5275e70479ed3656e76c8cdaaa1b354e544cbcf94c6fc8ac4"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:775049dfa63fb58293990fc59473e659fcafd953bba1d00fc5f0631a8fd61977"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:c6c45a2d2b68c51fe3d9352733fe048291e483376c94f7723458cfd7b473136b"}, + {file = "rpds_py-0.10.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0699ab6b8c98df998c3eacf51a3b25864ca93dab157abe358af46dc95ecd9801"}, + {file = "rpds_py-0.10.6-cp38-none-win32.whl", hash = "sha256:ebdab79f42c5961682654b851f3f0fc68e6cc7cd8727c2ac4ffff955154123c1"}, + {file = "rpds_py-0.10.6-cp38-none-win_amd64.whl", hash = "sha256:24656dc36f866c33856baa3ab309da0b6a60f37d25d14be916bd3e79d9f3afcf"}, + {file = "rpds_py-0.10.6-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:0898173249141ee99ffcd45e3829abe7bcee47d941af7434ccbf97717df020e5"}, + {file = "rpds_py-0.10.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9e9184fa6c52a74a5521e3e87badbf9692549c0fcced47443585876fcc47e469"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5752b761902cd15073a527b51de76bbae63d938dc7c5c4ad1e7d8df10e765138"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:99a57006b4ec39dbfb3ed67e5b27192792ffb0553206a107e4aadb39c5004cd5"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:09586f51a215d17efdb3a5f090d7cbf1633b7f3708f60a044757a5d48a83b393"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e225a6a14ecf44499aadea165299092ab0cba918bb9ccd9304eab1138844490b"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b2039f8d545f20c4e52713eea51a275e62153ee96c8035a32b2abb772b6fc9e5"}, + {file = "rpds_py-0.10.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:34ad87a831940521d462ac11f1774edf867c34172010f5390b2f06b85dcc6014"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dcdc88b6b01015da066da3fb76545e8bb9a6880a5ebf89e0f0b2e3ca557b3ab7"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:25860ed5c4e7f5e10c496ea78af46ae8d8468e0be745bd233bab9ca99bfd2647"}, + {file = "rpds_py-0.10.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:7854a207ef77319ec457c1eb79c361b48807d252d94348305db4f4b62f40f7f3"}, + {file = "rpds_py-0.10.6-cp39-none-win32.whl", hash = "sha256:e6fcc026a3f27c1282c7ed24b7fcac82cdd70a0e84cc848c0841a3ab1e3dea2d"}, + {file = "rpds_py-0.10.6-cp39-none-win_amd64.whl", hash = "sha256:e98c4c07ee4c4b3acf787e91b27688409d918212dfd34c872201273fdd5a0e18"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:68fe9199184c18d997d2e4293b34327c0009a78599ce703e15cd9a0f47349bba"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3339eca941568ed52d9ad0f1b8eb9fe0958fa245381747cecf2e9a78a5539c42"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a360cfd0881d36c6dc271992ce1eda65dba5e9368575663de993eeb4523d895f"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:031f76fc87644a234883b51145e43985aa2d0c19b063e91d44379cd2786144f8"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f36a9d751f86455dc5278517e8b65580eeee37d61606183897f122c9e51cef3"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:052a832078943d2b2627aea0d19381f607fe331cc0eb5df01991268253af8417"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:023574366002bf1bd751ebaf3e580aef4a468b3d3c216d2f3f7e16fdabd885ed"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:defa2c0c68734f4a82028c26bcc85e6b92cced99866af118cd6a89b734ad8e0d"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:879fb24304ead6b62dbe5034e7b644b71def53c70e19363f3c3be2705c17a3b4"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:53c43e10d398e365da2d4cc0bcaf0854b79b4c50ee9689652cdc72948e86f487"}, + {file = "rpds_py-0.10.6-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:3777cc9dea0e6c464e4b24760664bd8831738cc582c1d8aacf1c3f546bef3f65"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:40578a6469e5d1df71b006936ce95804edb5df47b520c69cf5af264d462f2cbb"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:cf71343646756a072b85f228d35b1d7407da1669a3de3cf47f8bbafe0c8183a4"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:10f32b53f424fc75ff7b713b2edb286fdbfc94bf16317890260a81c2c00385dc"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:81de24a1c51cfb32e1fbf018ab0bdbc79c04c035986526f76c33e3f9e0f3356c"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ac17044876e64a8ea20ab132080ddc73b895b4abe9976e263b0e30ee5be7b9c2"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5e8a78bd4879bff82daef48c14d5d4057f6856149094848c3ed0ecaf49f5aec2"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78ca33811e1d95cac8c2e49cb86c0fb71f4d8409d8cbea0cb495b6dbddb30a55"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c63c3ef43f0b3fb00571cff6c3967cc261c0ebd14a0a134a12e83bdb8f49f21f"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:7fde6d0e00b2fd0dbbb40c0eeec463ef147819f23725eda58105ba9ca48744f4"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:79edd779cfc46b2e15b0830eecd8b4b93f1a96649bcb502453df471a54ce7977"}, + {file = "rpds_py-0.10.6-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:9164ec8010327ab9af931d7ccd12ab8d8b5dc2f4c6a16cbdd9d087861eaaefa1"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:d29ddefeab1791e3c751e0189d5f4b3dbc0bbe033b06e9c333dca1f99e1d523e"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:30adb75ecd7c2a52f5e76af50644b3e0b5ba036321c390b8e7ec1bb2a16dd43c"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd609fafdcdde6e67a139898196698af37438b035b25ad63704fd9097d9a3482"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6eef672de005736a6efd565577101277db6057f65640a813de6c2707dc69f396"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cf4393c7b41abbf07c88eb83e8af5013606b1cdb7f6bc96b1b3536b53a574b8"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad857f42831e5b8d41a32437f88d86ead6c191455a3499c4b6d15e007936d4cf"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d7360573f1e046cb3b0dceeb8864025aa78d98be4bb69f067ec1c40a9e2d9df"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d08f63561c8a695afec4975fae445245386d645e3e446e6f260e81663bfd2e38"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:f0f17f2ce0f3529177a5fff5525204fad7b43dd437d017dd0317f2746773443d"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:442626328600bde1d09dc3bb00434f5374948838ce75c41a52152615689f9403"}, + {file = "rpds_py-0.10.6-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e9616f5bd2595f7f4a04b67039d890348ab826e943a9bfdbe4938d0eba606971"}, + {file = "rpds_py-0.10.6.tar.gz", hash = "sha256:4ce5a708d65a8dbf3748d2474b580d606b1b9f91b5c6ab2a316e0b0cf7a4ba50"}, +] [[package]] name = "rsa" -version = "4.7" +version = "4.9" description = "Pure-Python RSA implementation" -category = "main" optional = false -python-versions = ">=3.5, <4" +python-versions = ">=3.6,<4" +files = [ + {file = "rsa-4.9-py3-none-any.whl", hash = "sha256:90260d9058e514786967344d0ef75fa8727eed8a7d2e43ce9f4bcf1b536174f7"}, + {file = "rsa-4.9.tar.gz", hash = "sha256:e38464a49c6c85d7f1351b0126661487a7e0a14a50f1675ec50eb34d4f20ef21"}, +] [package.dependencies] pyasn1 = ">=0.1.3" [[package]] -name = "safety" -version = "1.10.3" -description = "Checks installed dependencies for known vulnerabilities." -category = "main" -optional = false -python-versions = ">=3.5" - -[package.dependencies] -Click = ">=6.0" -dparse = ">=0.5.1" -packaging = "*" -requests = "*" +name = "ruff" +version = "0.1.3" +description = "An extremely fast Python linter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.1.3-py3-none-macosx_10_7_x86_64.whl", hash = "sha256:b46d43d51f7061652eeadb426a9e3caa1e0002470229ab2fc19de8a7b0766901"}, + {file = "ruff-0.1.3-py3-none-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:b8afeb9abd26b4029c72adc9921b8363374f4e7edb78385ffaa80278313a15f9"}, + {file = "ruff-0.1.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca3cf365bf32e9ba7e6db3f48a4d3e2c446cd19ebee04f05338bc3910114528b"}, + {file = "ruff-0.1.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4874c165f96c14a00590dcc727a04dca0cfd110334c24b039458c06cf78a672e"}, + {file = "ruff-0.1.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eec2dd31eed114e48ea42dbffc443e9b7221976554a504767ceaee3dd38edeb8"}, + {file = "ruff-0.1.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:dc3ec4edb3b73f21b4aa51337e16674c752f1d76a4a543af56d7d04e97769613"}, + {file = "ruff-0.1.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e3de9ed2e39160800281848ff4670e1698037ca039bda7b9274f849258d26ce"}, + {file = "ruff-0.1.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c595193881922cc0556a90f3af99b1c5681f0c552e7a2a189956141d8666fe8"}, + {file = "ruff-0.1.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f75e670d529aa2288cd00fc0e9b9287603d95e1536d7a7e0cafe00f75e0dd9d"}, + {file = "ruff-0.1.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:76dd49f6cd945d82d9d4a9a6622c54a994689d8d7b22fa1322983389b4892e20"}, + {file = "ruff-0.1.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:918b454bc4f8874a616f0d725590277c42949431ceb303950e87fef7a7d94cb3"}, + {file = "ruff-0.1.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:d8859605e729cd5e53aa38275568dbbdb4fe882d2ea2714c5453b678dca83784"}, + {file = "ruff-0.1.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:0b6c55f5ef8d9dd05b230bb6ab80bc4381ecb60ae56db0330f660ea240cb0d4a"}, + {file = "ruff-0.1.3-py3-none-win32.whl", hash = "sha256:3e7afcbdcfbe3399c34e0f6370c30f6e529193c731b885316c5a09c9e4317eef"}, + {file = "ruff-0.1.3-py3-none-win_amd64.whl", hash = "sha256:7a18df6638cec4a5bd75350639b2bb2a2366e01222825562c7346674bdceb7ea"}, + {file = "ruff-0.1.3-py3-none-win_arm64.whl", hash = "sha256:12fd53696c83a194a2db7f9a46337ce06445fb9aa7d25ea6f293cf75b21aca9f"}, + {file = "ruff-0.1.3.tar.gz", hash = "sha256:3ba6145369a151401d5db79f0a47d50e470384d0d89d0d6f7fab0b589ad07c34"}, +] [[package]] name = "search-engine-parser" -version = "0.6.2" +version = "0.6.8" description = "scrapes search engine pages for query titles, descriptions and links" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "search-engine-parser-0.6.8.tar.gz", hash = "sha256:26a28b9dee1ccf5f5c228dce697cc3c0dbe38cd68062c72d68da9a9ef434838f"}, + {file = "search_engine_parser-0.6.8-py3-none-any.whl", hash = "sha256:ef5e046a2059e90d199c116f69277f6008e384c10363e483d020abfa305e5c8a"}, +] [package.dependencies] -aiohttp = "3.6.2" -beautifulsoup4 = "4.9.1" -lxml = "4.5.2" +aiohttp = ">=3.6.2,<4" +beautifulsoup4 = ">=4.9.1,<5" +fake-useragent = ">=0.1.11,<0.2" +lxml = ">=4.6.5,<5" [package.extras] -cli = ["blessed (==1.15.0)"] +cli = ["blessed (>=1.15.0,<2)"] [[package]] -name = "semantic-version" -version = "2.8.5" -description = "A library implementing the 'SemVer' scheme." -category = "dev" +name = "setuptools" +version = "68.2.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" +files = [ + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, +] -[[package]] -name = "sh" -version = "1.14.1" -description = "Python subprocess replacement" -category = "main" -optional = false -python-versions = "*" +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" -version = "1.15.0" +version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] [[package]] name = "slpp-23" version = "1.1" description = "SLPP-23 is a simple lua-python data structures parser" -category = "main" optional = false python-versions = "*" +files = [ + {file = "SLPP-23-1.1.tar.gz", hash = "sha256:f49f710c3ebd4fd773af9ddca7311b522f151581447e4d3cb127034cd88bb485"}, + {file = "SLPP_23-1.1-py2.py3-none-any.whl", hash = "sha256:47a81bce829bdf4ef2b79d42b4847dcf5430d7c1682b6582161d5cead03c4106"}, +] [package.dependencies] six = "*" [[package]] -name = "smmap" -version = "3.0.5" -description = "A pure Python implementation of a sliding window memory map manager" -category = "dev" +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] [[package]] name = "soupsieve" -version = "1.9.6" +version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "sshtunnel" -version = "0.4.0" -description = "Pure python SSH tunnels" -category = "dev" optional = false -python-versions = "*" - -[package.dependencies] -paramiko = ">=2.7.2" - -[package.extras] -build_sphinx = ["sphinx", "sphinxcontrib-napoleon"] -dev = ["check-manifest"] -test = ["tox (>=1.8.1)"] +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] [[package]] name = "stackapi" -version = "0.1.12" +version = "0.3.0" description = "Library for interacting with the Stack Exchange API" -category = "main" optional = false python-versions = "*" +files = [ + {file = "StackAPI-0.3.0-py3-none-any.whl", hash = "sha256:217f494aae3b4f267a0e4f8565e1761c4e55ec30f0c5a50a205632a52ca28481"}, + {file = "StackAPI-0.3.0.tar.gz", hash = "sha256:4147c9587f1c719d1ff9e01a70216290766821f9f7c1401e47b60ee89c329288"}, +] [package.dependencies] requests = "*" +six = "*" [[package]] name = "stdlib-list" -version = "0.8.0" -description = "A list of Python Standard Libraries (2.6-7, 3.2-9)." -category = "main" +version = "0.9.0" +description = "A list of Python Standard Libraries (2.7 through 3.9)." optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "stdlib_list-0.9.0-py3-none-any.whl", hash = "sha256:f79957d59e41930d44afcd81e465f740b9a7a9828707a40e24ab1092b12bd423"}, + {file = "stdlib_list-0.9.0.tar.gz", hash = "sha256:98eb66135976c96b4ee3f4c0ef0552ebb5a9977ce3028433db79f4738b02af26"}, +] [package.extras] -develop = ["sphinx"] +dev = ["build", "stdlib-list[doc,lint,test]"] +doc = ["furo", "sphinx"] +lint = ["black", "mypy", "ruff"] +support = ["sphobjinv"] +test = ["coverage[toml]", "pytest", "pytest-cov"] [[package]] name = "tabledata" -version = "1.1.3" -description = "tabledata is a Python library to represent tabular data. Used for pytablewriter/pytablereader/SimpleSQLite." -category = "main" +version = "1.3.3" +description = "tabledata is a Python library to represent tabular data. Used for pytablewriter/pytablereader/SimpleSQLite/etc." optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "tabledata-1.3.3-py3-none-any.whl", hash = "sha256:4abad1c996d8607e23b045b44dc0c5f061668f3c37585302c5f6c84c93a89962"}, + {file = "tabledata-1.3.3.tar.gz", hash = "sha256:c90daaba9a408e4397934b3ff2f6c06797d5289676420bf520c741ad43e6ff91"}, +] [package.dependencies] -DataProperty = ">=0.50.0,<2" -typepy = ">=1.1.1,<2" +DataProperty = ">=1.0.1,<2" +typepy = ">=1.2.0,<2" [package.extras] logging = ["loguru (>=0.4.1,<1)"] @@ -1467,1249 +2433,407 @@ test = ["pytablewriter (>=0.46)", "pytest"] [[package]] name = "tabulate" -version = "0.8.7" +version = "0.9.0" description = "Pretty-print tabular data" -category = "main" optional = false -python-versions = "*" +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] [package.extras] widechars = ["wcwidth"] [[package]] name = "tcolorpy" -version = "0.0.8" +version = "0.1.4" description = "tcolopy is a Python library to apply true color for terminal text." -category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "tcolorpy-0.1.4-py3-none-any.whl", hash = "sha256:d0926480aa5012f34877d69fc3b670f207dc165674e68ad07458fa6ee5b12724"}, + {file = "tcolorpy-0.1.4.tar.gz", hash = "sha256:f0dceb1cb95e554cee63024b3cd2fd8d4628c568773de2d1e6b4f0478461901c"}, +] + +[package.extras] +test = ["pytest (>=6.0.1)", "pytest-md-report (>=0.4.1)"] + +[[package]] +name = "termcolor" +version = "2.3.0" +description = "ANSI color formatting for output in terminal" +optional = false +python-versions = ">=3.7" +files = [ + {file = "termcolor-2.3.0-py3-none-any.whl", hash = "sha256:3afb05607b89aed0ffe25202399ee0867ad4d3cb4180d98aaf8eefa6a5f7d475"}, + {file = "termcolor-2.3.0.tar.gz", hash = "sha256:b5b08f68937f138fe92f6c089b99f1e2da0ae56c52b78bf7075fd95420fd9a5a"}, +] [package.extras] -test = ["pytest", "pytest-md-report (>=0.1)"] +tests = ["pytest", "pytest-cov"] [[package]] name = "terminaltables" -version = "3.1.0" +version = "3.1.10" description = "Generate simple tables in terminals from a nested list of strings." -category = "main" optional = false -python-versions = "*" +python-versions = ">=2.6" +files = [ + {file = "terminaltables-3.1.10-py2.py3-none-any.whl", hash = "sha256:e4fdc4179c9e4aab5f674d80f09d76fa436b96fdc698a8505e0a36bf0804a874"}, + {file = "terminaltables-3.1.10.tar.gz", hash = "sha256:ba6eca5cb5ba02bba4c9f4f985af80c54ec3dccf94cfcd190154386255e47543"}, +] [[package]] name = "text-unidecode" version = "1.3" description = "The most basic Text::Unidecode port" -category = "main" optional = false python-versions = "*" +files = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] [[package]] name = "tinydb" -version = "4.4.0" +version = "4.8.0" description = "TinyDB is a tiny, document oriented database optimized for your happiness :)" -category = "main" optional = false -python-versions = ">=3.5,<4.0" +python-versions = ">=3.7,<4.0" +files = [ + {file = "tinydb-4.8.0-py3-none-any.whl", hash = "sha256:30c06d12383d7c332e404ca6a6103fb2b32cbf25712689648c39d9a6bd34bd3d"}, + {file = "tinydb-4.8.0.tar.gz", hash = "sha256:6dd686a9c5a75dfa9280088fd79a419aefe19cd7f4bd85eba203540ef856d564"}, +] [[package]] name = "tinyrecord" version = "0.2.0" description = "Atomic transactions for TinyDB" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "tinyrecord-0.2.0.tar.gz", hash = "sha256:eb6dc23601be359ee00f5a3d31a46adf3bad0a16f8d60af216cd67982ca75cf4"}, +] [[package]] name = "tokenize-rt" -version = "3.2.0" +version = "5.2.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.8" +files = [ + {file = "tokenize_rt-5.2.0-py2.py3-none-any.whl", hash = "sha256:b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289"}, + {file = "tokenize_rt-5.2.0.tar.gz", hash = "sha256:9fe80f8a5c1edad2d3ede0f37481cc0cc1538a2f442c9c2f9e4feacd2792d054"}, +] [[package]] name = "toml" version = "0.10.2" description = "Python Library for Tom's Obvious, Minimal Language" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] [[package]] -name = "traitlets" -version = "4.3.3" -description = "Traitlets Python config system" -category = "main" +name = "tox" +version = "4.11.3" +description = "tox is a generic virtualenv management and test command line tool" optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "tox-4.11.3-py3-none-any.whl", hash = "sha256:599af5e5bb0cad0148ac1558a0b66f8fff219ef88363483b8d92a81e4246f28f"}, + {file = "tox-4.11.3.tar.gz", hash = "sha256:5039f68276461fae6a9452a3b2c7295798f00a0e92edcd9a3b78ba1a73577951"}, +] [package.dependencies] -decorator = "*" -ipython-genutils = "*" -six = "*" +cachetools = ">=5.3.1" +chardet = ">=5.2" +colorama = ">=0.4.6" +filelock = ">=3.12.3" +packaging = ">=23.1" +platformdirs = ">=3.10" +pluggy = ">=1.3" +pyproject-api = ">=1.6.1" +virtualenv = ">=20.24.3" [package.extras] -test = ["pytest", "mock"] +docs = ["furo (>=2023.8.19)", "sphinx (>=7.2.4)", "sphinx-argparse-cli (>=1.11.1)", "sphinx-autodoc-typehints (>=1.24)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +testing = ["build[virtualenv] (>=0.10)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.1.1)", "devpi-process (>=1)", "diff-cover (>=7.7)", "distlib (>=0.3.7)", "flaky (>=3.7)", "hatch-vcs (>=0.3)", "hatchling (>=1.18)", "psutil (>=5.9.5)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-xdist (>=3.3.1)", "re-assert (>=1.1)", "time-machine (>=2.12)", "wheel (>=0.41.2)"] [[package]] -name = "typed-ast" -version = "1.4.2" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "main" +name = "traitlets" +version = "5.13.0" +description = "Traitlets Python configuration system" optional = false -python-versions = "*" +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.13.0-py3-none-any.whl", hash = "sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619"}, + {file = "traitlets-5.13.0.tar.gz", hash = "sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.6.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] [[package]] name = "typepy" -version = "1.1.3" +version = "1.3.2" description = "typepy is a Python library for variable type checker/validator/converter at a run time." -category = "main" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" +files = [ + {file = "typepy-1.3.2-py3-none-any.whl", hash = "sha256:d5d1022a424132622993800f1d2cd16cfdb691ac4e3b9c325f0fcb37799db1ae"}, + {file = "typepy-1.3.2.tar.gz", hash = "sha256:b69fd48b9f50cdb3809906eef36b855b3134ff66c8893a4f8580abddb0b39517"}, +] [package.dependencies] mbstrdecoder = ">=1.0.0,<2" -packaging = "*" +packaging = {version = "*", optional = true, markers = "extra == \"datetime\""} python-dateutil = {version = ">=2.8.0,<3.0.0", optional = true, markers = "extra == \"datetime\""} pytz = {version = ">=2018.9", optional = true, markers = "extra == \"datetime\""} [package.extras] -datetime = ["python-dateutil (>=2.8.0,<3.0.0)", "pytz (>=2018.9)"] -test = ["pytest (>=6.0.1)", "tcolorpy", "python-dateutil (>=2.8.0,<3.0.0)", "pytz (>=2018.9)"] +datetime = ["packaging", "python-dateutil (>=2.8.0,<3.0.0)", "pytz (>=2018.9)"] +test = ["packaging", "pytest (>=6.0.1)", "python-dateutil (>=2.8.0,<3.0.0)", "pytz (>=2018.9)", "tcolorpy"] [[package]] -name = "typing-extensions" -version = "3.7.4.3" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "main" +name = "types-markdown" +version = "3.5.0.1" +description = "Typing stubs for Markdown" +optional = false +python-versions = ">=3.7" +files = [ + {file = "types-Markdown-3.5.0.1.tar.gz", hash = "sha256:c57ef7d510cb882ef0c1bfef3fc9401cfc329685eabdd9b15ce674f90ca6c546"}, + {file = "types_Markdown-3.5.0.1-py3-none-any.whl", hash = "sha256:816e19f03b08dcf74e8873080cccbc1577644940c49874ae5c2b89f400e149ac"}, +] + +[[package]] +name = "types-requests" +version = "2.31.0.10" +description = "Typing stubs for requests" +optional = false +python-versions = ">=3.7" +files = [ + {file = "types-requests-2.31.0.10.tar.gz", hash = "sha256:dc5852a76f1eaf60eafa81a2e50aefa3d1f015c34cf0cba130930866b1b22a92"}, + {file = "types_requests-2.31.0.10-py3-none-any.whl", hash = "sha256:b32b9a86beffa876c0c3ac99a4cd3b8b51e973fb8e3bd4e0a6bb32c7efad80fc"}, +] + +[package.dependencies] +urllib3 = ">=2" + +[[package]] +name = "types-toml" +version = "0.10.8.7" +description = "Typing stubs for toml" optional = false python-versions = "*" +files = [ + {file = "types-toml-0.10.8.7.tar.gz", hash = "sha256:58b0781c681e671ff0b5c0319309910689f4ab40e8a2431e205d70c94bb6efb1"}, + {file = "types_toml-0.10.8.7-py3-none-any.whl", hash = "sha256:61951da6ad410794c97bec035d59376ce1cbf4453dc9b6f90477e81e4442d631"}, +] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] [[package]] name = "urllib3" -version = "1.25.11" +version = "2.0.7" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +python-versions = ">=3.7" +files = [ + {file = "urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e"}, + {file = "urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84"}, +] [package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +secure = ["certifi", "cryptography (>=1.9)", "idna (>=2.0.0)", "pyopenssl (>=17.1.0)", "urllib3-secure-extra"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "vendorize" -version = "0.2.1" +version = "0.3.0" description = "Vendorize packages from PyPI" -category = "dev" optional = false -python-versions = "*" +python-versions = ">=3.5" +files = [ + {file = "vendorize-0.3.0-py3-none-any.whl", hash = "sha256:d6c163755369d4f6120f3a69b5d2112f04bb124555550b002813265463fb43c9"}, + {file = "vendorize-0.3.0.tar.gz", hash = "sha256:d3fc6f1ce436887f46b80ed0c13fb546a8201906d6e763d9b2aaf7ec40193792"}, +] [[package]] name = "vermin" -version = "1.1.0" +version = "1.5.2" description = "Concurrently detect the minimum Python versions needed to run code" -category = "main" optional = false python-versions = ">=2.7" +files = [ + {file = "vermin-1.5.2-py2.py3-none-any.whl", hash = "sha256:c1566ad4e1c8e1b0e98cf5f7d69b691d44a578e2ce9c5aa1d418736bc4944b32"}, +] + +[[package]] +name = "virtualenv" +version = "20.24.6" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.24.6-py3-none-any.whl", hash = "sha256:520d056652454c5098a00c0f073611ccbea4c79089331f60bf9d7ba247bb7381"}, + {file = "virtualenv-20.24.6.tar.gz", hash = "sha256:02ece4f56fbf939dbbc33c0715159951d6bf14aaf5457b092e4548e1382455af"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<4" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "wcwidth" +version = "0.2.9" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.9-py2.py3-none-any.whl", hash = "sha256:9a929bd8380f6cd9571a968a9c8f4353ca58d7cd812a4822bba831f8d685b223"}, + {file = "wcwidth-0.2.9.tar.gz", hash = "sha256:a675d1a4a2d24ef67096a04b85b02deeecd8e226f57b5e3a72dbb9ed99d27da8"}, +] [[package]] name = "whats-that-code" -version = "0.1.10" +version = "0.2.0" description = "Guess programming language from a string or file." -category = "main" optional = false python-versions = ">=3.6,<4.0" +files = [ + {file = "whats_that_code-0.2.0-py3-none-any.whl", hash = "sha256:923fb3d84ad27c265da7ac2b12251a2055c3325c0bd4dae5e527085b99e84273"}, + {file = "whats_that_code-0.2.0.tar.gz", hash = "sha256:938fb2443a6a7eb23ceee20f0c246922f206c7356b542113d3161314f8cdc61d"}, +] [package.dependencies] defusedxml = "*" pygments = "*" pyrankvote = "*" -[[package]] -name = "wrapt" -version = "1.12.1" -description = "Module for decorators, wrappers and monkey patching." -category = "main" -optional = false -python-versions = "*" - [[package]] name = "yarg" version = "0.1.9" description = "A semi hard Cornish cheese, also queries PyPI (PyPI client)" -category = "main" optional = false python-versions = "*" +files = [ + {file = "yarg-0.1.9-py2.py3-none-any.whl", hash = "sha256:4f9cebdc00fac946c9bf2783d634e538a71c7d280a4d806d45fd4dc0ef441492"}, + {file = "yarg-0.1.9.tar.gz", hash = "sha256:55695bf4d1e3e7f756496c36a69ba32c40d18f821e38f61d028f6049e5e15911"}, +] [package.dependencies] requests = "*" [[package]] name = "yarl" -version = "1.6.3" +version = "1.9.2" description = "Yet another URL library" -category = "main" optional = false -python-versions = ">=3.6" +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] [package.dependencies] idna = ">=2.0" multidict = ">=4.0" -typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} - -[[package]] -name = "zipp" -version = "3.4.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pytest (>=3.5,!=3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "jaraco.test (>=3.2.0)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [metadata] -lock-version = "1.1" -python-versions = ">=3.6, <4.0" -content-hash = "607d136492c2901da8d34856344035ec951fd5d561f4ed95377e13dc19b2b91d" - -[metadata.files] -2to3 = [ - {file = "2to3-1.0-py3-none-any.whl", hash = "sha256:a39fb204829c6ed90be1507f3aff1c2b4fa6734585d57a50286f039546b5fb7f"}, - {file = "2to3-1.0.tar.gz", hash = "sha256:958bc212c928bbdcbc778b72528e0a39ae4ee8040eda6af6c3b5dd640c98ce6d"}, -] -aiohttp = [ - {file = "aiohttp-3.6.2-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:1e984191d1ec186881ffaed4581092ba04f7c61582a177b187d3a2f07ed9719e"}, - {file = "aiohttp-3.6.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:50aaad128e6ac62e7bf7bd1f0c0a24bc968a0c0590a726d5a955af193544bcec"}, - {file = "aiohttp-3.6.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:65f31b622af739a802ca6fd1a3076fd0ae523f8485c52924a89561ba10c49b48"}, - {file = "aiohttp-3.6.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ae55bac364c405caa23a4f2d6cfecc6a0daada500274ffca4a9230e7129eac59"}, - {file = "aiohttp-3.6.2-cp36-cp36m-win32.whl", hash = "sha256:344c780466b73095a72c616fac5ea9c4665add7fc129f285fbdbca3cccf4612a"}, - {file = "aiohttp-3.6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:4c6efd824d44ae697814a2a85604d8e992b875462c6655da161ff18fd4f29f17"}, - {file = "aiohttp-3.6.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2f4d1a4fdce595c947162333353d4a44952a724fba9ca3205a3df99a33d1307a"}, - {file = "aiohttp-3.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6206a135d072f88da3e71cc501c59d5abffa9d0bb43269a6dcd28d66bfafdbdd"}, - {file = "aiohttp-3.6.2-cp37-cp37m-win32.whl", hash = "sha256:b778ce0c909a2653741cb4b1ac7015b5c130ab9c897611df43ae6a58523cb965"}, - {file = "aiohttp-3.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:32e5f3b7e511aa850829fbe5aa32eb455e5534eaa4b1ce93231d00e2f76e5654"}, - {file = "aiohttp-3.6.2-py3-none-any.whl", hash = "sha256:460bd4237d2dbecc3b5ed57e122992f60188afe46e7319116da5eb8a9dfedba4"}, - {file = "aiohttp-3.6.2.tar.gz", hash = "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326"}, -] -apipkg = [ - {file = "apipkg-1.5-py2.py3-none-any.whl", hash = "sha256:58587dd4dc3daefad0487f6d9ae32b4542b185e1c36db6993290e7c41ca2b47c"}, - {file = "apipkg-1.5.tar.gz", hash = "sha256:37228cda29411948b422fae072f57e31d3396d2ee1c9783775980ee9c9990af6"}, -] -appdirs = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] -astroid = [ - {file = "astroid-2.4.2-py3-none-any.whl", hash = "sha256:bc58d83eb610252fd8de6363e39d4f1d0619c894b0ed24603b881c02e64c7386"}, - {file = "astroid-2.4.2.tar.gz", hash = "sha256:2f4078c2a41bf377eea06d71c9d2ba4eb8f6b1af2135bec27bbbb7d8f12bb703"}, -] -async-timeout = [ - {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, - {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, - {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, -] -bcrypt = [ - {file = "bcrypt-3.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c95d4cbebffafcdd28bd28bb4e25b31c50f6da605c81ffd9ad8a3d1b2ab7b1b6"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux1_x86_64.whl", hash = "sha256:63d4e3ff96188e5898779b6057878fecf3f11cfe6ec3b313ea09955d587ec7a7"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:cd1ea2ff3038509ea95f687256c46b79f5fc382ad0aa3664d200047546d511d1"}, - {file = "bcrypt-3.2.0-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:cdcdcb3972027f83fe24a48b1e90ea4b584d35f1cc279d76de6fc4b13376239d"}, - {file = "bcrypt-3.2.0-cp36-abi3-win32.whl", hash = "sha256:a67fb841b35c28a59cebed05fbd3e80eea26e6d75851f0574a9273c80f3e9b55"}, - {file = "bcrypt-3.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:81fec756feff5b6818ea7ab031205e1d323d8943d237303baca2c5f9c7846f34"}, - {file = "bcrypt-3.2.0.tar.gz", hash = "sha256:5b93c1726e50a93a033c36e5ca7fdcd29a5c7395af50a6892f5d9e7c6cfbfb29"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.9.1-py2-none-any.whl", hash = "sha256:e718f2342e2e099b640a34ab782407b7b676f47ee272d6739e60b8ea23829f2c"}, - {file = "beautifulsoup4-4.9.1-py3-none-any.whl", hash = "sha256:a6237df3c32ccfaee4fd201c8f5f9d9df619b93121d01353a64a73ce8c6ef9a8"}, - {file = "beautifulsoup4-4.9.1.tar.gz", hash = "sha256:73cc4d115b96f79c7d77c1c7f7a0a8d4c57860d1041df407dd1aae7f07a77fd7"}, -] -binary = [ - {file = "binary-1.0.0-py2.py3-none-any.whl", hash = "sha256:e1b61f3a5c002717d1a28e4d9d2dc8acbc9d6b12baf7b1e4ab25d743da97e323"}, - {file = "binary-1.0.0.tar.gz", hash = "sha256:6ec010e58f7331ebc8bc9638dbe6c66d635de60d5818b0723bef4dead0ec28a6"}, -] -black = [ - {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, -] -cachetools = [ - {file = "cachetools-4.2.1-py3-none-any.whl", hash = "sha256:1d9d5f567be80f7c07d765e21b814326d78c61eb0c3a637dffc0e5d1796cb2e2"}, - {file = "cachetools-4.2.1.tar.gz", hash = "sha256:f469e29e7aa4cff64d8de4aad95ce76de8ea1125a16c68e0d93f65c3c3dc92e9"}, -] -certifi = [ - {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, - {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, -] -cffi = [ - {file = "cffi-1.14.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:bb89f306e5da99f4d922728ddcd6f7fcebb3241fc40edebcb7284d7514741991"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:34eff4b97f3d982fb93e2831e6750127d1355a923ebaeeb565407b3d2f8d41a1"}, - {file = "cffi-1.14.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:99cd03ae7988a93dd00bcd9d0b75e1f6c426063d6f03d2f90b89e29b25b82dfa"}, - {file = "cffi-1.14.5-cp27-cp27m-win32.whl", hash = "sha256:65fa59693c62cf06e45ddbb822165394a288edce9e276647f0046e1ec26920f3"}, - {file = "cffi-1.14.5-cp27-cp27m-win_amd64.whl", hash = "sha256:51182f8927c5af975fece87b1b369f722c570fe169f9880764b1ee3bca8347b5"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:43e0b9d9e2c9e5d152946b9c5fe062c151614b262fda2e7b201204de0b99e482"}, - {file = "cffi-1.14.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cbde590d4faaa07c72bf979734738f328d239913ba3e043b1e98fe9a39f8b2b6"}, - {file = "cffi-1.14.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:5de7970188bb46b7bf9858eb6890aad302577a5f6f75091fd7cdd3ef13ef3045"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:a465da611f6fa124963b91bf432d960a555563efe4ed1cc403ba5077b15370aa"}, - {file = "cffi-1.14.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d42b11d692e11b6634f7613ad8df5d6d5f8875f5d48939520d351007b3c13406"}, - {file = "cffi-1.14.5-cp35-cp35m-win32.whl", hash = "sha256:72d8d3ef52c208ee1c7b2e341f7d71c6fd3157138abf1a95166e6165dd5d4369"}, - {file = "cffi-1.14.5-cp35-cp35m-win_amd64.whl", hash = "sha256:29314480e958fd8aab22e4a58b355b629c59bf5f2ac2492b61e3dc06d8c7a315"}, - {file = "cffi-1.14.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d3dd4c9e559eb172ecf00a2a7517e97d1e96de2a5e610bd9b68cea3925b4892"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:48e1c69bbacfc3d932221851b39d49e81567a4d4aac3b21258d9c24578280058"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:69e395c24fc60aad6bb4fa7e583698ea6cc684648e1ffb7fe85e3c1ca131a7d5"}, - {file = "cffi-1.14.5-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9e93e79c2551ff263400e1e4be085a1210e12073a31c2011dbbda14bda0c6132"}, - {file = "cffi-1.14.5-cp36-cp36m-win32.whl", hash = "sha256:58e3f59d583d413809d60779492342801d6e82fefb89c86a38e040c16883be53"}, - {file = "cffi-1.14.5-cp36-cp36m-win_amd64.whl", hash = "sha256:005a36f41773e148deac64b08f233873a4d0c18b053d37da83f6af4d9087b813"}, - {file = "cffi-1.14.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2894f2df484ff56d717bead0a5c2abb6b9d2bf26d6960c4604d5c48bbc30ee73"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:0857f0ae312d855239a55c81ef453ee8fd24136eaba8e87a2eceba644c0d4c06"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:cd2868886d547469123fadc46eac7ea5253ea7fcb139f12e1dfc2bbd406427d1"}, - {file = "cffi-1.14.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:35f27e6eb43380fa080dccf676dece30bef72e4a67617ffda586641cd4508d49"}, - {file = "cffi-1.14.5-cp37-cp37m-win32.whl", hash = "sha256:9ff227395193126d82e60319a673a037d5de84633f11279e336f9c0f189ecc62"}, - {file = "cffi-1.14.5-cp37-cp37m-win_amd64.whl", hash = "sha256:9cf8022fb8d07a97c178b02327b284521c7708d7c71a9c9c355c178ac4bbd3d4"}, - {file = "cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b198cec6c72df5289c05b05b8b0969819783f9418e0409865dac47288d2a053"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:ad17025d226ee5beec591b52800c11680fca3df50b8b29fe51d882576e039ee0"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6c97d7350133666fbb5cf4abdc1178c812cb205dc6f41d174a7b0f18fb93337e"}, - {file = "cffi-1.14.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8ae6299f6c68de06f136f1f9e69458eae58f1dacf10af5c17353eae03aa0d827"}, - {file = "cffi-1.14.5-cp38-cp38-win32.whl", hash = "sha256:b85eb46a81787c50650f2392b9b4ef23e1f126313b9e0e9013b35c15e4288e2e"}, - {file = "cffi-1.14.5-cp38-cp38-win_amd64.whl", hash = "sha256:1f436816fc868b098b0d63b8920de7d208c90a67212546d02f84fe78a9c26396"}, - {file = "cffi-1.14.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1071534bbbf8cbb31b498d5d9db0f274f2f7a865adca4ae429e147ba40f73dea"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9de2e279153a443c656f2defd67769e6d1e4163952b3c622dcea5b08a6405322"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:6e4714cc64f474e4d6e37cfff31a814b509a35cb17de4fb1999907575684479c"}, - {file = "cffi-1.14.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:158d0d15119b4b7ff6b926536763dc0714313aa59e320ddf787502c70c4d4bee"}, - {file = "cffi-1.14.5-cp39-cp39-win32.whl", hash = "sha256:afb29c1ba2e5a3736f1c301d9d0abe3ec8b86957d04ddfa9d7a6a42b9367e396"}, - {file = "cffi-1.14.5-cp39-cp39-win_amd64.whl", hash = "sha256:f2d45f97ab6bb54753eab54fffe75aaf3de4ff2341c9daee1987ee1837636f1d"}, - {file = "cffi-1.14.5.tar.gz", hash = "sha256:fd78e5fee591709f32ef6edb9a015b4aa1a5022598e36227500c8f4e02328d9c"}, -] -chardet = [ - {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, - {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, -] -checksumdir = [ - {file = "checksumdir-1.1.7.tar.gz", hash = "sha256:aa1be031a0c51653aa7ae08c9991def5c639001976d09b7890284919652782d5"}, -] -click = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] -colorama = [ - {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -colorclass = [ - {file = "colorclass-2.2.0.tar.gz", hash = "sha256:b05c2a348dfc1aff2d502527d78a5b7b7e2f85da94a96c5081210d8e9ee8e18b"}, -] -configparser = [ - {file = "configparser-5.0.1-py3-none-any.whl", hash = "sha256:08e8a59ef1817ac4ed810bb8e17d049566dd6e024e7566f6285c756db2bb4ff8"}, - {file = "configparser-5.0.1.tar.gz", hash = "sha256:005c3b102c96f4be9b8f40dafbd4997db003d07d1caa19f37808be8031475f2a"}, -] -coverage = [ - {file = "coverage-5.4-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:6d9c88b787638a451f41f97446a1c9fd416e669b4d9717ae4615bd29de1ac135"}, - {file = "coverage-5.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:66a5aae8233d766a877c5ef293ec5ab9520929c2578fd2069308a98b7374ea8c"}, - {file = "coverage-5.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9754a5c265f991317de2bac0c70a746efc2b695cf4d49f5d2cddeac36544fb44"}, - {file = "coverage-5.4-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:fbb17c0d0822684b7d6c09915677a32319f16ff1115df5ec05bdcaaee40b35f3"}, - {file = "coverage-5.4-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:b7f7421841f8db443855d2854e25914a79a1ff48ae92f70d0a5c2f8907ab98c9"}, - {file = "coverage-5.4-cp27-cp27m-win32.whl", hash = "sha256:4a780807e80479f281d47ee4af2eb2df3e4ccf4723484f77da0bb49d027e40a1"}, - {file = "coverage-5.4-cp27-cp27m-win_amd64.whl", hash = "sha256:87c4b38288f71acd2106f5d94f575bc2136ea2887fdb5dfe18003c881fa6b370"}, - {file = "coverage-5.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:c6809ebcbf6c1049002b9ac09c127ae43929042ec1f1dbd8bb1615f7cd9f70a0"}, - {file = "coverage-5.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ba7ca81b6d60a9f7a0b4b4e175dcc38e8fef4992673d9d6e6879fd6de00dd9b8"}, - {file = "coverage-5.4-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:89fc12c6371bf963809abc46cced4a01ca4f99cba17be5e7d416ed7ef1245d19"}, - {file = "coverage-5.4-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a8eb7785bd23565b542b01fb39115a975fefb4a82f23d407503eee2c0106247"}, - {file = "coverage-5.4-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:7e40d3f8eb472c1509b12ac2a7e24158ec352fc8567b77ab02c0db053927e339"}, - {file = "coverage-5.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1ccae21a076d3d5f471700f6d30eb486da1626c380b23c70ae32ab823e453337"}, - {file = "coverage-5.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:755c56beeacac6a24c8e1074f89f34f4373abce8b662470d3aa719ae304931f3"}, - {file = "coverage-5.4-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:322549b880b2d746a7672bf6ff9ed3f895e9c9f108b714e7360292aa5c5d7cf4"}, - {file = "coverage-5.4-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:60a3307a84ec60578accd35d7f0c71a3a971430ed7eca6567399d2b50ef37b8c"}, - {file = "coverage-5.4-cp35-cp35m-win32.whl", hash = "sha256:1375bb8b88cb050a2d4e0da901001347a44302aeadb8ceb4b6e5aa373b8ea68f"}, - {file = "coverage-5.4-cp35-cp35m-win_amd64.whl", hash = "sha256:16baa799ec09cc0dcb43a10680573269d407c159325972dd7114ee7649e56c66"}, - {file = "coverage-5.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2f2cf7a42d4b7654c9a67b9d091ec24374f7c58794858bff632a2039cb15984d"}, - {file = "coverage-5.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b62046592b44263fa7570f1117d372ae3f310222af1fc1407416f037fb3af21b"}, - {file = "coverage-5.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:812eaf4939ef2284d29653bcfee9665f11f013724f07258928f849a2306ea9f9"}, - {file = "coverage-5.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:859f0add98707b182b4867359e12bde806b82483fb12a9ae868a77880fc3b7af"}, - {file = "coverage-5.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:04b14e45d6a8e159c9767ae57ecb34563ad93440fc1b26516a89ceb5b33c1ad5"}, - {file = "coverage-5.4-cp36-cp36m-win32.whl", hash = "sha256:ebfa374067af240d079ef97b8064478f3bf71038b78b017eb6ec93ede1b6bcec"}, - {file = "coverage-5.4-cp36-cp36m-win_amd64.whl", hash = "sha256:84df004223fd0550d0ea7a37882e5c889f3c6d45535c639ce9802293b39cd5c9"}, - {file = "coverage-5.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:1b811662ecf72eb2d08872731636aee6559cae21862c36f74703be727b45df90"}, - {file = "coverage-5.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6b588b5cf51dc0fd1c9e19f622457cc74b7d26fe295432e434525f1c0fae02bc"}, - {file = "coverage-5.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:3fe50f1cac369b02d34ad904dfe0771acc483f82a1b54c5e93632916ba847b37"}, - {file = "coverage-5.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:32ab83016c24c5cf3db2943286b85b0a172dae08c58d0f53875235219b676409"}, - {file = "coverage-5.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:68fb816a5dd901c6aff352ce49e2a0ffadacdf9b6fae282a69e7a16a02dad5fb"}, - {file = "coverage-5.4-cp37-cp37m-win32.whl", hash = "sha256:a636160680c6e526b84f85d304e2f0bb4e94f8284dd765a1911de9a40450b10a"}, - {file = "coverage-5.4-cp37-cp37m-win_amd64.whl", hash = "sha256:bb32ca14b4d04e172c541c69eec5f385f9a075b38fb22d765d8b0ce3af3a0c22"}, - {file = "coverage-5.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4d7165a4e8f41eca6b990c12ee7f44fef3932fac48ca32cecb3a1b2223c21f"}, - {file = "coverage-5.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a565f48c4aae72d1d3d3f8e8fb7218f5609c964e9c6f68604608e5958b9c60c3"}, - {file = "coverage-5.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:fff1f3a586246110f34dc762098b5afd2de88de507559e63553d7da643053786"}, - {file = "coverage-5.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a839e25f07e428a87d17d857d9935dd743130e77ff46524abb992b962eb2076c"}, - {file = "coverage-5.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:6625e52b6f346a283c3d563d1fd8bae8956daafc64bb5bbd2b8f8a07608e3994"}, - {file = "coverage-5.4-cp38-cp38-win32.whl", hash = "sha256:5bee3970617b3d74759b2d2df2f6a327d372f9732f9ccbf03fa591b5f7581e39"}, - {file = "coverage-5.4-cp38-cp38-win_amd64.whl", hash = "sha256:03ed2a641e412e42cc35c244508cf186015c217f0e4d496bf6d7078ebe837ae7"}, - {file = "coverage-5.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:14a9f1887591684fb59fdba8feef7123a0da2424b0652e1b58dd5b9a7bb1188c"}, - {file = "coverage-5.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9564ac7eb1652c3701ac691ca72934dd3009997c81266807aef924012df2f4b3"}, - {file = "coverage-5.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:0f48fc7dc82ee14aeaedb986e175a429d24129b7eada1b7e94a864e4f0644dde"}, - {file = "coverage-5.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:107d327071061fd4f4a2587d14c389a27e4e5c93c7cba5f1f59987181903902f"}, - {file = "coverage-5.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:0cdde51bfcf6b6bd862ee9be324521ec619b20590787d1655d005c3fb175005f"}, - {file = "coverage-5.4-cp39-cp39-win32.whl", hash = "sha256:c67734cff78383a1f23ceba3b3239c7deefc62ac2b05fa6a47bcd565771e5880"}, - {file = "coverage-5.4-cp39-cp39-win_amd64.whl", hash = "sha256:c669b440ce46ae3abe9b2d44a913b5fd86bb19eb14a8701e88e3918902ecd345"}, - {file = "coverage-5.4-pp36-none-any.whl", hash = "sha256:c0ff1c1b4d13e2240821ef23c1efb1f009207cb3f56e16986f713c2b0e7cd37f"}, - {file = "coverage-5.4-pp37-none-any.whl", hash = "sha256:cd601187476c6bed26a0398353212684c427e10a903aeafa6da40c63309d438b"}, - {file = "coverage-5.4.tar.gz", hash = "sha256:6d2e262e5e8da6fa56e774fb8e2643417351427604c2b177f8e8c5f75fc928ca"}, -] -cryptography = [ - {file = "cryptography-3.4.5-cp36-abi3-macosx_10_10_x86_64.whl", hash = "sha256:18d6f3ac1da14a01c95f4590ee58e96aa6628d231ce738e9eca330b9997127b6"}, - {file = "cryptography-3.4.5-cp36-abi3-manylinux2010_x86_64.whl", hash = "sha256:c8dc9859c5a046e1ca22da360dfd609c09064a4f974881cb5cba977c581088ec"}, - {file = "cryptography-3.4.5-cp36-abi3-manylinux2014_aarch64.whl", hash = "sha256:0bf49d5b38e4f3745a0eab0597fa97720dd49b30d65f534b49a82e303f149deb"}, - {file = "cryptography-3.4.5-cp36-abi3-manylinux2014_x86_64.whl", hash = "sha256:9c6f7552d4f2130542d488b9d9e5b1546204b5d1aa90c823d50cce8eed421363"}, - {file = "cryptography-3.4.5-cp36-abi3-win32.whl", hash = "sha256:b0873ac0c0e6bc6882cd285930cc382ec4e78786be71bdc113c06246eea61294"}, - {file = "cryptography-3.4.5-cp36-abi3-win_amd64.whl", hash = "sha256:8b3b79af57e12aabbc3db81e563eaa07870293a1ffdcc891d107035ce9a0dbff"}, - {file = "cryptography-3.4.5.tar.gz", hash = "sha256:4f6761a82b51fe02cda8f45af1c2f698a10f50003dc9c2572d8a49eda2e6d35b"}, -] -dataclasses = [ - {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"}, - {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"}, -] -dataproperty = [ - {file = "DataProperty-0.50.0-py3-none-any.whl", hash = "sha256:9288b74f5d6e07d4c69c218802556f877d711fce2c62abc6aea286b357e84be2"}, - {file = "DataProperty-0.50.0.tar.gz", hash = "sha256:847f2d8927d8426a0eb20e48238e2db19133506bcd1e2608e21314004fa80d72"}, -] -decorator = [ - {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, - {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, -] -defusedxml = [ - {file = "defusedxml-0.6.0-py2.py3-none-any.whl", hash = "sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93"}, - {file = "defusedxml-0.6.0.tar.gz", hash = "sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5"}, -] -diskcache = [ - {file = "diskcache-5.2.1-py3-none-any.whl", hash = "sha256:6e8137c778fd2752b93c8a8f944e939b3665d645b46774d8537dd3528ac3baa1"}, - {file = "diskcache-5.2.1.tar.gz", hash = "sha256:1805acd5868ac10ad547208951a1190a0ab7bbff4e70f9a07cde4dbdfaa69f64"}, -] -docopt = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] -dodgy = [ - {file = "dodgy-0.2.1-py3-none-any.whl", hash = "sha256:51f54c0fd886fa3854387f354b19f429d38c04f984f38bc572558b703c0542a6"}, - {file = "dodgy-0.2.1.tar.gz", hash = "sha256:28323cbfc9352139fdd3d316fa17f325cc0e9ac74438cbba51d70f9b48f86c3a"}, -] -dominate = [ - {file = "dominate-2.6.0-py2.py3-none-any.whl", hash = "sha256:84b5f71ed30021193cb0faa45d7776e1083f392cfe67a49f44e98cb2ed76c036"}, - {file = "dominate-2.6.0.tar.gz", hash = "sha256:76ec2cde23700a6fc4fee098168b9dee43b99c2f1dd0ca6a711f683e8eb7e1e4"}, -] -dparse = [ - {file = "dparse-0.5.1-py3-none-any.whl", hash = "sha256:e953a25e44ebb60a5c6efc2add4420c177f1d8404509da88da9729202f306994"}, - {file = "dparse-0.5.1.tar.gz", hash = "sha256:a1b5f169102e1c894f9a7d5ccf6f9402a836a5d24be80a986c7ce9eaed78f367"}, -] -execnet = [ - {file = "execnet-1.8.0-py2.py3-none-any.whl", hash = "sha256:7a13113028b1e1cc4c6492b28098b3c6576c9dccc7973bfe47b342afadafb2ac"}, - {file = "execnet-1.8.0.tar.gz", hash = "sha256:b73c5565e517f24b62dea8a5ceac178c661c4309d3aa0c3e420856c072c411b4"}, -] -gitchangelog = [ - {file = "gitchangelog-3.0.4-py2.py3-none-any.whl", hash = "sha256:45f8b8e64cece0d9bb03a35ecd8ee62c1c7157f8dac0ef3cb68381bfcc1bde29"}, - {file = "gitchangelog-3.0.4.tar.gz", hash = "sha256:3d8d6a730450fbd5b0a9bc58d0dd3e269c967d7eb4fece0c5cff4372a3f77421"}, -] -gitdb = [ - {file = "gitdb-4.0.5-py3-none-any.whl", hash = "sha256:91f36bfb1ab7949b3b40e23736db18231bf7593edada2ba5c3a174a7b23657ac"}, - {file = "gitdb-4.0.5.tar.gz", hash = "sha256:c9e1f2d0db7ddb9a704c2a0217be31214e91a4fe1dea1efad19ae42ba0c285c9"}, -] -gitpython = [ - {file = "GitPython-3.1.13-py3-none-any.whl", hash = "sha256:c5347c81d232d9b8e7f47b68a83e5dc92e7952127133c5f2df9133f2c75a1b29"}, - {file = "GitPython-3.1.13.tar.gz", hash = "sha256:8621a7e777e276a5ec838b59280ba5272dd144a18169c36c903d8b38b99f750a"}, -] -google-api-core = [ - {file = "google-api-core-1.26.0.tar.gz", hash = "sha256:4230ec764d48ca934fe69b85cc217e31e844e176f68df93e252acd55350e730b"}, - {file = "google_api_core-1.26.0-py2.py3-none-any.whl", hash = "sha256:002e44c533299aecd9dd265d200f9eacd9957cddd2c72e2cd1cb5cea127e972d"}, -] -google-auth = [ - {file = "google-auth-1.26.1.tar.gz", hash = "sha256:1b461d079b5650efe492a7814e95c536ffa9e7a96e39a6d16189c1604f18554f"}, - {file = "google_auth-1.26.1-py2.py3-none-any.whl", hash = "sha256:8ce6862cf4e9252de10045f05fa80393fde831da9c2b45c39288edeee3cde7f2"}, -] -google-cloud-bigquery = [ - {file = "google-cloud-bigquery-2.6.1.tar.gz", hash = "sha256:1f99fd0c0c5bde999e056a1be666e5d5bbf392f62c9e730dfcbaf6e8408d44ef"}, - {file = "google_cloud_bigquery-2.6.1-py2.py3-none-any.whl", hash = "sha256:4b4593c45e78ee5d2e55b3aa7156839e8fbc4c3b9ed2d70715c820dce48cdf97"}, -] -google-cloud-core = [ - {file = "google-cloud-core-1.6.0.tar.gz", hash = "sha256:c6abb18527545379fc82efc4de75ce9a3772ccad2fc645adace593ba097cbb02"}, - {file = "google_cloud_core-1.6.0-py2.py3-none-any.whl", hash = "sha256:40d9c2da2d03549b5ac3dcccf289d4f15e6d1210044c6381ce45c92913e62904"}, -] -google-crc32c = [ - {file = "google-crc32c-1.1.2.tar.gz", hash = "sha256:dff5bd1236737f66950999d25de7a78144548ebac7788d30ada8c1b6ead60b27"}, - {file = "google_crc32c-1.1.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:8ed8f6dc4f55850cba2eb22b78902ad37f397ee02692d3b8e00842e9af757321"}, - {file = "google_crc32c-1.1.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:110157fb19ab5db15603debfaf5fcfbac9627576787d9caf8618ff96821a7a1f"}, - {file = "google_crc32c-1.1.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:80abca603187093ea089cd1215c3779040dda55d3cdabc0cd5ea0e10df7bff99"}, - {file = "google_crc32c-1.1.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6789db0b12aab12a0f04de22ed8412dfa5f6abd5a342ea19f15355064e1cc387"}, - {file = "google_crc32c-1.1.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ea170341a4a9078a067b431044cd56c73553425833a7c2bb81734777a230ad4b"}, - {file = "google_crc32c-1.1.2-cp36-cp36m-win32.whl", hash = "sha256:a64e0e8ed6076a8d867fc4622ad821c55eba8dff1b48b18f56b7c2392e22ab9d"}, - {file = "google_crc32c-1.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9372211acbcc207f63ffaffea1d05f3244a21311e4710721ffff3e8b7a0d24d0"}, - {file = "google_crc32c-1.1.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:0ae3cf54e0d4d83c8af1afe96fc0970fbf32f1b29275f3bfd44ce25c4b622a2b"}, - {file = "google_crc32c-1.1.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:34a97937f164147aefa53c3277364fd3bfa7fd244cbebbd5a976fa8325fb496b"}, - {file = "google_crc32c-1.1.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:91ad96ee2958311d0bb75ffe5c25c87fb521ef547c09e04a8bb6143e75fb1367"}, - {file = "google_crc32c-1.1.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b5ea1055fe470334ced844270e7c808b04fe31e3e6394675daa77f6789ca9eff"}, - {file = "google_crc32c-1.1.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:e6458c41236d37cb982120b070ebcc115687c852bee24cdd18792da2640cf44d"}, - {file = "google_crc32c-1.1.2-cp37-cp37m-win32.whl", hash = "sha256:e5af77656e8d367701f40f80a91c985ca43319f322f0a36ba9f93909d0bc4cb2"}, - {file = "google_crc32c-1.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:ae7b9e7e2ca1b06c3a68b6ef223947a52c30ffae329b1a2be3402756073f2732"}, - {file = "google_crc32c-1.1.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:7c5138ed2e815189ba524756e027ac5833365e86115b1c2e6d9e833974a58d82"}, - {file = "google_crc32c-1.1.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a6c8a712ffae56c805ca732b735af02860b246bed2c1acb38ea954a8b2dc4581"}, - {file = "google_crc32c-1.1.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:49838ede42592154f9fcd21d07c7a43a67b00a36e252f82ae72542fde09dc51f"}, - {file = "google_crc32c-1.1.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:ef2ed6d0ac4de4ac602903e203eccd25ec8e37f1446fe1a3d2953a658035e0a5"}, - {file = "google_crc32c-1.1.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:51f4aa06125bf0641f65fb83268853545dbeb36b98ccfec69ef57dcb6b73b176"}, - {file = "google_crc32c-1.1.2-cp38-cp38-win32.whl", hash = "sha256:1dc6904c0d958f43102c85d70792cca210d3d051ddbeecd0eff10abcd981fdfa"}, - {file = "google_crc32c-1.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:298a9a922d35b123a73be80233d0f19c6ea01f008743561a8937f9dd83fb586b"}, - {file = "google_crc32c-1.1.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:ab2b31395fbeeae6d15c98bd7f8b9fb76a18f18f87adc11b1f6dbe8f90d8382f"}, - {file = "google_crc32c-1.1.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d4a0d4fb938c2c3c0076445c9bd1215a3bd3df557b88d8b05ec2889ca0c92f8d"}, - {file = "google_crc32c-1.1.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:d0630670d27785d7e610e72752dc8087436d00d2c7115e149c0a754babb56d3e"}, - {file = "google_crc32c-1.1.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:364eb36e8d9d34542c17b0c410035b0557edd4300a92ed736b237afaa0fd6dae"}, - {file = "google_crc32c-1.1.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:0dd9b61d0c63043b013349c9ec8a83ec2b05c96410c5bc257da5d0de743fc171"}, - {file = "google_crc32c-1.1.2-cp39-cp39-win32.whl", hash = "sha256:92ed6062792b989e84621e07a5f3d37da9cc3153b77d23a582921f14863af31d"}, - {file = "google_crc32c-1.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:78cf5b1bd30f3a6033b41aa4ce8c796870bc4645a15d3ef47a4b05d31b0a6dc1"}, -] -google-resumable-media = [ - {file = "google-resumable-media-1.2.0.tar.gz", hash = "sha256:ee98b1921e5bda94867a08c864e55b4763d63887664f49ee1c231988f56b9d43"}, - {file = "google_resumable_media-1.2.0-py2.py3-none-any.whl", hash = "sha256:dbe670cd7f02f3586705fd5a108c8ab8552fa36a1cad8afbc5a54e982cf34f0c"}, -] -googleapis-common-protos = [ - {file = "googleapis-common-protos-1.52.0.tar.gz", hash = "sha256:560716c807117394da12cecb0a54da5a451b5cf9866f1d37e9a5e2329a665351"}, - {file = "googleapis_common_protos-1.52.0-py2.py3-none-any.whl", hash = "sha256:c8961760f5aad9a711d37b675be103e0cc4e9a39327e0d6d857872f698403e24"}, -] -grpcio = [ - {file = "grpcio-1.35.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:95cc4d2067deced18dc807442cf8062a93389a86abf8d40741120054389d3f29"}, - {file = "grpcio-1.35.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:d186a0ce291f4386e28a7042ec31c85250b0c2e25d2794b87fa3c15ff473c46c"}, - {file = "grpcio-1.35.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:c8d0a6a58a42275c6cb616e7cb9f9fcf5eba1e809996546e561cd818b8f7cff7"}, - {file = "grpcio-1.35.0-cp27-cp27m-win32.whl", hash = "sha256:8d08f90d72a8e8d9af087476337da76d26749617b0a092caff4e684ce267af21"}, - {file = "grpcio-1.35.0-cp27-cp27m-win_amd64.whl", hash = "sha256:0072ec4563ab4268c4c32e936955085c2d41ea175b662363496daedd2273372c"}, - {file = "grpcio-1.35.0-cp27-cp27mu-linux_armv7l.whl", hash = "sha256:aca45d2ccb693c9227fbf21144891422a42dc4b76b52af8dd1d4e43afebe321d"}, - {file = "grpcio-1.35.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:87147b1b306c88fe7dca7e3dff8aefd1e63d6aed86e224f9374ddf283f17d7f1"}, - {file = "grpcio-1.35.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:22edfc278070d54f3ab7f741904e09155a272fe934e842babbf84476868a50de"}, - {file = "grpcio-1.35.0-cp35-cp35m-linux_armv7l.whl", hash = "sha256:f3654a52f72ba28953dbe2e93208099f4903f4b3c07dc7ff4db671c92968111d"}, - {file = "grpcio-1.35.0-cp35-cp35m-macosx_10_10_intel.whl", hash = "sha256:dc2589370ef84eb1cc53530070d658a7011d2ee65f18806581809c11cd016136"}, - {file = "grpcio-1.35.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:f0c27fd16582a303e5baf6cffd9345c9ac5f855d69a51232664a0b888a77ba80"}, - {file = "grpcio-1.35.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:b2985f73611b637271b00d9c4f177e65cc3193269bc9760f16262b1a12757265"}, - {file = "grpcio-1.35.0-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:acb489b7aafdcf960f1a0000a1f22b45e5b6ccdf8dba48f97617d627f4133195"}, - {file = "grpcio-1.35.0-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:16fd33030944672e49e0530dec2c60cd4089659ccdf327e99569b3b29246a0b6"}, - {file = "grpcio-1.35.0-cp35-cp35m-win32.whl", hash = "sha256:1757e81c09132851e85495b802fe4d4fbef3547e77fa422a62fb4f7d51785be0"}, - {file = "grpcio-1.35.0-cp35-cp35m-win_amd64.whl", hash = "sha256:35b72884e09cbc46c564091f4545a39fa66d132c5676d1a6e827517fff47f2c1"}, - {file = "grpcio-1.35.0-cp36-cp36m-linux_armv7l.whl", hash = "sha256:17940a7dc461066f28816df48be44f24d3b9f150db344308ee2aeae033e1af0b"}, - {file = "grpcio-1.35.0-cp36-cp36m-macosx_10_10_x86_64.whl", hash = "sha256:75ea903edc42a8c6ec61dbc5f453febd79d8bdec0e1bad6df7088c34282e8c42"}, - {file = "grpcio-1.35.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:b180a3ec4a5d6f96d3840c83e5f8ab49afac9fa942921e361b451d7a024efb00"}, - {file = "grpcio-1.35.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:e163c27d2062cd3eb07057f23f8d1330925beaba16802312b51b4bad33d74098"}, - {file = "grpcio-1.35.0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:764b50ba1a15a2074cdd1a841238f2dead0a06529c495a46821fae84cb9c7342"}, - {file = "grpcio-1.35.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:088c8bea0f6b596937fefacf2c8df97712e7a3dd49496975049cc95dbf02af1a"}, - {file = "grpcio-1.35.0-cp36-cp36m-win32.whl", hash = "sha256:1aa53f82362c7f2791fe0cdd9a3b3aec325c11d8f0dfde600f91907dfaa8546b"}, - {file = "grpcio-1.35.0-cp36-cp36m-win_amd64.whl", hash = "sha256:efb3d67405eb8030db6f27920b4be023fabfb5d4e09c34deab094a7c473a5472"}, - {file = "grpcio-1.35.0-cp37-cp37m-macosx_10_10_x86_64.whl", hash = "sha256:44aaa6148d18a8e836f99dadcdec17b27bc7ec0995b2cc12c94e61826040ec90"}, - {file = "grpcio-1.35.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:18ad7644e23757420ea839ac476ef861e4f4841c8566269b7c91c100ca1943b3"}, - {file = "grpcio-1.35.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:859a0ceb23d7189362cc06fe7e906e9ed5c7a8f3ac960cc04ce13fe5847d0b62"}, - {file = "grpcio-1.35.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3e7d4428ed752fdfe2dddf2a404c93d3a2f62bf4b9109c0c10a850c698948891"}, - {file = "grpcio-1.35.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:a36151c335280b09afd5123f3b25085027ae2b10682087a4342fb6f635b928fb"}, - {file = "grpcio-1.35.0-cp37-cp37m-win32.whl", hash = "sha256:dfecb2acd3acb8bb50e9aa31472c6e57171d97c1098ee67cd283a6fe7d56a926"}, - {file = "grpcio-1.35.0-cp37-cp37m-win_amd64.whl", hash = "sha256:e87e55fba98ebd7b4c614dcef9940dc2a7e057ad8bba5f91554934d47319a35b"}, - {file = "grpcio-1.35.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:da44bf613eed5d9e8df0785463e502a416de1be6e4ac31edbe99c9111abaed5f"}, - {file = "grpcio-1.35.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:9e503eaf853199804a954dc628c5207e67d6c7848dcba42a997fbe718618a2b1"}, - {file = "grpcio-1.35.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:6ba3d7acf70acde9ce27e22921db921b84a71be578b32739536c32377b65041a"}, - {file = "grpcio-1.35.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:048c01d1eb5c2ae7cba2254b98938d2fc81f6dc10d172d9261d65266adb0fdb3"}, - {file = "grpcio-1.35.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:efd896e8ca7adb2654cf014479a5e1f74e4f776b6b2c0fbf95a6c92787a6631a"}, - {file = "grpcio-1.35.0-cp38-cp38-win32.whl", hash = "sha256:8a29a26b9f39701ce15aa1d5aa5e96e0b5f7028efe94f95341a4ed8dbe4bed78"}, - {file = "grpcio-1.35.0-cp38-cp38-win_amd64.whl", hash = "sha256:aea3d592a7ece84739b92d212cd16037c51d84a259414f64b51c14e946611f3d"}, - {file = "grpcio-1.35.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:2f8e8d35d4799aa1627a212dbe8546594abf4064056415c31bd1b3b8f2a62027"}, - {file = "grpcio-1.35.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:9f0da13b215068e7434b161a35d0b4e92140ffcfa33ddda9c458199ea1d7ce45"}, - {file = "grpcio-1.35.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:7ae408780b79c9b9b91a2592abd1d7abecd05675d988ea75038580f420966b59"}, - {file = "grpcio-1.35.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:0f714e261e1d63615476cda4ee808a79cca62f8f09e2943c136c2f87ec5347b1"}, - {file = "grpcio-1.35.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:7ee7d54da9d176d3c9a0f47c04d7ff6fdc6ee1c17643caff8c33d6c8a70678a4"}, - {file = "grpcio-1.35.0-cp39-cp39-win32.whl", hash = "sha256:94c3b81089a86d3c5877d22b07ebc66b5ed1d84771e24b001844e29a5b6178dd"}, - {file = "grpcio-1.35.0-cp39-cp39-win_amd64.whl", hash = "sha256:399ee377b312ac652b07ef4365bbbba009da361fa7708c4d3d4ce383a1534ea7"}, - {file = "grpcio-1.35.0.tar.gz", hash = "sha256:7bd0ebbb14dde78bf66a1162efd29d3393e4e943952e2f339757aa48a184645c"}, -] -html2text = [ - {file = "html2text-2020.1.16-py3-none-any.whl", hash = "sha256:c7c629882da0cf377d66f073329ccf34a12ed2adf0169b9285ae4e63ef54c82b"}, - {file = "html2text-2020.1.16.tar.gz", hash = "sha256:e296318e16b059ddb97f7a8a1d6a5c1d7af4544049a01e261731d2d5cc277bbb"}, -] -idna = [ - {file = "idna-2.8-py2.py3-none-any.whl", hash = "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"}, - {file = "idna-2.8.tar.gz", hash = "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407"}, -] -idna-ssl = [ - {file = "idna-ssl-1.1.0.tar.gz", hash = "sha256:a933e3bb13da54383f9e8f35dc4f9cb9eb9b3b78c6b36f311254d6d0d92c6c7c"}, -] -ifaddr = [ - {file = "ifaddr-0.1.7-py2.py3-none-any.whl", hash = "sha256:d1f603952f0a71c9ab4e705754511e4e03b02565bc4cec7188ad6415ff534cd3"}, - {file = "ifaddr-0.1.7.tar.gz", hash = "sha256:1f9e8a6ca6f16db5a37d3356f07b6e52344f6f9f7e806d618537731669eb1a94"}, -] -importlib-metadata = [ - {file = "importlib_metadata-3.4.0-py3-none-any.whl", hash = "sha256:ace61d5fc652dc280e7b6b4ff732a9c2d40db2c0f92bc6cb74e07b73d53a1771"}, - {file = "importlib_metadata-3.4.0.tar.gz", hash = "sha256:fa5daa4477a7414ae34e95942e4dd07f62adf589143c875c133c1e53c4eff38d"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -ipython-genutils = [ - {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, - {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, -] -jinja2 = [ - {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, - {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, -] -jsonschema = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, -] -jupyter-core = [ - {file = "jupyter_core-4.7.1-py3-none-any.whl", hash = "sha256:8c6c0cac5c1b563622ad49321d5ec47017bd18b94facb381c6973a0486395f8e"}, - {file = "jupyter_core-4.7.1.tar.gz", hash = "sha256:79025cb3225efcd36847d0840f3fc672c0abd7afd0de83ba8a1d3837619122b4"}, -] -lazy-object-proxy = [ - {file = "lazy-object-proxy-1.4.3.tar.gz", hash = "sha256:f3900e8a5de27447acbf900b4750b0ddfd7ec1ea7fbaf11dfa911141bc522af0"}, - {file = "lazy_object_proxy-1.4.3-cp27-cp27m-macosx_10_13_x86_64.whl", hash = "sha256:a2238e9d1bb71a56cd710611a1614d1194dc10a175c1e08d75e1a7bcc250d442"}, - {file = "lazy_object_proxy-1.4.3-cp27-cp27m-win32.whl", hash = "sha256:efa1909120ce98bbb3777e8b6f92237f5d5c8ea6758efea36a473e1d38f7d3e4"}, - {file = "lazy_object_proxy-1.4.3-cp27-cp27m-win_amd64.whl", hash = "sha256:4677f594e474c91da97f489fea5b7daa17b5517190899cf213697e48d3902f5a"}, - {file = "lazy_object_proxy-1.4.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0c4b206227a8097f05c4dbdd323c50edf81f15db3b8dc064d08c62d37e1a504d"}, - {file = "lazy_object_proxy-1.4.3-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:d945239a5639b3ff35b70a88c5f2f491913eb94871780ebfabb2568bd58afc5a"}, - {file = "lazy_object_proxy-1.4.3-cp34-cp34m-win32.whl", hash = "sha256:9651375199045a358eb6741df3e02a651e0330be090b3bc79f6d0de31a80ec3e"}, - {file = "lazy_object_proxy-1.4.3-cp34-cp34m-win_amd64.whl", hash = "sha256:eba7011090323c1dadf18b3b689845fd96a61ba0a1dfbd7f24b921398affc357"}, - {file = "lazy_object_proxy-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:48dab84ebd4831077b150572aec802f303117c8cc5c871e182447281ebf3ac50"}, - {file = "lazy_object_proxy-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:ca0a928a3ddbc5725be2dd1cf895ec0a254798915fb3a36af0964a0a4149e3db"}, - {file = "lazy_object_proxy-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:194d092e6f246b906e8f70884e620e459fc54db3259e60cf69a4d66c3fda3449"}, - {file = "lazy_object_proxy-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:97bb5884f6f1cdce0099f86b907aa41c970c3c672ac8b9c8352789e103cf3156"}, - {file = "lazy_object_proxy-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:cb2c7c57005a6804ab66f106ceb8482da55f5314b7fcb06551db1edae4ad1531"}, - {file = "lazy_object_proxy-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:8d859b89baf8ef7f8bc6b00aa20316483d67f0b1cbf422f5b4dc56701c8f2ffb"}, - {file = "lazy_object_proxy-1.4.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:1be7e4c9f96948003609aa6c974ae59830a6baecc5376c25c92d7d697e684c08"}, - {file = "lazy_object_proxy-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d74bb8693bf9cf75ac3b47a54d716bbb1a92648d5f781fc799347cfc95952383"}, - {file = "lazy_object_proxy-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:9b15f3f4c0f35727d3a0fba4b770b3c4ebbb1fa907dbcc046a1d2799f3edd142"}, - {file = "lazy_object_proxy-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9254f4358b9b541e3441b007a0ea0764b9d056afdeafc1a5569eee1cc6c1b9ea"}, - {file = "lazy_object_proxy-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a6ae12d08c0bf9909ce12385803a543bfe99b95fe01e752536a60af2b7797c62"}, - {file = "lazy_object_proxy-1.4.3-cp38-cp38-win32.whl", hash = "sha256:5541cada25cd173702dbd99f8e22434105456314462326f06dba3e180f203dfd"}, - {file = "lazy_object_proxy-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:59f79fef100b09564bc2df42ea2d8d21a64fdcda64979c0fa3db7bdaabaf6239"}, -] -liccheck = [ - {file = "liccheck-0.4.3.tar.gz", hash = "sha256:f6b1361a874a26fdc639b3aaf691b6e4e61a72153bfe6becdcd860f354bd2045"}, -] -lxml = [ - {file = "lxml-4.5.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:74f48ec98430e06c1fa8949b49ebdd8d27ceb9df8d3d1c92e1fdc2773f003f20"}, - {file = "lxml-4.5.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e70d4e467e243455492f5de463b72151cc400710ac03a0678206a5f27e79ddef"}, - {file = "lxml-4.5.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:7ad7906e098ccd30d8f7068030a0b16668ab8aa5cda6fcd5146d8d20cbaa71b5"}, - {file = "lxml-4.5.2-cp27-cp27m-win32.whl", hash = "sha256:92282c83547a9add85ad658143c76a64a8d339028926d7dc1998ca029c88ea6a"}, - {file = "lxml-4.5.2-cp27-cp27m-win_amd64.whl", hash = "sha256:05a444b207901a68a6526948c7cc8f9fe6d6f24c70781488e32fd74ff5996e3f"}, - {file = "lxml-4.5.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:94150231f1e90c9595ccc80d7d2006c61f90a5995db82bccbca7944fd457f0f6"}, - {file = "lxml-4.5.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bea760a63ce9bba566c23f726d72b3c0250e2fa2569909e2d83cda1534c79443"}, - {file = "lxml-4.5.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c3f511a3c58676147c277eff0224c061dd5a6a8e1373572ac817ac6324f1b1e0"}, - {file = "lxml-4.5.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:59daa84aef650b11bccd18f99f64bfe44b9f14a08a28259959d33676554065a1"}, - {file = "lxml-4.5.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:c9d317efde4bafbc1561509bfa8a23c5cab66c44d49ab5b63ff690f5159b2304"}, - {file = "lxml-4.5.2-cp35-cp35m-win32.whl", hash = "sha256:9dc9006dcc47e00a8a6a029eb035c8f696ad38e40a27d073a003d7d1443f5d88"}, - {file = "lxml-4.5.2-cp35-cp35m-win_amd64.whl", hash = "sha256:08fc93257dcfe9542c0a6883a25ba4971d78297f63d7a5a26ffa34861ca78730"}, - {file = "lxml-4.5.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:121b665b04083a1e85ff1f5243d4a93aa1aaba281bc12ea334d5a187278ceaf1"}, - {file = "lxml-4.5.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5591c4164755778e29e69b86e425880f852464a21c7bb53c7ea453bbe2633bbe"}, - {file = "lxml-4.5.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:cc411ad324a4486b142c41d9b2b6a722c534096963688d879ea6fa8a35028258"}, - {file = "lxml-4.5.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:1fa21263c3aba2b76fd7c45713d4428dbcc7644d73dcf0650e9d344e433741b3"}, - {file = "lxml-4.5.2-cp36-cp36m-win32.whl", hash = "sha256:786aad2aa20de3dbff21aab86b2fb6a7be68064cbbc0219bde414d3a30aa47ae"}, - {file = "lxml-4.5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:e1cacf4796b20865789083252186ce9dc6cc59eca0c2e79cca332bdff24ac481"}, - {file = "lxml-4.5.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:80a38b188d20c0524fe8959c8ce770a8fdf0e617c6912d23fc97c68301bb9aba"}, - {file = "lxml-4.5.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ecc930ae559ea8a43377e8b60ca6f8d61ac532fc57efb915d899de4a67928efd"}, - {file = "lxml-4.5.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:a76979f728dd845655026ab991df25d26379a1a8fc1e9e68e25c7eda43004bed"}, - {file = "lxml-4.5.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cfd7c5dd3c35c19cec59c63df9571c67c6d6e5c92e0fe63517920e97f61106d1"}, - {file = "lxml-4.5.2-cp37-cp37m-win32.whl", hash = "sha256:5a9c8d11aa2c8f8b6043d845927a51eb9102eb558e3f936df494e96393f5fd3e"}, - {file = "lxml-4.5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:4b4a111bcf4b9c948e020fd207f915c24a6de3f1adc7682a2d92660eb4e84f1a"}, - {file = "lxml-4.5.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5dd20538a60c4cc9a077d3b715bb42307239fcd25ef1ca7286775f95e9e9a46d"}, - {file = "lxml-4.5.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:2b30aa2bcff8e958cd85d907d5109820b01ac511eae5b460803430a7404e34d7"}, - {file = "lxml-4.5.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:aa8eba3db3d8761db161003e2d0586608092e217151d7458206e243be5a43843"}, - {file = "lxml-4.5.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:8f0ec6b9b3832e0bd1d57af41f9238ea7709bbd7271f639024f2fc9d3bb01293"}, - {file = "lxml-4.5.2-cp38-cp38-win32.whl", hash = "sha256:107781b213cf7201ec3806555657ccda67b1fccc4261fb889ef7fc56976db81f"}, - {file = "lxml-4.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:f161af26f596131b63b236372e4ce40f3167c1b5b5d459b29d2514bd8c9dc9ee"}, - {file = "lxml-4.5.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6f767d11803dbd1274e43c8c0b2ff0a8db941e6ed0f5d44f852fb61b9d544b54"}, - {file = "lxml-4.5.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d15a801d9037d7512edb2f1e196acebb16ab17bef4b25a91ea2e9a455ca353af"}, - {file = "lxml-4.5.2.tar.gz", hash = "sha256:cdc13a1682b2a6241080745b1953719e7fe0850b40a5c71ca574f090a1391df6"}, -] -markdown = [ - {file = "Markdown-3.3.3-py3-none-any.whl", hash = "sha256:c109c15b7dc20a9ac454c9e6025927d44460b85bd039da028d85e2b6d0bcc328"}, - {file = "Markdown-3.3.3.tar.gz", hash = "sha256:5d9f2b5ca24bc4c7a390d22323ca4bad200368612b5aaa7796babf971d2b2f18"}, -] -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"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d53bc011414228441014aa71dbec320c66468c1030aae3a6e29778a3382d96e5"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3b8a6499709d29c2e2399569d96719a1b21dcd94410a586a18526b143ec8470f"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:84dee80c15f1b560d55bcfe6d47b27d070b4681c699c572af2e3c7cc90a3b8e0"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:b1dba4527182c95a0db8b6060cc98ac49b9e2f5e64320e2b56e47cb2831978c7"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:bf5aa3cbcfdf57fa2ee9cd1822c862ef23037f5c832ad09cfea57fa846dec193"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:6fffc775d90dcc9aed1b89219549b329a9250d918fd0b8fa8d93d154918422e1"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a6a744282b7718a2a62d2ed9d993cad6f5f585605ad352c11de459f4108df0a1"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:195d7d2c4fbb0ee8139a6cf67194f3973a6b3042d742ebe0a9ed36d8b6f0c07f"}, - {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-manylinux2010_i686.whl", hash = "sha256:acf08ac40292838b3cbbb06cfe9b2cb9ec78fce8baca31ddb87aaac2e2dc3bc2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:d9be0ba6c527163cbed5e0857c451fcd092ce83947944d6c14bc95441203f032"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:caabedc8323f1e93231b52fc32bdcde6db817623d33e100708d9a68e1f53b26b"}, - {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-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d73a845f227b0bfe8a7455ee623525ee656a9e2e749e4742706d80a6065d5e2c"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:98bae9582248d6cf62321dcb52aaf5d9adf0bad3b40582925ef7c7f0ed85fceb"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:2beec1e0de6924ea551859edb9e7679da6e4870d32cb766240ce17e0a0ba2014"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:7fed13866cf14bba33e7176717346713881f56d9d2bcebab207f7a036f41b850"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:6f1e273a344928347c1290119b493a1f0303c52f5a5eae5f16d74f48c15d4a85"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:feb7b34d6325451ef96bc0e36e1a6c0c1c64bc1fbec4b854f4529e51887b1621"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-win32.whl", hash = "sha256:22c178a091fc6630d0d045bdb5992d2dfe14e3259760e713c490da5323866c39"}, - {file = "MarkupSafe-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:b7d644ddb4dbd407d31ffb699f1d140bc35478da613b441c582aeb7c43838dd8"}, - {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, -] -mbstrdecoder = [ - {file = "mbstrdecoder-1.0.1-py3-none-any.whl", hash = "sha256:56b967800d6554815a6b18f98f915e84912852eff21d94d5e036fe124bc27f53"}, - {file = "mbstrdecoder-1.0.1.tar.gz", hash = "sha256:f895e1fb97496855ab5e43de99588787169c01f782c71625142d1a62729e9f9d"}, -] -more-itertools = [ - {file = "more-itertools-8.7.0.tar.gz", hash = "sha256:c5d6da9ca3ff65220c3bfd2a8db06d698f05d4d2b9be57e1deb2be5a45019713"}, - {file = "more_itertools-8.7.0-py3-none-any.whl", hash = "sha256:5652a9ac72209ed7df8d9c15daf4e1aa0e3d2ccd3c87f8265a0673cd9cbc9ced"}, -] -msgfy = [ - {file = "msgfy-0.1.0-py3-none-any.whl", hash = "sha256:ce8a8c8c223279fa0a2c0f278eec139fcf761ca4eb98f179f54a1b96f53514f5"}, - {file = "msgfy-0.1.0.tar.gz", hash = "sha256:474c08302cd56ccee1300ac7976a01ebd1e42716fc9bcd947d39a311a15b7012"}, -] -multidict = [ - {file = "multidict-4.7.6-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:275ca32383bc5d1894b6975bb4ca6a7ff16ab76fa622967625baeebcf8079000"}, - {file = "multidict-4.7.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1ece5a3369835c20ed57adadc663400b5525904e53bae59ec854a5d36b39b21a"}, - {file = "multidict-4.7.6-cp35-cp35m-win32.whl", hash = "sha256:5141c13374e6b25fe6bf092052ab55c0c03d21bd66c94a0e3ae371d3e4d865a5"}, - {file = "multidict-4.7.6-cp35-cp35m-win_amd64.whl", hash = "sha256:9456e90649005ad40558f4cf51dbb842e32807df75146c6d940b6f5abb4a78f3"}, - {file = "multidict-4.7.6-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:e0d072ae0f2a179c375f67e3da300b47e1a83293c554450b29c900e50afaae87"}, - {file = "multidict-4.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3750f2205b800aac4bb03b5ae48025a64e474d2c6cc79547988ba1d4122a09e2"}, - {file = "multidict-4.7.6-cp36-cp36m-win32.whl", hash = "sha256:f07acae137b71af3bb548bd8da720956a3bc9f9a0b87733e0899226a2317aeb7"}, - {file = "multidict-4.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:6513728873f4326999429a8b00fc7ceddb2509b01d5fd3f3be7881a257b8d463"}, - {file = "multidict-4.7.6-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:feed85993dbdb1dbc29102f50bca65bdc68f2c0c8d352468c25b54874f23c39d"}, - {file = "multidict-4.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fcfbb44c59af3f8ea984de67ec7c306f618a3ec771c2843804069917a8f2e255"}, - {file = "multidict-4.7.6-cp37-cp37m-win32.whl", hash = "sha256:4538273208e7294b2659b1602490f4ed3ab1c8cf9dbdd817e0e9db8e64be2507"}, - {file = "multidict-4.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d14842362ed4cf63751648e7672f7174c9818459d169231d03c56e84daf90b7c"}, - {file = "multidict-4.7.6-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:c026fe9a05130e44157b98fea3ab12969e5b60691a276150db9eda71710cd10b"}, - {file = "multidict-4.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:51a4d210404ac61d32dada00a50ea7ba412e6ea945bbe992e4d7a595276d2ec7"}, - {file = "multidict-4.7.6-cp38-cp38-win32.whl", hash = "sha256:5cf311a0f5ef80fe73e4f4c0f0998ec08f954a6ec72b746f3c179e37de1d210d"}, - {file = "multidict-4.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:7388d2ef3c55a8ba80da62ecfafa06a1c097c18032a501ffd4cabbc52d7f2b19"}, - {file = "multidict-4.7.6.tar.gz", hash = "sha256:fbb77a75e529021e7c4a8d4e823d88ef4d23674a202be4f5addffc72cbb91430"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -navio-builder-win = [ - {file = "navio_builder_win-0.1.52-py2.py3-none-any.whl", hash = "sha256:2918520bb738aeae4ab55c988417a60d82981a82df3308721d5068e450c5e366"}, -] -nbformat = [ - {file = "nbformat-5.1.2-py3-none-any.whl", hash = "sha256:3949fdc8f5fa0b1afca16fb307546e78494fa7a7bceff880df8168eafda0e7ac"}, - {file = "nbformat-5.1.2.tar.gz", hash = "sha256:1d223e64a18bfa7cdf2db2e9ba8a818312fc2a0701d2e910b58df66809385a56"}, -] -packaging = [ - {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, - {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, -] -paramiko = [ - {file = "paramiko-2.7.2-py2.py3-none-any.whl", hash = "sha256:4f3e316fef2ac628b05097a637af35685183111d4bc1b5979bd397c2ab7b5898"}, - {file = "paramiko-2.7.2.tar.gz", hash = "sha256:7f36f4ba2c0d81d219f4595e35f70d56cc94f9ac40a6acdf51d6ca210ce65035"}, -] -pathspec = [ - {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, - {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, -] -pathvalidate = [ - {file = "pathvalidate-2.3.2-py3-none-any.whl", hash = "sha256:cae8ad5cd9223c5c1f4bc4e2ef0cd4c5e89acd2d698fdb7610ee108b9be654d2"}, - {file = "pathvalidate-2.3.2.tar.gz", hash = "sha256:378c8b319838a255c00ab37f664686b75f0aabea4444d6c5a34effbec6738285"}, -] -pebble = [ - {file = "Pebble-4.5.0-py2.py3-none-any.whl", hash = "sha256:cae871610cc7f83d0ba780baab60e581ff762c7dd46bb601eed0727b070fcae3"}, - {file = "Pebble-4.5.0.tar.gz", hash = "sha256:2de3cd11aa068e0c4a4abbaf8d4ecfdac409d8bfb78a4c211a01f6a4fb17a35f"}, -] -pip-check = [ - {file = "pip-check-2.6.tar.gz", hash = "sha256:dc64ba7f857a51148f85a0f642ac110d344aea3c263ca3353209b329f6fa4601"}, - {file = "pip_check-2.6-py2.py3-none-any.whl", hash = "sha256:8793098131890c0eb86d46c572d34a60284e2f2833edca49d373c48c826a2e3f"}, -] -pip-upgrader = [ - {file = "pip_upgrader-1.4.15-py2.py3-none-any.whl", hash = "sha256:7ddfdfa3b6664469c00b50d23f3ed082d61b16babd0729f9d52090add54abdca"}, - {file = "pip_upgrader-1.4.15.tar.gz", hash = "sha256:ec07b93e06825d9cf40f475a8e021fc9d288446b479b40cb9aba406a6db65347"}, -] -pipreqs = [ - {file = "pipreqs-0.4.10-py2.py3-none-any.whl", hash = "sha256:cafe42ab70628d408c147fb8944bc303355ea8f91fddca4a98d273e572e39905"}, - {file = "pipreqs-0.4.10.tar.gz", hash = "sha256:9e351d644b28b98d7386b046a73806cbb3bb66b23a30e74feeb95ed9571db939"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -proto-plus = [ - {file = "proto-plus-1.13.0.tar.gz", hash = "sha256:61b57c5257ca583af2ea1ad40e2b8f251988806eea9f01d119088976b995b2c4"}, -] -protobuf = [ - {file = "protobuf-3.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:629b03fd3caae7f815b0c66b41273f6b1900a579e2ccb41ef4493a4f5fb84f3a"}, - {file = "protobuf-3.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:5b7a637212cc9b2bcf85dd828b1178d19efdf74dbfe1ddf8cd1b8e01fdaaa7f5"}, - {file = "protobuf-3.14.0-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:43b554b9e73a07ba84ed6cf25db0ff88b1e06be610b37656e292e3cbb5437472"}, - {file = "protobuf-3.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:5e9806a43232a1fa0c9cf5da8dc06f6910d53e4390be1fa06f06454d888a9142"}, - {file = "protobuf-3.14.0-cp35-cp35m-win32.whl", hash = "sha256:1c51fda1bbc9634246e7be6016d860be01747354ed7015ebe38acf4452f470d2"}, - {file = "protobuf-3.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:4b74301b30513b1a7494d3055d95c714b560fbb630d8fb9956b6f27992c9f980"}, - {file = "protobuf-3.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:86a75477addde4918e9a1904e5c6af8d7b691f2a3f65587d73b16100fbe4c3b2"}, - {file = "protobuf-3.14.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ecc33531a213eee22ad60e0e2aaea6c8ba0021f0cce35dbf0ab03dee6e2a23a1"}, - {file = "protobuf-3.14.0-cp36-cp36m-win32.whl", hash = "sha256:72230ed56f026dd664c21d73c5db73ebba50d924d7ba6b7c0d81a121e390406e"}, - {file = "protobuf-3.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:0fc96785262042e4863b3f3b5c429d4636f10d90061e1840fce1baaf59b1a836"}, - {file = "protobuf-3.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4e75105c9dfe13719b7293f75bd53033108f4ba03d44e71db0ec2a0e8401eafd"}, - {file = "protobuf-3.14.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2a7e2fe101a7ace75e9327b9c946d247749e564a267b0515cf41dfe450b69bac"}, - {file = "protobuf-3.14.0-cp37-cp37m-win32.whl", hash = "sha256:b0d5d35faeb07e22a1ddf8dce620860c8fe145426c02d1a0ae2688c6e8ede36d"}, - {file = "protobuf-3.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:8971c421dbd7aad930c9bd2694122f332350b6ccb5202a8b7b06f3f1a5c41ed5"}, - {file = "protobuf-3.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9616f0b65a30851e62f1713336c931fcd32c057202b7ff2cfbfca0fc7d5e3043"}, - {file = "protobuf-3.14.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:22bcd2e284b3b1d969c12e84dc9b9a71701ec82d8ce975fdda19712e1cfd4e00"}, - {file = "protobuf-3.14.0-py2.py3-none-any.whl", hash = "sha256:0e247612fadda953047f53301a7b0407cb0c3cb4ae25a6fde661597a04039b3c"}, - {file = "protobuf-3.14.0.tar.gz", hash = "sha256:1d63eb389347293d8915fb47bee0951c7b5dab522a4a60118b9a18f33e21f8ce"}, -] -psutil = [ - {file = "psutil-5.6.7-cp27-none-win32.whl", hash = "sha256:1b1575240ca9a90b437e5a40db662acd87bbf181f6aa02f0204978737b913c6b"}, - {file = "psutil-5.6.7-cp27-none-win_amd64.whl", hash = "sha256:28f771129bfee9fc6b63d83a15d857663bbdcae3828e1cb926e91320a9b5b5cd"}, - {file = "psutil-5.6.7-cp35-cp35m-win32.whl", hash = "sha256:21231ef1c1a89728e29b98a885b8e0a8e00d09018f6da5cdc1f43f988471a995"}, - {file = "psutil-5.6.7-cp35-cp35m-win_amd64.whl", hash = "sha256:b74b43fecce384a57094a83d2778cdfc2e2d9a6afaadd1ebecb2e75e0d34e10d"}, - {file = "psutil-5.6.7-cp36-cp36m-win32.whl", hash = "sha256:e85f727ffb21539849e6012f47b12f6dd4c44965e56591d8dec6e8bc9ab96f4a"}, - {file = "psutil-5.6.7-cp36-cp36m-win_amd64.whl", hash = "sha256:b560f5cd86cf8df7bcd258a851ca1ad98f0d5b8b98748e877a0aec4e9032b465"}, - {file = "psutil-5.6.7-cp37-cp37m-win32.whl", hash = "sha256:094f899ac3ef72422b7e00411b4ed174e3c5a2e04c267db6643937ddba67a05b"}, - {file = "psutil-5.6.7-cp37-cp37m-win_amd64.whl", hash = "sha256:fd2e09bb593ad9bdd7429e779699d2d47c1268cbde4dda95fcd1bd17544a0217"}, - {file = "psutil-5.6.7-cp38-cp38-win32.whl", hash = "sha256:70387772f84fa5c3bb6a106915a2445e20ac8f9821c5914d7cbde148f4d7ff73"}, - {file = "psutil-5.6.7-cp38-cp38-win_amd64.whl", hash = "sha256:10b7f75cc8bd676cfc6fa40cd7d5c25b3f45a0e06d43becd7c2d2871cbb5e806"}, - {file = "psutil-5.6.7.tar.gz", hash = "sha256:ffad8eb2ac614518bbe3c0b8eb9dffdb3a8d2e3a7d5da51c5b974fb723a5c5aa"}, -] -pur = [ - {file = "pur-5.3.0.tar.gz", hash = "sha256:8587c548469bcd8f47e1f7bd1cae3c11d9cd9c2e4219c86d08499b8efdfe1e05"}, -] -py = [ - {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, - {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, -] -py-stackexchange = [ - {file = "py-stackexchange-2.2.7.tar.gz", hash = "sha256:848bf85d98b95706750c61572fc2a2677cb8566e96b078bbe6261f0e2d8252b4"}, -] -pyasn1 = [ - {file = "pyasn1-0.4.8-py2.4.egg", hash = "sha256:fec3e9d8e36808a28efb59b489e4528c10ad0f480e57dcc32b4de5c9d8c9fdf3"}, - {file = "pyasn1-0.4.8-py2.5.egg", hash = "sha256:0458773cfe65b153891ac249bcf1b5f8f320b7c2ce462151f8fa74de8934becf"}, - {file = "pyasn1-0.4.8-py2.6.egg", hash = "sha256:5c9414dcfede6e441f7e8f81b43b34e834731003427e5b09e4e00e3172a10f00"}, - {file = "pyasn1-0.4.8-py2.7.egg", hash = "sha256:6e7545f1a61025a4e58bb336952c5061697da694db1cae97b116e9c46abcf7c8"}, - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8-py3.1.egg", hash = "sha256:78fa6da68ed2727915c4767bb386ab32cdba863caa7dbe473eaae45f9959da86"}, - {file = "pyasn1-0.4.8-py3.2.egg", hash = "sha256:08c3c53b75eaa48d71cf8c710312316392ed40899cb34710d092e96745a358b7"}, - {file = "pyasn1-0.4.8-py3.3.egg", hash = "sha256:03840c999ba71680a131cfaee6fab142e1ed9bbd9c693e285cc6aca0d555e576"}, - {file = "pyasn1-0.4.8-py3.4.egg", hash = "sha256:7ab8a544af125fb704feadb008c99a88805126fb525280b2270bb25cc1d78a12"}, - {file = "pyasn1-0.4.8-py3.5.egg", hash = "sha256:e89bf84b5437b532b0803ba5c9a5e054d21fec423a89952a74f87fa2c9b7bce2"}, - {file = "pyasn1-0.4.8-py3.6.egg", hash = "sha256:014c0e9976956a08139dc0712ae195324a75e142284d5f87f1a87ee1b068a359"}, - {file = "pyasn1-0.4.8-py3.7.egg", hash = "sha256:99fcc3c8d804d1bc6d9a099921e39d827026409a58f2a720dcdb89374ea0c776"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] -pyasn1-modules = [ - {file = "pyasn1-modules-0.2.8.tar.gz", hash = "sha256:905f84c712230b2c592c19470d3ca8d552de726050d1d1716282a1f6146be65e"}, - {file = "pyasn1_modules-0.2.8-py2.4.egg", hash = "sha256:0fe1b68d1e486a1ed5473f1302bd991c1611d319bba158e98b106ff86e1d7199"}, - {file = "pyasn1_modules-0.2.8-py2.5.egg", hash = "sha256:fe0644d9ab041506b62782e92b06b8c68cca799e1a9636ec398675459e031405"}, - {file = "pyasn1_modules-0.2.8-py2.6.egg", hash = "sha256:a99324196732f53093a84c4369c996713eb8c89d360a496b599fb1a9c47fc3eb"}, - {file = "pyasn1_modules-0.2.8-py2.7.egg", hash = "sha256:0845a5582f6a02bb3e1bde9ecfc4bfcae6ec3210dd270522fee602365430c3f8"}, - {file = "pyasn1_modules-0.2.8-py2.py3-none-any.whl", hash = "sha256:a50b808ffeb97cb3601dd25981f6b016cbb3d31fbf57a8b8a87428e6158d0c74"}, - {file = "pyasn1_modules-0.2.8-py3.1.egg", hash = "sha256:f39edd8c4ecaa4556e989147ebf219227e2cd2e8a43c7e7fcb1f1c18c5fd6a3d"}, - {file = "pyasn1_modules-0.2.8-py3.2.egg", hash = "sha256:b80486a6c77252ea3a3e9b1e360bc9cf28eaac41263d173c032581ad2f20fe45"}, - {file = "pyasn1_modules-0.2.8-py3.3.egg", hash = "sha256:65cebbaffc913f4fe9e4808735c95ea22d7a7775646ab690518c056784bc21b4"}, - {file = "pyasn1_modules-0.2.8-py3.4.egg", hash = "sha256:15b7c67fabc7fc240d87fb9aabf999cf82311a6d6fb2c70d00d3d0604878c811"}, - {file = "pyasn1_modules-0.2.8-py3.5.egg", hash = "sha256:426edb7a5e8879f1ec54a1864f16b882c2837bfd06eee62f2c982315ee2473ed"}, - {file = "pyasn1_modules-0.2.8-py3.6.egg", hash = "sha256:cbac4bc38d117f2a49aeedec4407d23e8866ea4ac27ff2cf7fb3e5b570df19e0"}, - {file = "pyasn1_modules-0.2.8-py3.7.egg", hash = "sha256:c29a5e5cc7a3f05926aff34e097e84f8589cd790ce0ed41b67aed6857b26aafd"}, -] -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"}, -] -pygments = [ - {file = "Pygments-2.8.0-py3-none-any.whl", hash = "sha256:b21b072d0ccdf29297a82a2363359d99623597b8a265b8081760e4d0f7153c88"}, - {file = "Pygments-2.8.0.tar.gz", hash = "sha256:37a13ba168a02ac54cc5891a42b1caec333e59b66addb7fa633ea8a6d73445c0"}, -] -pynacl = [ - {file = "PyNaCl-1.4.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ea6841bc3a76fa4942ce00f3bda7d436fda21e2d91602b9e21b7ca9ecab8f3ff"}, - {file = "PyNaCl-1.4.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:d452a6746f0a7e11121e64625109bc4468fc3100452817001dbe018bb8b08514"}, - {file = "PyNaCl-1.4.0-cp27-cp27m-win32.whl", hash = "sha256:2fe0fc5a2480361dcaf4e6e7cea00e078fcda07ba45f811b167e3f99e8cff574"}, - {file = "PyNaCl-1.4.0-cp27-cp27m-win_amd64.whl", hash = "sha256:f8851ab9041756003119368c1e6cd0b9c631f46d686b3904b18c0139f4419f80"}, - {file = "PyNaCl-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7757ae33dae81c300487591c68790dfb5145c7d03324000433d9a2c141f82af7"}, - {file = "PyNaCl-1.4.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:757250ddb3bff1eecd7e41e65f7f833a8405fede0194319f87899690624f2122"}, - {file = "PyNaCl-1.4.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:30f9b96db44e09b3304f9ea95079b1b7316b2b4f3744fe3aaecccd95d547063d"}, - {file = "PyNaCl-1.4.0-cp35-abi3-win32.whl", hash = "sha256:4e10569f8cbed81cb7526ae137049759d2a8d57726d52c1a000a3ce366779634"}, - {file = "PyNaCl-1.4.0-cp35-abi3-win_amd64.whl", hash = "sha256:c914f78da4953b33d4685e3cdc7ce63401247a21425c16a39760e282075ac4a6"}, - {file = "PyNaCl-1.4.0-cp35-cp35m-win32.whl", hash = "sha256:06cbb4d9b2c4bd3c8dc0d267416aaed79906e7b33f114ddbf0911969794b1cc4"}, - {file = "PyNaCl-1.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:511d269ee845037b95c9781aa702f90ccc36036f95d0f31373a6a79bd8242e25"}, - {file = "PyNaCl-1.4.0-cp36-cp36m-win32.whl", hash = "sha256:11335f09060af52c97137d4ac54285bcb7df0cef29014a1a4efe64ac065434c4"}, - {file = "PyNaCl-1.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:cd401ccbc2a249a47a3a1724c2918fcd04be1f7b54eb2a5a71ff915db0ac51c6"}, - {file = "PyNaCl-1.4.0-cp37-cp37m-win32.whl", hash = "sha256:8122ba5f2a2169ca5da936b2e5a511740ffb73979381b4229d9188f6dcb22f1f"}, - {file = "PyNaCl-1.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:537a7ccbea22905a0ab36ea58577b39d1fa9b1884869d173b5cf111f006f689f"}, - {file = "PyNaCl-1.4.0-cp38-cp38-win32.whl", hash = "sha256:9c4a7ea4fb81536c1b1f5cc44d54a296f96ae78c1ebd2311bd0b60be45a48d96"}, - {file = "PyNaCl-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7c6092102219f59ff29788860ccb021e80fffd953920c4a8653889c029b2d420"}, - {file = "PyNaCl-1.4.0.tar.gz", hash = "sha256:54e9a2c849c742006516ad56a88f5c74bf2ce92c9f67435187c3c5953b346505"}, -] -pynt = [ - {file = "pynt-0.8.2-py3-none-any.whl", hash = "sha256:be13be37f8237be4a6f6f3031aebcb0c2e61a1894a85a21b85a21e397961c7b3"}, - {file = "pynt-0.8.2.tar.gz", hash = "sha256:f38b9b775804eff6e291bd6894669954d94c680b196adee56c96d082a135483c"}, -] -pynt-contrib = [ - {file = "pynt-contrib-0.2.0.tar.gz", hash = "sha256:99e0b3bb9ca674a49002fbde9e206d1c785a68912870ec9924d4d9362e5aaf50"}, -] -pyparsing = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] -pypinfo = [ - {file = "pypinfo-18.0.1-py3-none-any.whl", hash = "sha256:0977a0bd8b62a0ab91e3ce10291b60a85b3484d2836595f481f64ae6b773a81c"}, - {file = "pypinfo-18.0.1.tar.gz", hash = "sha256:2be463e6a85a6feebe1ab56c720d72e8a16f6662432f9dd68fa0356459242b89"}, -] -pypistats = [ - {file = "pypistats-0.12.1-py3-none-any.whl", hash = "sha256:e3c8f535d24c0e877d2802a0e714448fbc48c53b81fb114416ed6dfefbe404cc"}, - {file = "pypistats-0.12.1.tar.gz", hash = "sha256:7148ca8776f0e94c6a96a670014bb9e66ea4cbcde352110480eb30aaa4522614"}, -] -pyrankvote = [ - {file = "pyrankvote-2.0.2-py3-none-any.whl", hash = "sha256:0f5061c5b400f04daff69ce43938cdb662bb8b6e77b93bce25743f679cbd0d53"}, - {file = "pyrankvote-2.0.2.tar.gz", hash = "sha256:62f5d26ae73ea098be80b2cfdfa46f8c40aed8983eadf1a1a5de3369160bcb50"}, -] -pyrsistent = [ - {file = "pyrsistent-0.17.3.tar.gz", hash = "sha256:2e636185d9eb976a18a8a8e96efce62f2905fea90041958d8cc2a189756ebf3e"}, -] -pytablewriter = [ - {file = "pytablewriter-0.58.0-py3-none-any.whl", hash = "sha256:763fb7717b64320188b2f55c5667f9f03c6fef3b00ac0aaafa85b6b6f2741b36"}, - {file = "pytablewriter-0.58.0.tar.gz", hash = "sha256:d232491e32fc84f28a6217fcd225d2ed82ae59d576d39724c98fdb7c7147b9ec"}, -] -pytest = [ - {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.11.1.tar.gz", hash = "sha256:359952d9d39b9f822d9d29324483e7ba04a3a17dd7d05aa6beb7ea01e359e5f7"}, - {file = "pytest_cov-2.11.1-py2.py3-none-any.whl", hash = "sha256:bdb9fdb0b85a7cc825269a4c56b48ccaa5c7e365054b6038772c32ddcdc969da"}, -] -pytest-forked = [ - {file = "pytest-forked-1.3.0.tar.gz", hash = "sha256:6aa9ac7e00ad1a539c41bec6d21011332de671e938c7637378ec9710204e37ca"}, - {file = "pytest_forked-1.3.0-py2.py3-none-any.whl", hash = "sha256:dc4147784048e70ef5d437951728825a131b81714b398d5d52f17c7c144d8815"}, -] -pytest-timeout = [ - {file = "pytest-timeout-1.4.2.tar.gz", hash = "sha256:20b3113cf6e4e80ce2d403b6fb56e9e1b871b510259206d40ff8d609f48bda76"}, - {file = "pytest_timeout-1.4.2-py2.py3-none-any.whl", hash = "sha256:541d7aa19b9a6b4e475c759fd6073ef43d7cdc9a92d95644c260076eb257a063"}, -] -pytest-xdist = [ - {file = "pytest-xdist-2.2.1.tar.gz", hash = "sha256:718887296892f92683f6a51f25a3ae584993b06f7076ce1e1fd482e59a8220a2"}, - {file = "pytest_xdist-2.2.1-py3-none-any.whl", hash = "sha256:2447a1592ab41745955fb870ac7023026f20a5f0bfccf1b52a879bd193d46450"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, - {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, -] -python-dotenv = [ - {file = "python-dotenv-0.11.0.tar.gz", hash = "sha256:8429f459fc041237d98c9ff32e1938e7e5535b5ff24388876315a098027c3a57"}, - {file = "python_dotenv-0.11.0-py2.py3-none-any.whl", hash = "sha256:ca9f3debf2262170d6f46571ce4d6ca1add60bb93b69c3a29dcb3d1a00a65c93"}, -] -python-slugify = [ - {file = "python-slugify-4.0.1.tar.gz", hash = "sha256:69a517766e00c1268e5bbfc0d010a0a8508de0b18d30ad5a1ff357f8ae724270"}, -] -pytz = [ - {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, - {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, -] -pyupgrade = [ - {file = "pyupgrade-2.0.2-py2.py3-none-any.whl", hash = "sha256:3d81ecec17cc6be0db2aca48d3756f4542ecfaa18855d3dfa2962ac6425db9f3"}, - {file = "pyupgrade-2.0.2.tar.gz", hash = "sha256:5f26bfc17402f612a675c181f3e7d07542b519d9df67e5d01704c203d0c79523"}, -] -pywin32 = [ - {file = "pywin32-300-cp35-cp35m-win32.whl", hash = "sha256:1c204a81daed2089e55d11eefa4826c05e604d27fe2be40b6bf8db7b6a39da63"}, - {file = "pywin32-300-cp35-cp35m-win_amd64.whl", hash = "sha256:350c5644775736351b77ba68da09a39c760d75d2467ecec37bd3c36a94fbed64"}, - {file = "pywin32-300-cp36-cp36m-win32.whl", hash = "sha256:a3b4c48c852d4107e8a8ec980b76c94ce596ea66d60f7a697582ea9dce7e0db7"}, - {file = "pywin32-300-cp36-cp36m-win_amd64.whl", hash = "sha256:27a30b887afbf05a9cbb05e3ffd43104a9b71ce292f64a635389dbad0ed1cd85"}, - {file = "pywin32-300-cp37-cp37m-win32.whl", hash = "sha256:d7e8c7efc221f10d6400c19c32a031add1c4a58733298c09216f57b4fde110dc"}, - {file = "pywin32-300-cp37-cp37m-win_amd64.whl", hash = "sha256:8151e4d7a19262d6694162d6da85d99a16f8b908949797fd99c83a0bfaf5807d"}, - {file = "pywin32-300-cp38-cp38-win32.whl", hash = "sha256:fbb3b1b0fbd0b4fc2a3d1d81fe0783e30062c1abed1d17c32b7879d55858cfae"}, - {file = "pywin32-300-cp38-cp38-win_amd64.whl", hash = "sha256:60a8fa361091b2eea27f15718f8eb7f9297e8d51b54dbc4f55f3d238093d5190"}, - {file = "pywin32-300-cp39-cp39-win32.whl", hash = "sha256:638b68eea5cfc8def537e43e9554747f8dee786b090e47ead94bfdafdb0f2f50"}, - {file = "pywin32-300-cp39-cp39-win_amd64.whl", hash = "sha256:b1609ce9bd5c411b81f941b246d683d6508992093203d4eb7f278f4ed1085c3f"}, -] -pyyaml = [ - {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, - {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, - {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, - {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, - {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, - {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, - {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, - {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, - {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, - {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, -] -random-names = [ - {file = "random_names-0.1.0-py3-none-any.whl", hash = "sha256:8f4af6952b4b70d7cf8a7c9a0211fd8593cee42fe364debbfbf596e918cee923"}, - {file = "random_names-0.1.0.tar.gz", hash = "sha256:b7d83e7ee38c767cb506f34c3d6bc7df3d96f556547bc191b6ffced5f34214b8"}, -] -regex = [ - {file = "regex-2020.11.13-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b882a78c320478b12ff024e81dc7d43c1462aa4a3341c754ee65d857a521f85"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:a63f1a07932c9686d2d416fb295ec2c01ab246e89b4d58e5fa468089cab44b70"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:6e4b08c6f8daca7d8f07c8d24e4331ae7953333dbd09c648ed6ebd24db5a10ee"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bba349276b126947b014e50ab3316c027cac1495992f10e5682dc677b3dfa0c5"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:56e01daca75eae420bce184edd8bb341c8eebb19dd3bce7266332258f9fb9dd7"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:6a8ce43923c518c24a2579fda49f093f1397dad5d18346211e46f134fc624e31"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:1ab79fcb02b930de09c76d024d279686ec5d532eb814fd0ed1e0051eb8bd2daa"}, - {file = "regex-2020.11.13-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:9801c4c1d9ae6a70aeb2128e5b4b68c45d4f0af0d1535500884d644fa9b768c6"}, - {file = "regex-2020.11.13-cp36-cp36m-win32.whl", hash = "sha256:49cae022fa13f09be91b2c880e58e14b6da5d10639ed45ca69b85faf039f7a4e"}, - {file = "regex-2020.11.13-cp36-cp36m-win_amd64.whl", hash = "sha256:749078d1eb89484db5f34b4012092ad14b327944ee7f1c4f74d6279a6e4d1884"}, - {file = "regex-2020.11.13-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b2f4007bff007c96a173e24dcda236e5e83bde4358a557f9ccf5e014439eae4b"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38c8fd190db64f513fe4e1baa59fed086ae71fa45083b6936b52d34df8f86a88"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5862975b45d451b6db51c2e654990c1820523a5b07100fc6903e9c86575202a0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:262c6825b309e6485ec2493ffc7e62a13cf13fb2a8b6d212f72bd53ad34118f1"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:bafb01b4688833e099d79e7efd23f99172f501a15c44f21ea2118681473fdba0"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e32f5f3d1b1c663af7f9c4c1e72e6ffe9a78c03a31e149259f531e0fed826512"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:3bddc701bdd1efa0d5264d2649588cbfda549b2899dc8d50417e47a82e1387ba"}, - {file = "regex-2020.11.13-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:02951b7dacb123d8ea6da44fe45ddd084aa6777d4b2454fa0da61d569c6fa538"}, - {file = "regex-2020.11.13-cp37-cp37m-win32.whl", hash = "sha256:0d08e71e70c0237883d0bef12cad5145b84c3705e9c6a588b2a9c7080e5af2a4"}, - {file = "regex-2020.11.13-cp37-cp37m-win_amd64.whl", hash = "sha256:1fa7ee9c2a0e30405e21031d07d7ba8617bc590d391adfc2b7f1e8b99f46f444"}, - {file = "regex-2020.11.13-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:baf378ba6151f6e272824b86a774326f692bc2ef4cc5ce8d5bc76e38c813a55f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e3faaf10a0d1e8e23a9b51d1900b72e1635c2d5b0e1bea1c18022486a8e2e52d"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2a11a3e90bd9901d70a5b31d7dd85114755a581a5da3fc996abfefa48aee78af"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1ebb090a426db66dd80df8ca85adc4abfcbad8a7c2e9a5ec7513ede522e0a8f"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b2b1a5ddae3677d89b686e5c625fc5547c6e492bd755b520de5332773a8af06b"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:2c99e97d388cd0a8d30f7c514d67887d8021541b875baf09791a3baad48bb4f8"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:c084582d4215593f2f1d28b65d2a2f3aceff8342aa85afd7be23a9cad74a0de5"}, - {file = "regex-2020.11.13-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:a3d748383762e56337c39ab35c6ed4deb88df5326f97a38946ddd19028ecce6b"}, - {file = "regex-2020.11.13-cp38-cp38-win32.whl", hash = "sha256:7913bd25f4ab274ba37bc97ad0e21c31004224ccb02765ad984eef43e04acc6c"}, - {file = "regex-2020.11.13-cp38-cp38-win_amd64.whl", hash = "sha256:6c54ce4b5d61a7129bad5c5dc279e222afd00e721bf92f9ef09e4fae28755683"}, - {file = "regex-2020.11.13-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1862a9d9194fae76a7aaf0150d5f2a8ec1da89e8b55890b1786b8f88a0f619dc"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_i686.whl", hash = "sha256:4902e6aa086cbb224241adbc2f06235927d5cdacffb2425c73e6570e8d862364"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7a25fcbeae08f96a754b45bdc050e1fb94b95cab046bf56b016c25e9ab127b3e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:d2d8ce12b7c12c87e41123997ebaf1a5767a5be3ec545f64675388970f415e2e"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:f7d29a6fc4760300f86ae329e3b6ca28ea9c20823df123a2ea8693e967b29917"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:717881211f46de3ab130b58ec0908267961fadc06e44f974466d1887f865bd5b"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3128e30d83f2e70b0bed9b2a34e92707d0877e460b402faca908c6667092ada9"}, - {file = "regex-2020.11.13-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:8f6a2229e8ad946e36815f2a03386bb8353d4bde368fdf8ca5f0cb97264d3b5c"}, - {file = "regex-2020.11.13-cp39-cp39-win32.whl", hash = "sha256:f8f295db00ef5f8bae530fc39af0b40486ca6068733fb860b42115052206466f"}, - {file = "regex-2020.11.13-cp39-cp39-win_amd64.whl", hash = "sha256:a15f64ae3a027b64496a71ab1f722355e570c3fac5ba2801cafce846bf5af01d"}, - {file = "regex-2020.11.13.tar.gz", hash = "sha256:83d6b356e116ca119db8e7c6fc2983289d87b27b3fac238cfe5dca529d884562"}, -] -requests = [ - {file = "requests-2.22.0-py2.py3-none-any.whl", hash = "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"}, - {file = "requests-2.22.0.tar.gz", hash = "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4"}, -] -rsa = [ - {file = "rsa-4.7-py3-none-any.whl", hash = "sha256:a8774e55b59fd9fc893b0d05e9bfc6f47081f46ff5b46f39ccf24631b7be356b"}, - {file = "rsa-4.7.tar.gz", hash = "sha256:69805d6b69f56eb05b62daea3a7dbd7aa44324ad1306445e05da8060232d00f4"}, -] -safety = [ - {file = "safety-1.10.3-py2.py3-none-any.whl", hash = "sha256:5f802ad5df5614f9622d8d71fedec2757099705c2356f862847c58c6dfe13e84"}, - {file = "safety-1.10.3.tar.gz", hash = "sha256:30e394d02a20ac49b7f65292d19d38fa927a8f9582cdfd3ad1adbbc66c641ad5"}, -] -search-engine-parser = [ - {file = "search-engine-parser-0.6.2.tar.gz", hash = "sha256:1a6114e5ee34a93f8ef91ff6f874cb0009391587d075a813375a84b752fbe0a0"}, -] -semantic-version = [ - {file = "semantic_version-2.8.5-py2.py3-none-any.whl", hash = "sha256:45e4b32ee9d6d70ba5f440ec8cc5221074c7f4b0e8918bdab748cc37912440a9"}, - {file = "semantic_version-2.8.5.tar.gz", hash = "sha256:d2cb2de0558762934679b9a104e82eca7af448c9f4974d1f3eeccff651df8a54"}, -] -sh = [ - {file = "sh-1.14.1-py2.py3-none-any.whl", hash = "sha256:75e86a836f47de095d4531718fe8489e6f7446c75ddfa5596f632727b919ffae"}, - {file = "sh-1.14.1.tar.gz", hash = "sha256:39aa9af22f6558a0c5d132881cf43e34828ca03e4ae11114852ca6a55c7c1d8e"}, -] -six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, -] -slpp-23 = [ - {file = "SLPP-23-1.1.tar.gz", hash = "sha256:f49f710c3ebd4fd773af9ddca7311b522f151581447e4d3cb127034cd88bb485"}, - {file = "SLPP_23-1.1-py2.py3-none-any.whl", hash = "sha256:47a81bce829bdf4ef2b79d42b4847dcf5430d7c1682b6582161d5cead03c4106"}, -] -smmap = [ - {file = "smmap-3.0.5-py2.py3-none-any.whl", hash = "sha256:7bfcf367828031dc893530a29cb35eb8c8f2d7c8f2d0989354d75d24c8573714"}, - {file = "smmap-3.0.5.tar.gz", hash = "sha256:84c2751ef3072d4f6b2785ec7ee40244c6f45eb934d9e543e2c51f1bd3d54c50"}, -] -soupsieve = [ - {file = "soupsieve-1.9.6-py2.py3-none-any.whl", hash = "sha256:feb1e937fa26a69e08436aad4a9037cd7e1d4c7212909502ba30701247ff8abd"}, - {file = "soupsieve-1.9.6.tar.gz", hash = "sha256:7985bacc98c34923a439967c1a602dc4f1e15f923b6fcf02344184f86cc7efaa"}, -] -sshtunnel = [ - {file = "sshtunnel-0.4.0-py2.py3-none-any.whl", hash = "sha256:98e54c26f726ab8bd42b47a3a21fca5c3e60f58956f0f70de2fb8ab0046d0606"}, - {file = "sshtunnel-0.4.0-py3.8.egg", hash = "sha256:4a07cf989712e8ba76a370584bec922d14775054b3ff18e5d075507a298dc3ed"}, - {file = "sshtunnel-0.4.0.tar.gz", hash = "sha256:e7cb0ea774db81bf91844db22de72a40aae8f7b0f9bb9ba0f666d474ef6bf9fc"}, -] -stackapi = [ - {file = "StackAPI-0.1.12.tar.gz", hash = "sha256:1f318bd706301b8f9d50f95bee794b39cbd484cdc948de0104180b7b93682661"}, -] -stdlib-list = [ - {file = "stdlib-list-0.8.0.tar.gz", hash = "sha256:a1e503719720d71e2ed70ed809b385c60cd3fb555ba7ec046b96360d30b16d9f"}, - {file = "stdlib_list-0.8.0-py3-none-any.whl", hash = "sha256:2ae0712a55b68f3fbbc9e58d6fa1b646a062188f49745b495f94d3310a9fdd3e"}, -] -tabledata = [ - {file = "tabledata-1.1.3-py3-none-any.whl", hash = "sha256:59cc3b5f0c52ea142386b0653d3d48d2e976fe021154871982b4d234b82be747"}, - {file = "tabledata-1.1.3.tar.gz", hash = "sha256:fa4c2db55cbb198ca5e21063ae743f418d3efbba94cd4844d2f759f994df76a2"}, -] -tabulate = [ - {file = "tabulate-0.8.7-py3-none-any.whl", hash = "sha256:ac64cb76d53b1231d364babcd72abbb16855adac7de6665122f97b593f1eb2ba"}, - {file = "tabulate-0.8.7.tar.gz", hash = "sha256:db2723a20d04bcda8522165c73eea7c300eda74e0ce852d9022e0159d7895007"}, -] -tcolorpy = [ - {file = "tcolorpy-0.0.8-py3-none-any.whl", hash = "sha256:12b5c928572781fc7e5df5629da6342a65ec7d35efb64b5824c105b8debaaac7"}, - {file = "tcolorpy-0.0.8.tar.gz", hash = "sha256:ffbe886f1321dab88d9cfd4218ea8d93d50d6ad0875c3741dd75fe1437379406"}, -] -terminaltables = [ - {file = "terminaltables-3.1.0.tar.gz", hash = "sha256:f3eb0eb92e3833972ac36796293ca0906e998dc3be91fbe1f8615b331b853b81"}, -] -text-unidecode = [ - {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, - {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, -] -tinydb = [ - {file = "tinydb-4.4.0-py3-none-any.whl", hash = "sha256:30b0f718ebb288e42d2f69f3e1b18928739f25153e6b5308a234e95c1673de71"}, - {file = "tinydb-4.4.0.tar.gz", hash = "sha256:d57c29524ecacc081ebc24f96e0d787bba11dc20d52634a32a709b878be3545a"}, -] -tinyrecord = [ - {file = "tinyrecord-0.2.0.tar.gz", hash = "sha256:eb6dc23601be359ee00f5a3d31a46adf3bad0a16f8d60af216cd67982ca75cf4"}, -] -tokenize-rt = [ - {file = "tokenize_rt-3.2.0-py2.py3-none-any.whl", hash = "sha256:53f5c22d36e5c6f8e3fdbc6cb4dd151d1b3d38cea1b85b5fef6268f153733899"}, - {file = "tokenize_rt-3.2.0.tar.gz", hash = "sha256:2f44eee8f620102f8a03c50142795121faf86e020d208896ea7a7047bbe933cf"}, -] -toml = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] -traitlets = [ - {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, - {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, -] -typed-ast = [ - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7703620125e4fb79b64aa52427ec192822e9f45d37d4b6625ab37ef403e1df70"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c9aadc4924d4b5799112837b226160428524a9a45f830e0d0f184b19e4090487"}, - {file = "typed_ast-1.4.2-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:9ec45db0c766f196ae629e509f059ff05fc3148f9ffd28f3cfe75d4afb485412"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win32.whl", hash = "sha256:85f95aa97a35bdb2f2f7d10ec5bbdac0aeb9dafdaf88e17492da0504de2e6400"}, - {file = "typed_ast-1.4.2-cp35-cp35m-win_amd64.whl", hash = "sha256:9044ef2df88d7f33692ae3f18d3be63dec69c4fb1b5a4a9ac950f9b4ba571606"}, - {file = "typed_ast-1.4.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c1c876fd795b36126f773db9cbb393f19808edd2637e00fd6caba0e25f2c7b64"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5dcfc2e264bd8a1db8b11a892bd1647154ce03eeba94b461effe68790d8b8e07"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:8db0e856712f79c45956da0c9a40ca4246abc3485ae0d7ecc86a20f5e4c09abc"}, - {file = "typed_ast-1.4.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d003156bb6a59cda9050e983441b7fa2487f7800d76bdc065566b7d728b4581a"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win32.whl", hash = "sha256:4c790331247081ea7c632a76d5b2a265e6d325ecd3179d06e9cf8d46d90dd151"}, - {file = "typed_ast-1.4.2-cp36-cp36m-win_amd64.whl", hash = "sha256:d175297e9533d8d37437abc14e8a83cbc68af93cc9c1c59c2c292ec59a0697a3"}, - {file = "typed_ast-1.4.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:cf54cfa843f297991b7388c281cb3855d911137223c6b6d2dd82a47ae5125a41"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:b4fcdcfa302538f70929eb7b392f536a237cbe2ed9cba88e3bf5027b39f5f77f"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:987f15737aba2ab5f3928c617ccf1ce412e2e321c77ab16ca5a293e7bbffd581"}, - {file = "typed_ast-1.4.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:37f48d46d733d57cc70fd5f30572d11ab8ed92da6e6b28e024e4a3edfb456e37"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win32.whl", hash = "sha256:36d829b31ab67d6fcb30e185ec996e1f72b892255a745d3a82138c97d21ed1cd"}, - {file = "typed_ast-1.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:8368f83e93c7156ccd40e49a783a6a6850ca25b556c0fa0240ed0f659d2fe496"}, - {file = "typed_ast-1.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:963c80b583b0661918718b095e02303d8078950b26cc00b5e5ea9ababe0de1fc"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:e683e409e5c45d5c9082dc1daf13f6374300806240719f95dc783d1fc942af10"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:84aa6223d71012c68d577c83f4e7db50d11d6b1399a9c779046d75e24bed74ea"}, - {file = "typed_ast-1.4.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:a38878a223bdd37c9709d07cd357bb79f4c760b29210e14ad0fb395294583787"}, - {file = "typed_ast-1.4.2-cp38-cp38-win32.whl", hash = "sha256:a2c927c49f2029291fbabd673d51a2180038f8cd5a5b2f290f78c4516be48be2"}, - {file = "typed_ast-1.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:c0c74e5579af4b977c8b932f40a5464764b2f86681327410aa028a22d2f54937"}, - {file = "typed_ast-1.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:07d49388d5bf7e863f7fa2f124b1b1d89d8aa0e2f7812faff0a5658c01c59aa1"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:240296b27397e4e37874abb1df2a608a92df85cf3e2a04d0d4d61055c8305ba6"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d746a437cdbca200622385305aedd9aef68e8a645e385cc483bdc5e488f07166"}, - {file = "typed_ast-1.4.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:14bf1522cdee369e8f5581238edac09150c765ec1cb33615855889cf33dcb92d"}, - {file = "typed_ast-1.4.2-cp39-cp39-win32.whl", hash = "sha256:cc7b98bf58167b7f2db91a4327da24fb93368838eb84a44c472283778fc2446b"}, - {file = "typed_ast-1.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:7147e2a76c75f0f64c4319886e7639e490fee87c9d25cb1d4faef1d8cf83a440"}, - {file = "typed_ast-1.4.2.tar.gz", hash = "sha256:9fc0b3cb5d1720e7141d103cf4819aea239f7d136acf9ee4a69b047b7986175a"}, -] -typepy = [ - {file = "typepy-1.1.3-py3-none-any.whl", hash = "sha256:92b634a858c611015a803fbb0bdfe92f3c872d3e5858351de24778bbbb4137e3"}, - {file = "typepy-1.1.3.tar.gz", hash = "sha256:bf548556e07c069e1b7c74cb7175e696021aed2cf3740577af91dd871ec2c05e"}, -] -typing-extensions = [ - {file = "typing_extensions-3.7.4.3-py2-none-any.whl", hash = "sha256:dafc7639cde7f1b6e1acc0f457842a83e722ccca8eef5270af2d74792619a89f"}, - {file = "typing_extensions-3.7.4.3-py3-none-any.whl", hash = "sha256:7cb407020f00f7bfc3cb3e7881628838e69d8f3fcab2f64742a5e76b2f841918"}, - {file = "typing_extensions-3.7.4.3.tar.gz", hash = "sha256:99d4073b617d30288f569d3f13d2bd7548c3a7e4c8de87db09a9d29bb3a4a60c"}, -] -urllib3 = [ - {file = "urllib3-1.25.11-py2.py3-none-any.whl", hash = "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e"}, - {file = "urllib3-1.25.11.tar.gz", hash = "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2"}, -] -vendorize = [ - {file = "vendorize-0.2.1-py2.py3-none-any.whl", hash = "sha256:f05d756044657c30e7d46591a5f27009d4611903999df1cecbf791eebc3bc2ce"}, - {file = "vendorize-0.2.1.tar.gz", hash = "sha256:31f72bef2e49a6cec0e0335025eb687d21e4cdd9d81e7299d588a182c5a0c928"}, -] -vermin = [ - {file = "vermin-1.1.0-py2.py3-none-any.whl", hash = "sha256:ab0c03ec1199c477ea49196355e2320934bfedc64605186c40850df36f5c64a0"}, -] -whats-that-code = [ - {file = "whats_that_code-0.1.10-py3-none-any.whl", hash = "sha256:7b07589f0e8ac296312256ad6c1533614e63976e441de5a381f861a770807623"}, - {file = "whats_that_code-0.1.10.tar.gz", hash = "sha256:e20cee08038a0904f962a53c69f0dd0db4e548bbbffe6d33786b5fbc59da9b10"}, -] -wrapt = [ - {file = "wrapt-1.12.1.tar.gz", hash = "sha256:b62ffa81fb85f4332a4f609cab4ac40709470da05643a082ec1eb88e6d9b97d7"}, -] -yarg = [ - {file = "yarg-0.1.9-py2.py3-none-any.whl", hash = "sha256:4f9cebdc00fac946c9bf2783d634e538a71c7d280a4d806d45fd4dc0ef441492"}, - {file = "yarg-0.1.9.tar.gz", hash = "sha256:55695bf4d1e3e7f756496c36a69ba32c40d18f821e38f61d028f6049e5e15911"}, -] -yarl = [ - {file = "yarl-1.6.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366"}, - {file = "yarl-1.6.3-cp36-cp36m-win32.whl", hash = "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721"}, - {file = "yarl-1.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643"}, - {file = "yarl-1.6.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970"}, - {file = "yarl-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e"}, - {file = "yarl-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50"}, - {file = "yarl-1.6.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2"}, - {file = "yarl-1.6.3-cp38-cp38-win32.whl", hash = "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896"}, - {file = "yarl-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a"}, - {file = "yarl-1.6.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4"}, - {file = "yarl-1.6.3-cp39-cp39-win32.whl", hash = "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424"}, - {file = "yarl-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6"}, - {file = "yarl-1.6.3.tar.gz", hash = "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10"}, -] -zipp = [ - {file = "zipp-3.4.0-py3-none-any.whl", hash = "sha256:102c24ef8f171fd729d46599845e95c7ab894a4cf45f5de11a44cc7444fb1108"}, - {file = "zipp-3.4.0.tar.gz", hash = "sha256:ed5eee1974372595f9e416cc7bbeeb12335201d8081ca8a0743c954d4446e5cb"}, -] +lock-version = "2.0" +python-versions = ">=3.11, <4.0" +content-hash = "c77aae2f172b92d21cb25f383905146f7cbe8bce696031734f5272349d625c1c" diff --git a/pyproject.toml b/pyproject.toml index 4de8f98..7ed49b8 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "so_pip" -version = "0.1.31" +version = "1.0.0" description = "Generate packages from Stackoverflow answers" authors = ["Matthew Martin "] keywords = ["packaging", "stackoverflow"] @@ -39,75 +39,63 @@ documentation ="https://github.com/matthewdeanmartin/so_pip" so_pip = 'so_pip.__main__:main' [tool.poetry.dependencies] -python = ">=3.6, <4.0" +python = ">=3.11, <4.0" # core functions -python-dotenv = "*" -diskcache = "*" -html2text = "*" -jinja2 = "*" -pyrankvote = "*" +python-dotenv = ">=1.0.0" +diskcache = ">=5.6.3" +html2text = ">=2020.1.16" +jinja2 = ">=3.1.2" +pyrankvote = ">=2.0.6" # api -requests = "*" -py-stackexchange = "*" -beautifulsoup4 = "*" -stackapi = "*" -search-engine-parser = "*" +requests = ">=2.31.0" +py-stackexchange = ">=2.2.7" +beautifulsoup4 = ">=4.12.2" +stackapi = ">=0.3.0" +search-engine-parser = ">=0.6.8" # py tools -black = "*" -pipreqs = "*" -pyupgrade = "*" -2to3 = "*" -pyflakes = "*" -stdlib-list = "*" -pip-upgrader = "*" -pur = "*" -pypistats = "*" -pypinfo = "*" -vermin = "*" -astroid = "*" -safety = "*" +black = ">=23.10.1" +pipreqs = ">=0.4.13" +pyupgrade = ">=3.15.0" +2to3 = ">=1.0" +pyflakes = ">=3.1.0" +stdlib-list = ">=0.9.0" +pip-upgrader = ">=1.4.15" +pur = ">=7.3.1" +pypistats = ">=1.5.0" +pypinfo = ">=21.0.0" +vermin = ">=1.5.2" +astroid = ">=3.0.1" +# must pipx install, conflicts with tox +# safety = ">=2.3.5" # Not just py -nbformat = "*" -markdown = "*" -toml = "*" -slpp-23 = "*" +nbformat = ">=5.9.2" +markdown = ">=3.5.1" +toml = ">=0.10.2" +slpp-23 = ">=1.1" # projects split out from so_pip -random-names = "*" +random-names = ">=0.2.0" whats-that-code = ">=0.1.10" -navio-builder-win = "^0.1.52" + [tool.poetry.dev-dependencies] -pytest = "==6.0.1" +pytest = ">=6.0.1" pytest-cov = ">=2.10.1" -pytest-timeout = "*" -pytest-xdist = ">=2.1.0" -pip-check = "==2.6" -pynt = "==0.8.2" -pynt-contrib = "==0.2.0" -checksumdir = "==1.1.7" -requests = "==2.22.0" -dodgy = "==0.2.1" -gitchangelog = "==3.0.4" -liccheck = "==0.4.3" -psutil = "==5.6.7" -pebble = "==4.5.0" -python-dotenv = "==0.11.0" -gitpython = "*" -sshtunnel = "*" -ifaddr = "*" -vendorize = "*" -# dotenv-linter = "==0.1.5" -# colorama = "==0.4.1" -# click = "==6.7" -# hypothesis = "*" +vendorize = ">=0.3.0" +tox = ">=4.11.3" +types-requests = "*" +types-toml = "*" +types-markdown = "*" +mypy = ">=1.6.1" +pre-commit = ">=3.5.0" +ruff = ">=0.1.3" [tool.black] line-length = 88 -target-version = ['py37'] +target-version = ['py311'] include = '\.pyi?$' exclude = ''' @@ -129,8 +117,8 @@ exclude = ''' ) ''' [build-system] -requires = ["poetry>=0.12"] -build-backend = "poetry.masonry.api" +requires = ["poetry-core>=1.0.0"] +build-backend = "poetry.core.masonry.api" [tool.pytest.ini_options] minversion = "6.0" diff --git a/scripts/.so_pip.ini b/scripts/.so_pip.ini index 45e5135..92c6b02 100644 --- a/scripts/.so_pip.ini +++ b/scripts/.so_pip.ini @@ -52,4 +52,4 @@ POSSIBLE_LANGUAGES = ['python','javascript','go','lua'] # cli client stuff [SHELL_CONFIG] -SHELL = pipenv run +SHELL = poetry run diff --git a/scripts/mass_harvest.py b/scripts/mass_harvest.py index 0266206..d752c6b 100644 --- a/scripts/mass_harvest.py +++ b/scripts/mass_harvest.py @@ -9,11 +9,12 @@ settings.OUTPUT_FOLDER = find_file("../../output/unittest/", __file__) -if __name__ == '__main__': +if __name__ == "__main__": from so_pip.api_clients.stackapi_facade import get_json_by_advanced_search + for page in range(1, 5000): - results = get_json_by_advanced_search("",tagged=["python","boto"], page=page) + results = get_json_by_advanced_search("", tagged=["python", "boto"], page=page) for result in results["items"]: body = result["body"] - if post_has_code(result) and count_loc(result)>15: + if post_has_code(result) and count_loc(result) > 15: print(result) diff --git a/so_pip/__main__.py b/so_pip/__main__.py index 89bb38e..5727c61 100644 --- a/so_pip/__main__.py +++ b/so_pip/__main__.py @@ -28,6 +28,7 @@ """ import logging import sys +from typing import Optional import docopt from random_names.make_name import number_from_name @@ -89,7 +90,7 @@ def main() -> int: revision_string = arguments.get("", None) if revision_string is not None: - revision = int(revision_string) + revision: Optional[int] = int(revision_string) else: revision = None all_in_one = arguments["--all-in-one"] diff --git a/so_pip/api_clients/search_engine_facade.py b/so_pip/api_clients/search_engine_facade.py index 0c43629..3263d38 100644 --- a/so_pip/api_clients/search_engine_facade.py +++ b/so_pip/api_clients/search_engine_facade.py @@ -1,3 +1,6 @@ +""" +Plain web scraper +""" import pprint from typing import Any @@ -16,6 +19,8 @@ def search_string(query: str) -> Any: if __name__ == "__main__": - results = search_string(query="[python] is:answer def class aws") - for result in results: - pprint.pprint(result) + + def run() -> None: + results = search_string(query="[python] is:answer def class aws") + for result in results: + pprint.pprint(result) diff --git a/so_pip/api_clients/stackapi_facade.py b/so_pip/api_clients/stackapi_facade.py index bd538cc..eab7cb6 100644 --- a/so_pip/api_clients/stackapi_facade.py +++ b/so_pip/api_clients/stackapi_facade.py @@ -11,7 +11,9 @@ from so_pip import settings as settings if settings.OUTPUT_FOLDER == "": - raise TypeError("Loaded this module too early.") + print("Don't have an output folder using .") + settings.OUTPUT_FOLDER = "." + # raise TypeError("Loaded this module too early.") # TODO: consider moving to JsonDisk from same library # not sure if that means python in, json out, so may have to change all client code _CACHE = Cache(directory=settings.OUTPUT_FOLDER + f"/cache{pickle.DEFAULT_PROTOCOL}/") @@ -24,8 +26,7 @@ CACHE_SECONDS = 86400 -# @lru_cache(maxsize=1000) -@_CACHE.memoize(expire=CACHE_SECONDS) +@_CACHE.memoize(expire=CACHE_SECONDS) # type: ignore def get_json_by_search(query: str, tagged: Tuple[str, ...]) -> Dict[str, Any]: """Low level access, returns unprocessed json""" return cast( @@ -63,8 +64,7 @@ def get_json_by_advanced_search( ) -# @lru_cache(maxsize=1000) -@_CACHE.memoize(expire=CACHE_SECONDS) +@_CACHE.memoize(expire=CACHE_SECONDS) # type: ignore def get_json_by_question_id(question_id: int) -> Dict[str, Any]: """Low level access, returns unprocessed json""" return cast( @@ -86,8 +86,7 @@ def get_json_by_question_id(question_id: int) -> Dict[str, Any]: ) -# @lru_cache(maxsize=1000) -@_CACHE.memoize(expire=CACHE_SECONDS) +@_CACHE.memoize(expire=CACHE_SECONDS) # type: ignore def get_json_by_answer_id(answer_id: int) -> Dict[str, Any]: """Low level access, returns unprocessed json""" return cast( @@ -110,8 +109,7 @@ def get_json_by_answer_id(answer_id: int) -> Dict[str, Any]: ) -# @lru_cache(maxsize=1000) -@_CACHE.memoize(expire=CACHE_SECONDS) +@_CACHE.memoize(expire=CACHE_SECONDS) # type: ignore def get_json_by_user_id(user_id: int) -> Dict[str, Any]: """Low level access, returns unprocessed json""" return cast( @@ -128,8 +126,7 @@ def get_json_by_user_id(user_id: int) -> Dict[str, Any]: # /2.2/posts/26344315/revisions?site=stackoverflow -# @lru_cache(maxsize=1000) -@_CACHE.memoize(expire=CACHE_SECONDS) +@_CACHE.memoize(expire=CACHE_SECONDS) # type: ignore def get_json_revisions_by_post_id(post_id: int) -> Dict[str, Any]: """ Low level access, returns unprocessed json @@ -147,8 +144,7 @@ def get_json_revisions_by_post_id(post_id: int) -> Dict[str, Any]: ) -# @lru_cache(maxsize=1000) -@_CACHE.memoize(expire=CACHE_SECONDS) +@_CACHE.memoize(expire=CACHE_SECONDS) # type: ignore def get_json_comments_by_post_id(post_id: int) -> Dict[str, Any]: """Low level access, returns unprocessed json""" return cast( @@ -164,8 +160,7 @@ def get_json_comments_by_post_id(post_id: int) -> Dict[str, Any]: ) -# @lru_cache(maxsize=1000) -@_CACHE.memoize(expire=CACHE_SECONDS) +@_CACHE.memoize(expire=CACHE_SECONDS) # type: ignore def get_json_related_tags(tag: str) -> Dict[str, Any]: """Low level access, returns unprocessed json""" return cast( diff --git a/so_pip/api_clients/stackoverflow_scraper.py b/so_pip/api_clients/stackoverflow_scraper.py index e1386a5..681dc18 100644 --- a/so_pip/api_clients/stackoverflow_scraper.py +++ b/so_pip/api_clients/stackoverflow_scraper.py @@ -14,7 +14,7 @@ @lru_cache(maxsize=1000) def scrape_urls(user_id: int) -> Tuple[str, str]: """Get twiter and github""" - response = requests.get(f"https://stackoverflow.com/users/{user_id}/") + response = requests.get(f"https://stackoverflow.com/users/{user_id}/", timeout=10) if response.status_code != 200: return "", "" soup = BeautifulSoup(response.text, features="html.parser") diff --git a/so_pip/commands/show.py b/so_pip/commands/show.py index 0ea10d1..6d79d63 100644 --- a/so_pip/commands/show.py +++ b/so_pip/commands/show.py @@ -17,7 +17,7 @@ def show(target_folder: str, package_name: str) -> None: guards.must_be_truthy(package_name, "package_name required") package_path = os.path.join(target_folder, package_name) init_path = os.path.join(target_folder, package_name, "__init__.py") - with open(init_path) as meta: + with open(init_path, encoding="utf-8") as meta: for line in meta: if "Author Link:" in line: contact = line.split(":")[1].strip() @@ -35,7 +35,7 @@ def show(target_folder: str, package_name: str) -> None: requirements_path = os.path.join(target_folder, package_name, "requirements.txt") requirements = [] if os.path.exists(requirements_path): - with open(requirements_path) as requirements_file: + with open(requirements_path, encoding="utf-8") as requirements_file: for line in requirements_file: requirements.append(line) diff --git a/so_pip/infer_packages_needed/package_by_name.py b/so_pip/infer_packages_needed/package_by_name.py index 522b9c1..50efe8e 100644 --- a/so_pip/infer_packages_needed/package_by_name.py +++ b/so_pip/infer_packages_needed/package_by_name.py @@ -47,13 +47,13 @@ def __init__(self) -> None: self.html_file = find_file("../_cache/pypi.html", __file__) self.packages: List[str] = [] if not os.path.exists(self.html_file): - client = requests.get("https://pypi.python.org/simple/") + client = requests.get("https://pypi.python.org/simple/", timeout=10) client.raise_for_status() - with open(self.html_file, "w") as file: + with open(self.html_file, "w", encoding="utf-8") as file: self.html_raw = client.text file.write(self.html_raw) else: - with open(self.html_file) as file: + with open(self.html_file, encoding="utf-8") as file: self.html_raw = file.read() self.html_lines = self.html_raw.split("\n") for line in self.html_lines: diff --git a/so_pip/licenses/convert_to_txt.py b/so_pip/licenses/convert_to_txt.py index ab13cef..257c745 100644 --- a/so_pip/licenses/convert_to_txt.py +++ b/so_pip/licenses/convert_to_txt.py @@ -3,7 +3,6 @@ from so_pip.support_files.license import convert_html_to_text if __name__ == "__main__": - for license_name in ["CC BY-SA 2.0"]: # ,"CC BY-SA 2.5.html"]: license_path = f"{license_name}.txt" if not os.path.exists(license_path) and ( diff --git a/so_pip/models/authors_model.py b/so_pip/models/authors_model.py index be875b3..090def6 100644 --- a/so_pip/models/authors_model.py +++ b/so_pip/models/authors_model.py @@ -82,7 +82,9 @@ def bind_answer_to_authors( return authors -def add_authors_from_post(post: Dict[str, Any], authors: Authors, is_answer: bool): +def add_authors_from_post( + post: Dict[str, Any], authors: Authors, is_answer: bool +) -> None: """Add authors from post to Object""" # pylint: disable=import-outside-toplevel from so_pip.api_clients.stackapi_facade import ( diff --git a/so_pip/models/count_loc_in_post.py b/so_pip/models/count_loc_in_post.py index e2592cf..e5784d1 100644 --- a/so_pip/models/count_loc_in_post.py +++ b/so_pip/models/count_loc_in_post.py @@ -13,7 +13,7 @@ def post_has_code(answer: Dict[str, Any]) -> bool: return "
" in answer["body"]
 
 
-def count_loc(post: Dict[str, Any]) -> bool:
+def count_loc(post: Dict[str, Any]) -> int:
     """
     Only the 
 blocks. Inline code blocks aren't the
     strongly reusable parts.
diff --git a/so_pip/parse_python/format_code.py b/so_pip/parse_python/format_code.py
index adbea31..0b4002b 100644
--- a/so_pip/parse_python/format_code.py
+++ b/so_pip/parse_python/format_code.py
@@ -2,7 +2,6 @@
 Format and save python.
 """
 import textwrap
-from typing import cast
 
 import black
 from black import format_str
@@ -22,7 +21,7 @@ def format_python_file(code: str) -> str:
         )
         if not blackened:
             raise TypeError("Writing 0 bytes")
-        return cast(str, blackened)
+        return blackened
     except black.InvalidInput:
         # TODO: if settings.COMMENT_OUT_BAD_PYTHON:
         return code
diff --git a/so_pip/parse_python/post_to_code.py b/so_pip/parse_python/post_to_code.py
index 5c8b8a4..fc6d02a 100644
--- a/so_pip/parse_python/post_to_code.py
+++ b/so_pip/parse_python/post_to_code.py
@@ -269,7 +269,6 @@ def write_one_code_file(
 
     to_write = code_file.to_write()
     if code_file.extension == ".py":
-
         code_to_write = to_write
         while code_to_write[-1].strip() in ("", "#"):
             code_to_write.pop()
diff --git a/so_pip/support_files/authors.py b/so_pip/support_files/authors.py
index c487a17..b57182c 100644
--- a/so_pip/support_files/authors.py
+++ b/so_pip/support_files/authors.py
@@ -1,73 +1,73 @@
-"""
-Authors file
-
-This is roughly following Gnu Gnit's conventions.
-
-Also draws inspiration from google's format.
-https://opensource.google/docs/releasing/authors/
-
-Also draws inspiration from libraries that attempt to parse AUTHORS files.
-https://www.npmjs.com/package/stringify-author
-https://www.npmjs.com/package/author-regex
-"""
-import logging
-from collections import defaultdict
-from typing import Any, Collection, DefaultDict, Dict, List, Optional, Sequence, Union
-
-import markdown
-
-from so_pip.make_from_template import load_template
-from so_pip.models.authors_model import (
-    Author,
-    bind_answer_to_authors,
-    bind_question_to_authors,
-)
-
-LOGGER = logging.getLogger(__name__)
-
-
-def write_authors(
-    package_folder: str,
-    package_name: str,
-    question: Dict[str, Any],
-    answer: Optional[Dict[str, Any]] = None,
-    uniqifier: str = "",
-) -> None:
-    """write file"""
-    if answer:
-        authors = bind_answer_to_authors(answer, question)
-    else:
-        authors = bind_question_to_authors(question)
-
-    sections: DefaultDict[str, List[Author]] = defaultdict(list)
-    for author in authors.everyone:
-        for role in author.roles:
-            if author not in sections[role]:
-                sections[role].append(author)
-    for _, value in sections.items():
-        value.sort(key=lambda _: _.display_name.lower())
-    for author in authors.everyone:
-        author.urls.sort(key=lambda _: "" if "stackoverflow.com" in _ else _.lower())
-
-    with open(
-        package_folder + f"/AUTHORS{uniqifier}.md",
-        "w",
-        encoding="utf-8",
-        errors="replace",
-    ) as author_file:
-        item = {"name": package_name, "authors": sections}
-        text = render_authors(data=item)
-        # calling this to see if it is somewhat valid markdown
-        _ = markdown.markdown(text)
-        author_file.write(text)
-
-
-def render_authors(
-    data: Dict[str, Union[str, Sequence[str], Collection[str]]],
-) -> str:
-    """
-    Render minimal setup.py suitable for `pip install -e .`
-    """
-    template = load_template(template_filename="AUTHORS.jinja", autoescape=False)
-    output_text = template.render(item=data)
-    return output_text
+"""
+Authors file
+
+This is roughly following Gnu Gnit's conventions.
+
+Also draws inspiration from google's format.
+https://opensource.google/docs/releasing/authors/
+
+Also draws inspiration from libraries that attempt to parse AUTHORS files.
+https://www.npmjs.com/package/stringify-author
+https://www.npmjs.com/package/author-regex
+"""
+import logging
+from collections import defaultdict
+from typing import Any, Collection, DefaultDict, Dict, List, Optional, Sequence, Union
+
+import markdown
+
+from so_pip.make_from_template import load_template
+from so_pip.models.authors_model import (
+    Author,
+    bind_answer_to_authors,
+    bind_question_to_authors,
+)
+
+LOGGER = logging.getLogger(__name__)
+
+
+def write_authors(
+    package_folder: str,
+    package_name: str,
+    question: Dict[str, Any],
+    answer: Optional[Dict[str, Any]] = None,
+    uniqifier: str = "",
+) -> None:
+    """write file"""
+    if answer:
+        authors = bind_answer_to_authors(answer, question)
+    else:
+        authors = bind_question_to_authors(question)
+
+    sections: DefaultDict[str, List[Author]] = defaultdict(list)
+    for author in authors.everyone:
+        for role in author.roles:
+            if author not in sections[role]:
+                sections[role].append(author)
+    for _, value in sections.items():
+        value.sort(key=lambda _: _.display_name.lower())
+    for author in authors.everyone:
+        author.urls.sort(key=lambda _: "" if "stackoverflow.com" in _ else _.lower())
+
+    with open(
+        package_folder + f"/AUTHORS{uniqifier}.md",
+        "w",
+        encoding="utf-8",
+        errors="replace",
+    ) as author_file:
+        item = {"name": package_name, "authors": sections}
+        text = render_authors(data=item)
+        # calling this to see if it is somewhat valid markdown
+        _ = markdown.markdown(text)
+        author_file.write(text)
+
+
+def render_authors(
+    data: Dict[str, Union[str, Sequence[str], Collection[str]]],
+) -> str:
+    """
+    Render minimal setup.py suitable for `pip install -e .`
+    """
+    template = load_template(template_filename="AUTHORS.jinja", autoescape=False)
+    output_text = template.render(item=data)
+    return output_text
diff --git a/so_pip/support_files/changelog.py b/so_pip/support_files/changelog.py
index b33f724..34cddd0 100644
--- a/so_pip/support_files/changelog.py
+++ b/so_pip/support_files/changelog.py
@@ -1,88 +1,88 @@
-"""
-Generate a CHANGELOG type file based on the edit log in SO
-
-Design strategy, follow this format: https://keepachangelog.com/en/1.0.0/
-
-Focus on changes to the question/answers *only*, not who did it.
-"""
-from datetime import datetime
-from typing import Any, Dict, List
-
-import markdown
-
-from so_pip.make_from_template import load_template
-from so_pip.models.authors_model import normalize_user_link
-
-
-def changelog_for_post(
-    post: Dict[str, Any], package_folder: str, uniqifier: str = ""
-) -> None:
-    """Requirements for running `safety`"""
-    versions = []
-    post_id = post["answer_id"] if "answer_id" in post else post["question_id"]
-    # pylint: disable=import-outside-toplevel
-    from so_pip.api_clients.stackapi_facade import get_json_revisions_by_post_id
-
-    revision_json = get_json_revisions_by_post_id(post_id)
-    # if len(revision_json.get("items", [])) == 0:
-    #     return
-    for revision in revision_json.get("items", []):
-        # if "content_license" not in revision:
-        #     print("but why")
-        if "revision_number" not in revision:
-            # happens with protected posts
-            # no revision number, no version number
-            continue
-        utc_date = datetime.utcfromtimestamp(revision["creation_date"]).isoformat()
-
-        revision_number = revision["revision_number"]
-        what = "Added" if revision_number == 1 else "Changed"
-        version = {
-            "version": f"0.1.{revision_number}",
-            "date": f"{utc_date}",
-            "changes": {
-                "content_license": revision.get("content_license", ""),
-                "user": "",
-                "comment": "Created post",
-                "what": what,
-            },
-        }
-        if revision["user"]["user_type"] != "does_not_exist":
-            display_name = revision["user"]["display_name"]
-            url = revision["user"]["link"]
-            link = normalize_user_link(url, revision["user"]["user_id"])
-            version["changes"]["user"] = f"{display_name} <{link}>"
-        else:
-            version["changes"]["user"] = "No user."
-        if revision_number == 1:
-            added = "Added answer" if "answer_id" in post else "Added Question"
-            version["changes"]["comment"] = added
-        else:
-            version["changes"]["comment"] = revision.get("comment", "")
-        version[
-            "revision_url"
-        ] = f"https://stackoverflow.com/revisions/{post_id}/{revision_number}"
-        versions.append(version)
-
-    with open(
-        package_folder + f"/CHANGELOG{uniqifier}.md",
-        "w",
-        encoding="utf-8",
-        errors="replace",
-    ) as log:
-        text = render_change_log(data=versions)
-
-        # calling this to see if it is somewhat valid markdown
-        _ = markdown.markdown(text)
-        log.write(text)
-
-
-def render_change_log(
-    data: List[Dict[str, Any]],
-) -> str:
-    """
-    Databind to jinja file
-    """
-    template = load_template(template_filename="HISTORY.md.jinja", autoescape=False)
-    output_text = template.render(item=data)
-    return output_text
+"""
+Generate a CHANGELOG type file based on the edit log in SO
+
+Design strategy, follow this format: https://keepachangelog.com/en/1.0.0/
+
+Focus on changes to the question/answers *only*, not who did it.
+"""
+from datetime import datetime
+from typing import Any, Dict, List
+
+import markdown
+
+from so_pip.make_from_template import load_template
+from so_pip.models.authors_model import normalize_user_link
+
+
+def changelog_for_post(
+    post: Dict[str, Any], package_folder: str, uniqifier: str = ""
+) -> None:
+    """Requirements for running `safety`"""
+    versions = []
+    post_id = post["answer_id"] if "answer_id" in post else post["question_id"]
+    # pylint: disable=import-outside-toplevel
+    from so_pip.api_clients.stackapi_facade import get_json_revisions_by_post_id
+
+    revision_json = get_json_revisions_by_post_id(post_id)
+    # if len(revision_json.get("items", [])) == 0:
+    #     return
+    for revision in revision_json.get("items", []):
+        # if "content_license" not in revision:
+        #     print("but why")
+        if "revision_number" not in revision:
+            # happens with protected posts
+            # no revision number, no version number
+            continue
+        utc_date = datetime.utcfromtimestamp(revision["creation_date"]).isoformat()
+
+        revision_number = revision["revision_number"]
+        what = "Added" if revision_number == 1 else "Changed"
+        version = {
+            "version": f"0.1.{revision_number}",
+            "date": f"{utc_date}",
+            "changes": {
+                "content_license": revision.get("content_license", ""),
+                "user": "",
+                "comment": "Created post",
+                "what": what,
+            },
+        }
+        if revision["user"]["user_type"] != "does_not_exist":
+            display_name = revision["user"]["display_name"]
+            url = revision["user"]["link"]
+            link = normalize_user_link(url, revision["user"]["user_id"])
+            version["changes"]["user"] = f"{display_name} <{link}>"
+        else:
+            version["changes"]["user"] = "No user."
+        if revision_number == 1:
+            added = "Added answer" if "answer_id" in post else "Added Question"
+            version["changes"]["comment"] = added
+        else:
+            version["changes"]["comment"] = revision.get("comment", "")
+        version[
+            "revision_url"
+        ] = f"https://stackoverflow.com/revisions/{post_id}/{revision_number}"
+        versions.append(version)
+
+    with open(
+        package_folder + f"/CHANGELOG{uniqifier}.md",
+        "w",
+        encoding="utf-8",
+        errors="replace",
+    ) as log:
+        text = render_change_log(data=versions)
+
+        # calling this to see if it is somewhat valid markdown
+        _ = markdown.markdown(text)
+        log.write(text)
+
+
+def render_change_log(
+    data: List[Dict[str, Any]],
+) -> str:
+    """
+    Databind to jinja file
+    """
+    template = load_template(template_filename="HISTORY.md.jinja", autoescape=False)
+    output_text = template.render(item=data)
+    return output_text
diff --git a/so_pip/support_files/code_of_conduct.py b/so_pip/support_files/code_of_conduct.py
index c5228e0..025b048 100644
--- a/so_pip/support_files/code_of_conduct.py
+++ b/so_pip/support_files/code_of_conduct.py
@@ -1,24 +1,25 @@
-"""
-Create a code of conduct file
-"""
-import markdown
-
-from so_pip.make_from_template import load_template
-
-
-def render_code_of_conduct(package_folder: str) -> str:
-    """
-    Links to SO's code of conduct
-    """
-    template = load_template(
-        template_filename="CODE_OF_CONDUCT.md.jinja", autoescape=False
-    )
-    output_text = template.render()
-    # check if markdown is okay
-    _ = markdown.markdown(output_text)
-    with open(
-        package_folder + "/CODE_OF_CONDUCT.md", "w", encoding="utf-8", errors="replace"
-    ) as author_file:
-        author_file.write(output_text)
-
-    return output_text
+"""
+Create a code of conduct file
+"""
+
+import markdown
+
+from so_pip.make_from_template import load_template
+
+
+def render_code_of_conduct(package_folder: str) -> str:
+    """
+    Links to SO's code of conduct
+    """
+    template = load_template(
+        template_filename="CODE_OF_CONDUCT.md.jinja", autoescape=False
+    )
+    output_text = template.render()
+    # check if markdown is okay
+    _ = markdown.markdown(output_text)
+    with open(
+        package_folder + "/CODE_OF_CONDUCT.md", "w", encoding="utf-8", errors="replace"
+    ) as author_file:
+        author_file.write(output_text)
+
+    return output_text
diff --git a/so_pip/support_files/generic_code_file.py b/so_pip/support_files/generic_code_file.py
index 343a946..05bcc49 100644
--- a/so_pip/support_files/generic_code_file.py
+++ b/so_pip/support_files/generic_code_file.py
@@ -1,34 +1,34 @@
-"""
-Generate a python file
-"""
-from typing import Any, Dict
-
-from so_pip.make_from_template import load_template
-
-
-def make_generic_code_file(
-    file_name: str,
-    header: str,
-    code: str,
-    footer: str,
-) -> None:
-    """write file"""
-
-    with open(file_name, "w", encoding="utf-8", errors="replace") as readme:
-        data = {"header": header, "code": code, "footer": footer}
-        source = render_generic_code_file(data)
-        readme.write(source)
-
-
-def render_generic_code_file(
-    data: Dict[str, Any],
-) -> str:
-    """
-    Just header, code, footer
-    """
-    template = load_template(
-        template_filename="generic_code_file.jinja", autoescape=False
-    )
-    # Turn off autoescape because this is something, but not html.
-    output_text = template.render(data=data, autoescape=False)  # nosec
-    return output_text
+"""
+Generate a python file
+"""
+from typing import Any, Dict
+
+from so_pip.make_from_template import load_template
+
+
+def make_generic_code_file(
+    file_name: str,
+    header: str,
+    code: str,
+    footer: str,
+) -> None:
+    """write file"""
+
+    with open(file_name, "w", encoding="utf-8", errors="replace") as readme:
+        data = {"header": header, "code": code, "footer": footer}
+        source = render_generic_code_file(data)
+        readme.write(source)
+
+
+def render_generic_code_file(
+    data: Dict[str, Any],
+) -> str:
+    """
+    Just header, code, footer
+    """
+    template = load_template(
+        template_filename="generic_code_file.jinja", autoescape=False
+    )
+    # Turn off autoescape because this is something, but not html.
+    output_text = template.render(data=data, autoescape=False)  # nosec
+    return output_text
diff --git a/so_pip/support_files/lua_rockspec.py b/so_pip/support_files/lua_rockspec.py
index a33595b..e3a098a 100644
--- a/so_pip/support_files/lua_rockspec.py
+++ b/so_pip/support_files/lua_rockspec.py
@@ -1,67 +1,67 @@
-"""
-Packaging for lua ecosystem
-"""
-import logging
-from typing import Any, Dict, Optional
-
-from slpp import slpp as lua
-
-from so_pip.make_from_template import load_template
-from so_pip.models.python_package_model import CodePackage
-
-LOGGER = logging.getLogger(__name__)
-
-
-def create_rockspec(
-    package_folder: str,
-    code_info: CodePackage,
-    question: Dict[str, Any],
-    answer: Optional[Dict[str, Any]],
-) -> None:
-    """Put everything into setup.cfg"""
-    # maybe already done?
-    # post_id = answer["answer_id"] if answer else question["question_id"]
-    # revisions_json = get_json_revisions_by_post_id(post_id).get("items", [])
-    if answer:
-        url = answer["link"]
-    else:
-        url = question["link"]
-
-    data = {
-        "dependencies": code_info.dependencies,
-        "question_title": question["title"],
-        "revision_number": code_info.version,  # or len(revisions_json)
-        "name": code_info.package_name,
-        "tags": question["tags"],
-        "url": url,
-    }
-
-    output_text = render_lua_rockspec(data)
-
-    if not output_text:
-        raise TypeError("Expected output_text by now")
-    with open(
-        package_folder + f"/{code_info.package_name}-{code_info.version}.rockspec",
-        "w",
-        encoding="utf-8",
-        errors="replace",
-    ) as project_file:
-        # I think the spec is lua syntax
-        project_file.write(output_text)
-
-
-def render_lua_rockspec(
-    data: Dict[str, Any],
-) -> str:
-    """
-    Help the world get away from setup.py
-    """
-    # I think the spec is lua syntax
-    template = load_template(
-        template_filename="lua/lua_rockspec.jinja", autoescape=False
-    )
-
-    output_text = template.render(data=data, autoescape=False)  # nosec
-    # check if it parses.
-    _ = lua.decode(output_text)
-    return output_text
+"""
+Packaging for lua ecosystem
+"""
+import logging
+from typing import Any, Dict, Optional
+
+from slpp import slpp as lua
+
+from so_pip.make_from_template import load_template
+from so_pip.models.python_package_model import CodePackage
+
+LOGGER = logging.getLogger(__name__)
+
+
+def create_rockspec(
+    package_folder: str,
+    code_info: CodePackage,
+    question: Dict[str, Any],
+    answer: Optional[Dict[str, Any]],
+) -> None:
+    """Put everything into setup.cfg"""
+    # maybe already done?
+    # post_id = answer["answer_id"] if answer else question["question_id"]
+    # revisions_json = get_json_revisions_by_post_id(post_id).get("items", [])
+    if answer:
+        url = answer["link"]
+    else:
+        url = question["link"]
+
+    data = {
+        "dependencies": code_info.dependencies,
+        "question_title": question["title"],
+        "revision_number": code_info.version,  # or len(revisions_json)
+        "name": code_info.package_name,
+        "tags": question["tags"],
+        "url": url,
+    }
+
+    output_text = render_lua_rockspec(data)
+
+    if not output_text:
+        raise TypeError("Expected output_text by now")
+    with open(
+        package_folder + f"/{code_info.package_name}-{code_info.version}.rockspec",
+        "w",
+        encoding="utf-8",
+        errors="replace",
+    ) as project_file:
+        # I think the spec is lua syntax
+        project_file.write(output_text)
+
+
+def render_lua_rockspec(
+    data: Dict[str, Any],
+) -> str:
+    """
+    Help the world get away from setup.py
+    """
+    # I think the spec is lua syntax
+    template = load_template(
+        template_filename="lua/lua_rockspec.jinja", autoescape=False
+    )
+
+    output_text = template.render(data=data, autoescape=False)  # nosec
+    # check if it parses.
+    _ = lua.decode(output_text)
+    return output_text
diff --git a/so_pip/support_files/package_json.py b/so_pip/support_files/package_json.py
index 8da0e66..7241e64 100644
--- a/so_pip/support_files/package_json.py
+++ b/so_pip/support_files/package_json.py
@@ -1,74 +1,74 @@
-"""
-Create pyproject.toml file
-
-Supports:
-- python version from either minver or so_pip.ini
-- list of inferred dependencies
-- list of tags
-"""
-import json
-import logging
-from typing import Any, Dict, Optional
-
-from so_pip.make_from_template import load_template
-from so_pip.models.python_package_model import CodePackage
-
-LOGGER = logging.getLogger(__name__)
-
-
-def create_package_json(
-    package_folder: str,
-    code_info: CodePackage,
-    question: Dict[str, Any],
-    answer: Optional[Dict[str, Any]],
-) -> None:
-    """Put everything into setup.cfg"""
-    # maybe already done?
-    # post_id = answer["answer_id"] if answer else question["question_id"]
-    # revisions_json = get_json_revisions_by_post_id(post_id).get("items", [])
-    if answer:
-        url = answer["link"]
-    else:
-        url = question["link"]
-
-    data = {
-        "dependencies": code_info.dependencies,
-        "question_title": question["title"],
-        "revision_number": code_info.version,  # or len(revisions_json)
-        "name": code_info.package_name,
-        "tags": question["tags"],
-        "url": url,
-    }
-
-    output_text = render_package_json(data)
-
-    if not output_text:
-        raise TypeError("Expected output_text by now")
-    with open(
-        package_folder + "/package.json", "w", encoding="utf-8", errors="replace"
-    ) as project_file:
-        project_file.write(output_text)
-        # see if it is valid toml
-        # pylint: disable=broad-except
-        # noinspection PyBroadException
-        try:
-            json.loads(output_text)
-        except BaseException as exception:
-            LOGGER.error("parse failed " + str(exception))
-            raise
-
-
-def render_package_json(
-    data: Dict[str, Any],
-) -> str:
-    """
-    Help the world get away from setup.py
-    """
-    template = load_template(
-        template_filename="js/package.json.jinja", autoescape=False
-    )
-    # Turn off autoescape because this is python not html.
-    output_text = template.render(data=data, autoescape=False)  # nosec
-    # validate toml
-    _ = json.loads(output_text)
-    return output_text
+"""
+Create pyproject.toml file
+
+Supports:
+- python version from either minver or so_pip.ini
+- list of inferred dependencies
+- list of tags
+"""
+import json
+import logging
+from typing import Any, Dict, Optional
+
+from so_pip.make_from_template import load_template
+from so_pip.models.python_package_model import CodePackage
+
+LOGGER = logging.getLogger(__name__)
+
+
+def create_package_json(
+    package_folder: str,
+    code_info: CodePackage,
+    question: Dict[str, Any],
+    answer: Optional[Dict[str, Any]],
+) -> None:
+    """Put everything into setup.cfg"""
+    # maybe already done?
+    # post_id = answer["answer_id"] if answer else question["question_id"]
+    # revisions_json = get_json_revisions_by_post_id(post_id).get("items", [])
+    if answer:
+        url = answer["link"]
+    else:
+        url = question["link"]
+
+    data = {
+        "dependencies": code_info.dependencies,
+        "question_title": question["title"],
+        "revision_number": code_info.version,  # or len(revisions_json)
+        "name": code_info.package_name,
+        "tags": question["tags"],
+        "url": url,
+    }
+
+    output_text = render_package_json(data)
+
+    if not output_text:
+        raise TypeError("Expected output_text by now")
+    with open(
+        package_folder + "/package.json", "w", encoding="utf-8", errors="replace"
+    ) as project_file:
+        project_file.write(output_text)
+        # see if it is valid toml
+        # pylint: disable=broad-except
+        # noinspection PyBroadException
+        try:
+            json.loads(output_text)
+        except BaseException as exception:
+            LOGGER.error("parse failed " + str(exception))
+            raise
+
+
+def render_package_json(
+    data: Dict[str, Any],
+) -> str:
+    """
+    Help the world get away from setup.py
+    """
+    template = load_template(
+        template_filename="js/package.json.jinja", autoescape=False
+    )
+    # Turn off autoescape because this is python not html.
+    output_text = template.render(data=data, autoescape=False)  # nosec
+    # validate toml
+    _ = json.loads(output_text)
+    return output_text
diff --git a/so_pip/support_files/pyproject_toml.py b/so_pip/support_files/pyproject_toml.py
index e216080..74b8369 100644
--- a/so_pip/support_files/pyproject_toml.py
+++ b/so_pip/support_files/pyproject_toml.py
@@ -1,76 +1,76 @@
-"""
-Create pyproject.toml file
-
-Supports:
-- python version from either minver or so_pip.ini
-- list of inferred dependencies
-- list of tags
-"""
-import logging
-from typing import Any, Dict, Optional
-
-import toml
-
-from so_pip.make_from_template import load_template
-from so_pip.models.python_package_model import CodePackage
-
-LOGGER = logging.getLogger(__name__)
-
-
-def create_pytroject_toml(
-    package_folder: str,
-    python_submodule: CodePackage,
-    question: Dict[str, Any],
-    answer: Optional[Dict[str, Any]],
-) -> None:
-    """Put everything into setup.cfg"""
-    # maybe already done?
-    # post_id = answer["answer_id"] if answer else question["question_id"]
-    # revisions_json = get_json_revisions_by_post_id(post_id).get("items", [])
-    if answer:
-        url = answer["link"]
-    else:
-        url = question["link"]
-
-    data = {
-        "dependencies": python_submodule.dependencies,
-        "question_title": question["title"],
-        "revision_number": python_submodule.version,  # or len(revisions_json)
-        "minimum_python": python_submodule.minimum_python,
-        "name": python_submodule.package_name,
-        "tags": question["tags"],
-        "url": url,
-    }
-
-    output_text = render_pyproject_toml(data)
-
-    if not output_text:
-        raise TypeError("Expected output_text by now")
-    with open(
-        package_folder + "/pyproject.toml", "w", encoding="utf-8", errors="replace"
-    ) as project_file:
-        project_file.write(output_text)
-        # see if it is valid toml
-        # pylint: disable=broad-except
-        # noinspection PyBroadException
-        try:
-            toml.loads(output_text)
-        except BaseException as exception:
-            LOGGER.error("parse failed " + str(exception))
-            raise
-
-
-def render_pyproject_toml(
-    data: Dict[str, Any],
-) -> str:
-    """
-    Help the world get away from setup.py
-    """
-    template = load_template(
-        template_filename="python/pyproject.toml.jinja", autoescape=False
-    )
-    # Turn off autoescape because this is python not html.
-    output_text = template.render(data=data, autoescape=False)  # nosec
-    # validate toml
-    _ = toml.loads(output_text)
-    return output_text
+"""
+Create pyproject.toml file
+
+Supports:
+- python version from either minver or so_pip.ini
+- list of inferred dependencies
+- list of tags
+"""
+import logging
+from typing import Any, Dict, Optional
+
+import toml
+
+from so_pip.make_from_template import load_template
+from so_pip.models.python_package_model import CodePackage
+
+LOGGER = logging.getLogger(__name__)
+
+
+def create_pytroject_toml(
+    package_folder: str,
+    python_submodule: CodePackage,
+    question: Dict[str, Any],
+    answer: Optional[Dict[str, Any]],
+) -> None:
+    """Put everything into setup.cfg"""
+    # maybe already done?
+    # post_id = answer["answer_id"] if answer else question["question_id"]
+    # revisions_json = get_json_revisions_by_post_id(post_id).get("items", [])
+    if answer:
+        url = answer["link"]
+    else:
+        url = question["link"]
+
+    data = {
+        "dependencies": python_submodule.dependencies,
+        "question_title": question["title"],
+        "revision_number": python_submodule.version,  # or len(revisions_json)
+        "minimum_python": python_submodule.minimum_python,
+        "name": python_submodule.package_name,
+        "tags": question["tags"],
+        "url": url,
+    }
+
+    output_text = render_pyproject_toml(data)
+
+    if not output_text:
+        raise TypeError("Expected output_text by now")
+    with open(
+        package_folder + "/pyproject.toml", "w", encoding="utf-8", errors="replace"
+    ) as project_file:
+        project_file.write(output_text)
+        # see if it is valid toml
+        # pylint: disable=broad-except
+        # noinspection PyBroadException
+        try:
+            toml.loads(output_text)
+        except BaseException as exception:
+            LOGGER.error("parse failed " + str(exception))
+            raise
+
+
+def render_pyproject_toml(
+    data: Dict[str, Any],
+) -> str:
+    """
+    Help the world get away from setup.py
+    """
+    template = load_template(
+        template_filename="python/pyproject.toml.jinja", autoescape=False
+    )
+    # Turn off autoescape because this is python not html.
+    output_text = template.render(data=data, autoescape=False)  # nosec
+    # validate toml
+    _ = toml.loads(output_text)
+    return output_text
diff --git a/so_pip/support_files/python_file.py b/so_pip/support_files/python_file.py
index d6aa6c4..f6ee9b1 100644
--- a/so_pip/support_files/python_file.py
+++ b/so_pip/support_files/python_file.py
@@ -1,54 +1,54 @@
-"""
-Generate a python file
-"""
-from typing import Any, Dict
-
-from so_pip.make_from_template import load_template
-from so_pip.models.python_package_model import CodePackage
-from so_pip.parse_python.format_code import format_python_file
-
-
-def make_python_file(
-    file_name: str,
-    long_header: bool,
-    code: str,
-    python_submodule: CodePackage,
-) -> bool:
-    """write file"""
-    if not python_submodule.url:
-        raise TypeError("Missing post url")
-    with open(file_name, "w", encoding="utf-8", errors="replace") as readme:
-        data = {
-            "title": python_submodule.title,
-            "version": python_submodule.version,
-            "post_url": python_submodule.url,
-            "author": python_submodule.author,
-            "author_link": python_submodule.author,
-            "license": python_submodule.content_license,
-            "link": python_submodule.url,
-            "creation_date": python_submodule.creation_date,
-            "code": code,
-        }
-        source = render_code_file_py(long_header, data)
-        formatted_source = format_python_file(source)
-        readme.write(formatted_source)
-    return True
-
-
-def render_code_file_py(
-    long_header: bool,
-    data: Dict[str, Any],
-) -> str:
-    """
-    Rehash other stuff and act as table of contents
-    """
-    if long_header:
-        template_filename = "python/python_long_header.py.jinja"
-    else:
-        template_filename = "python/python_brief_header.py.jinja"
-    template = load_template(template_filename=template_filename, autoescape=False)
-    # Turn off autoescape because this is python not html.
-    if not data["post_url"]:
-        raise TypeError("missing post+url")
-    output_text = template.render(data=data, autoescape=False)  # nosec
-    return output_text
+"""
+Generate a python file
+"""
+from typing import Any, Dict
+
+from so_pip.make_from_template import load_template
+from so_pip.models.python_package_model import CodePackage
+from so_pip.parse_python.format_code import format_python_file
+
+
+def make_python_file(
+    file_name: str,
+    long_header: bool,
+    code: str,
+    python_submodule: CodePackage,
+) -> bool:
+    """write file"""
+    if not python_submodule.url:
+        raise TypeError("Missing post url")
+    with open(file_name, "w", encoding="utf-8", errors="replace") as readme:
+        data = {
+            "title": python_submodule.title,
+            "version": python_submodule.version,
+            "post_url": python_submodule.url,
+            "author": python_submodule.author,
+            "author_link": python_submodule.author,
+            "license": python_submodule.content_license,
+            "link": python_submodule.url,
+            "creation_date": python_submodule.creation_date,
+            "code": code,
+        }
+        source = render_code_file_py(long_header, data)
+        formatted_source = format_python_file(source)
+        readme.write(formatted_source)
+    return True
+
+
+def render_code_file_py(
+    long_header: bool,
+    data: Dict[str, Any],
+) -> str:
+    """
+    Rehash other stuff and act as table of contents
+    """
+    if long_header:
+        template_filename = "python/python_long_header.py.jinja"
+    else:
+        template_filename = "python/python_brief_header.py.jinja"
+    template = load_template(template_filename=template_filename, autoescape=False)
+    # Turn off autoescape because this is python not html.
+    if not data["post_url"]:
+        raise TypeError("missing post+url")
+    output_text = template.render(data=data, autoescape=False)  # nosec
+    return output_text
diff --git a/so_pip/support_files/python_init.py b/so_pip/support_files/python_init.py
index 42f9e4d..68499b4 100644
--- a/so_pip/support_files/python_init.py
+++ b/so_pip/support_files/python_init.py
@@ -1,48 +1,48 @@
-"""
-Generate a python init file
-"""
-from typing import Any, Dict
-
-from so_pip.make_from_template import load_template
-from so_pip.models.python_package_model import CodePackage
-from so_pip.parse_python.format_code import format_python_file
-
-
-def make_python_init_file(
-    file_name: str,
-    code_info: CodePackage,
-) -> bool:
-    """write file"""
-    is_python = any(_.language == "python" for _ in code_info.code_blocks)
-    if not is_python:
-        return False
-
-    with open(file_name, "w", encoding="utf-8", errors="replace") as readme:
-        data = {
-            "title": code_info.title,
-            "version": code_info.version,
-            "url": code_info.url,
-            "author": code_info.author,
-            "author_link": code_info.author,
-            "license": code_info.content_license,
-            "link": code_info.url,
-            "creation_date": code_info.creation_date,
-        }
-        source = render_python_init_file_py(data)
-        formatted_source = format_python_file(source)
-        readme.write(formatted_source)
-    return True
-
-
-def render_python_init_file_py(
-    data: Dict[str, Any],
-) -> str:
-    """
-    Jinja for init
-    """
-    template = load_template(
-        template_filename="python/python_init.py.jinja", autoescape=False
-    )
-    # Turn off autoescape because this is python not html.
-    output_text = template.render(data=data, autoescape=False)  # nosec
-    return output_text
+"""
+Generate a python init file
+"""
+from typing import Any, Dict
+
+from so_pip.make_from_template import load_template
+from so_pip.models.python_package_model import CodePackage
+from so_pip.parse_python.format_code import format_python_file
+
+
+def make_python_init_file(
+    file_name: str,
+    code_info: CodePackage,
+) -> bool:
+    """write file"""
+    is_python = any(_.language == "python" for _ in code_info.code_blocks)
+    if not is_python:
+        return False
+
+    with open(file_name, "w", encoding="utf-8", errors="replace") as readme:
+        data = {
+            "title": code_info.title,
+            "version": code_info.version,
+            "url": code_info.url,
+            "author": code_info.author,
+            "author_link": code_info.author,
+            "license": code_info.content_license,
+            "link": code_info.url,
+            "creation_date": code_info.creation_date,
+        }
+        source = render_python_init_file_py(data)
+        formatted_source = format_python_file(source)
+        readme.write(formatted_source)
+    return True
+
+
+def render_python_init_file_py(
+    data: Dict[str, Any],
+) -> str:
+    """
+    Jinja for init
+    """
+    template = load_template(
+        template_filename="python/python_init.py.jinja", autoescape=False
+    )
+    # Turn off autoescape because this is python not html.
+    output_text = template.render(data=data, autoescape=False)  # nosec
+    return output_text
diff --git a/so_pip/support_files/readme_md.py b/so_pip/support_files/readme_md.py
index 67e3c3f..62d54a9 100644
--- a/so_pip/support_files/readme_md.py
+++ b/so_pip/support_files/readme_md.py
@@ -1,51 +1,51 @@
-"""
-Rehash some fairly non-standardized stuff about the package
-"""
-from typing import Any, Dict, Optional
-
-import markdown
-
-from so_pip.make_from_template import load_template
-from so_pip.models.python_package_model import CodePackage
-
-
-def create_readme_md(
-    package_folder: str,
-    python_submodule: CodePackage,
-    question: Dict[str, Any],
-    answer: Optional[Dict[str, Any]] = None,
-) -> None:
-    """write file"""
-    _ = answer
-    # TODO: this isn't done yet.
-
-    with open(
-        package_folder + "/README.md", "w", encoding="utf-8", errors="replace"
-    ) as readme:
-        data = {
-            "title": question["title"],
-            "package_name": python_submodule.package_name,
-            "version": python_submodule.version,
-            "url": python_submodule.url,
-            "author": python_submodule.author,
-            "author_email": python_submodule.author_email,
-            "description": python_submodule.description,
-            "dependencies": python_submodule.dependencies,
-        }
-        source = render_readme_md(data)
-        readme.write(source)
-
-
-def render_readme_md(
-    data: Dict[str, Any],
-) -> str:
-    """
-    Rehash other stuff and act as table of contents
-    """
-
-    template = load_template(template_filename="README.md.jinja", autoescape=False)
-    # Turn off autoescape because this is markdown, not html
-    output_text = template.render(item=data, autoescape=False)  # nosec
-    # calling this to see if it is somewhat valid markdown
-    _ = markdown.markdown(output_text)
-    return output_text
+"""
+Rehash some fairly non-standardized stuff about the package
+"""
+from typing import Any, Dict, Optional
+
+import markdown
+
+from so_pip.make_from_template import load_template
+from so_pip.models.python_package_model import CodePackage
+
+
+def create_readme_md(
+    package_folder: str,
+    python_submodule: CodePackage,
+    question: Dict[str, Any],
+    answer: Optional[Dict[str, Any]] = None,
+) -> None:
+    """write file"""
+    _ = answer
+    # TODO: this isn't done yet.
+
+    with open(
+        package_folder + "/README.md", "w", encoding="utf-8", errors="replace"
+    ) as readme:
+        data = {
+            "title": question["title"],
+            "package_name": python_submodule.package_name,
+            "version": python_submodule.version,
+            "url": python_submodule.url,
+            "author": python_submodule.author,
+            "author_email": python_submodule.author_email,
+            "description": python_submodule.description,
+            "dependencies": python_submodule.dependencies,
+        }
+        source = render_readme_md(data)
+        readme.write(source)
+
+
+def render_readme_md(
+    data: Dict[str, Any],
+) -> str:
+    """
+    Rehash other stuff and act as table of contents
+    """
+
+    template = load_template(template_filename="README.md.jinja", autoescape=False)
+    # Turn off autoescape because this is markdown, not html
+    output_text = template.render(item=data, autoescape=False)  # nosec
+    # calling this to see if it is somewhat valid markdown
+    _ = markdown.markdown(output_text)
+    return output_text
diff --git a/so_pip/support_files/ruby_gemspec.py b/so_pip/support_files/ruby_gemspec.py
index 226115d..a32385c 100644
--- a/so_pip/support_files/ruby_gemspec.py
+++ b/so_pip/support_files/ruby_gemspec.py
@@ -1,68 +1,68 @@
-"""
-Ruby support
-
-TODO: https://guides.rubygems.org/specification-reference/
-- has support for authors and licenses (plural!)
-"""
-import logging
-from typing import Any, Dict, Optional
-
-from so_pip.make_from_template import load_template
-from so_pip.models.python_package_model import CodePackage
-
-LOGGER = logging.getLogger(__name__)
-
-
-def create_gemspec(
-    package_folder: str,
-    code_info: CodePackage,
-    question: Dict[str, Any],
-    answer: Optional[Dict[str, Any]],
-) -> None:
-    """Put everything into setup.cfg"""
-    # maybe already done?
-    # post_id = answer["answer_id"] if answer else question["question_id"]
-    # revisions_json = get_json_revisions_by_post_id(post_id).get("items", [])
-    if answer:
-        url = answer["link"]
-    else:
-        url = question["link"]
-
-    data = {
-        "dependencies": code_info.dependencies,
-        "question_title": question["title"],
-        "revision_number": code_info.version,  # or len(revisions_json)
-        "name": code_info.package_name,
-        "tags": question["tags"],
-        "url": url,
-    }
-
-    output_text = render_ruby_gempec(data)
-
-    if not output_text:
-        raise TypeError("Expected output_text by now")
-    with open(
-        package_folder + f"/{code_info.package_name}.gemspec",
-        "w",
-        encoding="utf-8",
-        errors="replace",
-    ) as project_file:
-        # I think the spec is lua syntax
-        project_file.write(output_text)
-
-
-def render_ruby_gempec(
-    data: Dict[str, Any],
-) -> str:
-    """
-    Help the world get away from setup.py
-    """
-    # I think the spec is lua syntax
-    template = load_template(
-        template_filename="ruby/ruby_gemspec.jinja", autoescape=False
-    )
-
-    output_text = template.render(data=data, autoescape=False)  # nosec
-    # check if it parses.
-
-    return output_text
+"""
+Ruby support
+
+TODO: https://guides.rubygems.org/specification-reference/
+- has support for authors and licenses (plural!)
+"""
+import logging
+from typing import Any, Dict, Optional
+
+from so_pip.make_from_template import load_template
+from so_pip.models.python_package_model import CodePackage
+
+LOGGER = logging.getLogger(__name__)
+
+
+def create_gemspec(
+    package_folder: str,
+    code_info: CodePackage,
+    question: Dict[str, Any],
+    answer: Optional[Dict[str, Any]],
+) -> None:
+    """Put everything into setup.cfg"""
+    # maybe already done?
+    # post_id = answer["answer_id"] if answer else question["question_id"]
+    # revisions_json = get_json_revisions_by_post_id(post_id).get("items", [])
+    if answer:
+        url = answer["link"]
+    else:
+        url = question["link"]
+
+    data = {
+        "dependencies": code_info.dependencies,
+        "question_title": question["title"],
+        "revision_number": code_info.version,  # or len(revisions_json)
+        "name": code_info.package_name,
+        "tags": question["tags"],
+        "url": url,
+    }
+
+    output_text = render_ruby_gempec(data)
+
+    if not output_text:
+        raise TypeError("Expected output_text by now")
+    with open(
+        package_folder + f"/{code_info.package_name}.gemspec",
+        "w",
+        encoding="utf-8",
+        errors="replace",
+    ) as project_file:
+        # I think the spec is lua syntax
+        project_file.write(output_text)
+
+
+def render_ruby_gempec(
+    data: Dict[str, Any],
+) -> str:
+    """
+    Help the world get away from setup.py
+    """
+    # I think the spec is lua syntax
+    template = load_template(
+        template_filename="ruby/ruby_gemspec.jinja", autoescape=False
+    )
+
+    output_text = template.render(data=data, autoescape=False)  # nosec
+    # check if it parses.
+
+    return output_text
diff --git a/so_pip/support_files/setup_cfg.py b/so_pip/support_files/setup_cfg.py
index 8a47c63..b893b4c 100644
--- a/so_pip/support_files/setup_cfg.py
+++ b/so_pip/support_files/setup_cfg.py
@@ -1,62 +1,62 @@
-"""
-Create ini file for setup.py.
-
-The setup.cfg file is weird. It can only override values in setup.py
-and is used by some tools as a centralized config.ini file.
-"""
-import configparser
-from typing import Any, Dict
-
-from so_pip.make_from_template import load_template
-from so_pip.models.python_package_model import CodePackage
-
-
-def create_setup_cfg(package_folder: str, python_submodule: CodePackage) -> None:
-    """Put everything into setup.cfg"""
-    full_path = package_folder + "/setup.cfg"
-    with open(full_path, "w", encoding="utf-8", errors="replace") as setup_cfg:
-        post_id = 0
-        data = {
-            "package_name": python_submodule.package_name,
-            "version": python_submodule.version,
-            "url": python_submodule.url,
-            "author": python_submodule.author,
-            "author_email": python_submodule.author_email,
-            "description": python_submodule.description,
-            "dependencies": python_submodule.dependencies,
-            "classifiers": """    Programming Language :: Python :: 3 :: Only
-            Programming Language :: Python :: 3.6
-            Programming Language :: Python :: 3.7
-            Programming Language :: Python :: 3.8
-            Programming Language :: Python :: 3.9""",
-            "revisions_url": f"https://stackoverflow.com/posts/{post_id}/revisions",
-        }
-        source = render_setup_cfg(data)
-
-        setup_cfg.write(source)
-        config = configparser.ConfigParser()
-        _ = config.read(full_path)
-
-    with open(
-        package_folder + "/setup.py", "w", encoding="utf-8", errors="replace"
-    ) as setup_py:
-        template = load_template(
-            template_filename="python/setup_bare.py.jinja", autoescape=False
-        )
-        # Turn off autoescape because this is python not html.
-        output_text = template.render(item=data, autoescape=False)  # nosec
-        setup_py.write(output_text)
-
-
-def render_setup_cfg(
-    data: Dict[str, Any],
-) -> str:
-    """
-    Render minimal setup.py suitable for `pip install -e .`
-    """
-    template = load_template(
-        template_filename="python/setup.cfg.jinja", autoescape=False
-    )
-    # Turn off autoescape because this is python not html.
-    output_text = template.render(item=data, autoescape=False)  # nosec
-    return output_text
+"""
+Create ini file for setup.py.
+
+The setup.cfg file is weird. It can only override values in setup.py
+and is used by some tools as a centralized config.ini file.
+"""
+import configparser
+from typing import Any, Dict
+
+from so_pip.make_from_template import load_template
+from so_pip.models.python_package_model import CodePackage
+
+
+def create_setup_cfg(package_folder: str, python_submodule: CodePackage) -> None:
+    """Put everything into setup.cfg"""
+    full_path = package_folder + "/setup.cfg"
+    with open(full_path, "w", encoding="utf-8", errors="replace") as setup_cfg:
+        post_id = 0
+        data = {
+            "package_name": python_submodule.package_name,
+            "version": python_submodule.version,
+            "url": python_submodule.url,
+            "author": python_submodule.author,
+            "author_email": python_submodule.author_email,
+            "description": python_submodule.description,
+            "dependencies": python_submodule.dependencies,
+            "classifiers": """    Programming Language :: Python :: 3 :: Only
+            Programming Language :: Python :: 3.6
+            Programming Language :: Python :: 3.7
+            Programming Language :: Python :: 3.8
+            Programming Language :: Python :: 3.9""",
+            "revisions_url": f"https://stackoverflow.com/posts/{post_id}/revisions",
+        }
+        source = render_setup_cfg(data)
+
+        setup_cfg.write(source)
+        config = configparser.ConfigParser()
+        _ = config.read(full_path)
+
+    with open(
+        package_folder + "/setup.py", "w", encoding="utf-8", errors="replace"
+    ) as setup_py:
+        template = load_template(
+            template_filename="python/setup_bare.py.jinja", autoescape=False
+        )
+        # Turn off autoescape because this is python not html.
+        output_text = template.render(item=data, autoescape=False)  # nosec
+        setup_py.write(output_text)
+
+
+def render_setup_cfg(
+    data: Dict[str, Any],
+) -> str:
+    """
+    Render minimal setup.py suitable for `pip install -e .`
+    """
+    template = load_template(
+        template_filename="python/setup.cfg.jinja", autoescape=False
+    )
+    # Turn off autoescape because this is python not html.
+    output_text = template.render(item=data, autoescape=False)  # nosec
+    return output_text
diff --git a/so_pip/support_files/setup_py.py b/so_pip/support_files/setup_py.py
index 6b1c3e3..1a4b8ae 100644
--- a/so_pip/support_files/setup_py.py
+++ b/so_pip/support_files/setup_py.py
@@ -1,41 +1,41 @@
-"""
-Create a setup.py file
-
-DEPRECATED. I MAY DELETE THIS ALTOGETHER.
-"""
-from typing import Dict, Sequence, Union
-
-from so_pip.make_from_template import load_template
-from so_pip.models.python_package_model import CodePackage
-
-
-def create_setup_py(package_folder: str, python_submodule: CodePackage) -> None:
-    """Just the setup.py part"""
-    with open(
-        package_folder + "/setup.py", "w", encoding="utf-8", errors="replace"
-    ) as setup:
-        data = {
-            "package_name": python_submodule.package_name,
-            "version": python_submodule.version,
-            "url": python_submodule.url,
-            "author": python_submodule.author,
-            "author_email": python_submodule.author_email,
-            "description": python_submodule.description,
-            "dependencies": python_submodule.dependencies,
-        }
-        source = render_setup_py(data)
-        setup.write(source)
-
-
-def render_setup_py(
-    data: Dict[str, Union[str, Sequence[str]]],
-) -> str:
-    """
-    Render minimal setup.py suitable for `pip install -e .`
-    """
-    template = load_template(
-        template_filename="python/setup.py.jinja", autoescape=False
-    )
-    # Turn off autoescape because this is python not html.
-    output_text = template.render(item=data, autoescape=False)  # nosec
-    return output_text
+"""
+Create a setup.py file
+
+DEPRECATED. I MAY DELETE THIS ALTOGETHER.
+"""
+from typing import Dict, Sequence, Union
+
+from so_pip.make_from_template import load_template
+from so_pip.models.python_package_model import CodePackage
+
+
+def create_setup_py(package_folder: str, python_submodule: CodePackage) -> None:
+    """Just the setup.py part"""
+    with open(
+        package_folder + "/setup.py", "w", encoding="utf-8", errors="replace"
+    ) as setup:
+        data = {
+            "package_name": python_submodule.package_name,
+            "version": python_submodule.version,
+            "url": python_submodule.url,
+            "author": python_submodule.author,
+            "author_email": python_submodule.author_email,
+            "description": python_submodule.description,
+            "dependencies": python_submodule.dependencies,
+        }
+        source = render_setup_py(data)
+        setup.write(source)
+
+
+def render_setup_py(
+    data: Dict[str, Union[str, Sequence[str]]],
+) -> str:
+    """
+    Render minimal setup.py suitable for `pip install -e .`
+    """
+    template = load_template(
+        template_filename="python/setup.py.jinja", autoescape=False
+    )
+    # Turn off autoescape because this is python not html.
+    output_text = template.render(item=data, autoescape=False)  # nosec
+    return output_text
diff --git a/test/sample/find_imports_a_aboriginal_dig/main_1.py b/test/sample/find_imports_a_aboriginal_dig/main_1.py
index f24e5cd..fee25fd 100644
--- a/test/sample/find_imports_a_aboriginal_dig/main_1.py
+++ b/test/sample/find_imports_a_aboriginal_dig/main_1.py
@@ -19,7 +19,6 @@ def import_hook(self, name, caller, *arg, **kwarg):
             )
 
     def __call__(self, node):
-
         self.name = str(node)
 
         self.run_script(self.name)
diff --git a/test/test_slow/test_api_clients.py b/test/test_slow/test_api_clients.py
index ae92eaf..cf594ba 100644
--- a/test/test_slow/test_api_clients.py
+++ b/test/test_slow/test_api_clients.py
@@ -37,9 +37,10 @@ def test_pystats():
     assert not_found
 
 
-def test_question_by_id():
-    value = question_by_id(24139250)
-    assert value
+# Consistently failing on HTTPS error?!!
+# def test_question_by_id():
+#     value = question_by_id(24139250)
+#     assert value
 
 
 def test_get_json_by_answer_id():
diff --git a/test/test_slow/test_live_search.py b/test/test_slow/test_live_search.py
index 45befa2..b6ecfc8 100644
--- a/test/test_slow/test_live_search.py
+++ b/test/test_slow/test_live_search.py
@@ -8,8 +8,10 @@
 # GET search endpoint is rotten!
 # Only "intitle" so can't search if body has def/class! (i.e. basic units of re-usability)
 
+
 def test_import_so_search():
     import so_pip.settings as settings
+
     settings.QUIET = False
     result = import_so_search(
         package_prefix="test",
@@ -17,7 +19,7 @@ def test_import_so_search():
         tags=["python"],
         output_folder=settings.OUTPUT_FOLDER,
         stop_after=2,
-        minimum_loc=5
+        minimum_loc=5,
     )
     print(result)
     assert result
diff --git a/test/test_slow/test_whole_thing.py b/test/test_slow/test_whole_thing.py
index 1cb310a..b78eb1d 100644
--- a/test/test_slow/test_whole_thing.py
+++ b/test/test_slow/test_whole_thing.py
@@ -3,17 +3,17 @@
 
 OUTPUT_FOLDER = find_file("../../output", __file__)
 
-
-def test_import_so():
-    # # https://stackoverflow.com/questions/9008451/python-easy-way-to-read-all-import-statements-from-py-module
-    # import_so_question("find_imports_better", 9008451)
-    # import_so_question("question_matters", 65373654)
-    # # https://stackoverflow.com/questions/2572582/return-a-list-of-imported-python-modules-used-in-a-script
-    import_so_question("find_imports", 2572582, OUTPUT_FOLDER)
-    # # has fiddle, strong evidence of working code
-    # # https://stackoverflow.com/questions/5874652/prop-vs-attr
-    # 24139250
-    # import_so("pyso_answers_by_user", 24139250)
+# hangs?
+# def test_import_so():
+# # https://stackoverflow.com/questions/9008451/python-easy-way-to-read-all-import-statements-from-py-module
+# import_so_question("find_imports_better", 9008451)
+# import_so_question("question_matters", 65373654)
+# # https://stackoverflow.com/questions/2572582/return-a-list-of-imported-python-modules-used-in-a-script
+# import_so_question("find_imports", 2572582, OUTPUT_FOLDER)
+# # has fiddle, strong evidence of working code
+# # https://stackoverflow.com/questions/5874652/prop-vs-attr
+# 24139250
+# import_so("pyso_answers_by_user", 24139250)
 
 
 def test_import_so_answer():
diff --git a/tox.ini b/tox.ini
index b93d59c..928cdd7 100644
--- a/tox.ini
+++ b/tox.ini
@@ -4,7 +4,7 @@
 # and then run "tox" from this directory.
 [tox]
 # vermin reports so_pip source itself is 3.7+
-envlist = py37, py38, py39
+envlist = py39, py310, py311, py312
 isolated_build = True
 [testenv]
 commands =