From ef50554a2cc9319372d3f82ce1e863bbb1158989 Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Tue, 11 Feb 2020 08:48:05 +0100 Subject: [PATCH 01/19] Updated readme --- README.rst | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index ef312fb..666b235 100644 --- a/README.rst +++ b/README.rst @@ -35,8 +35,7 @@ Features | ``ip`` | 157.50.1.20 | ``set`` | 127.0.0.1 | +----------------+----------------------+-----------------------+----------------------------------+ -See the documentation (https://python-postgresql-anonymizer.readthedocs.io/en/latest/) for a more -detailed description of the provided anonymization methods. +See the `documentation`_ for a more detailed description of the provided anonymization methods. Installation ------------ @@ -71,6 +70,10 @@ Usage --dump-file DUMP_FILE Create a database dump file with the given name +Despite the database connection values, you will have to define a YAML schema file, that includes +all anonymization rules for that database. Take a look at the `schema documentation`_ or the +`YAML sample schema`_. + Example call:: $ pganonymize --schema=myschema.yml \ @@ -137,7 +140,9 @@ After that you can pass a schema file to the container, using Docker volumes, an -v -.. _Faker: https://faker.readthedocs.io/en/master/providers.html +.. _documentation: https://python-postgresql-anonymizer.readthedocs.io/en/latest/ +.. _schema documentation: https://python-postgresql-anonymizer.readthedocs.io/en/latest/schema.html +.. _YAML sample schema: https://github.com/rheinwerk-verlag/postgresql-anonymizer/blob/master/sample_schema.yml .. |license| image:: https://img.shields.io/badge/license-MIT-green.svg :target: https://github.com/rheinwerk-verlag/postgresql-anonymizer/blob/master/LICENSE.rst From 4cc3e22a77761d768f6d96c99f9791e5271c30b1 Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Tue, 11 Feb 2020 08:49:42 +0100 Subject: [PATCH 02/19] Updated readme --- README.rst | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.rst b/README.rst index 666b235..320968a 100644 --- a/README.rst +++ b/README.rst @@ -74,6 +74,8 @@ Despite the database connection values, you will have to define a YAML schema fi all anonymization rules for that database. Take a look at the `schema documentation`_ or the `YAML sample schema`_. +.. include:: ./sample_schema.yml + Example call:: $ pganonymize --schema=myschema.yml \ From 4215e13fbd5a3d56020d3e48c620ed6c08153445 Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Tue, 11 Feb 2020 08:50:35 +0100 Subject: [PATCH 03/19] Updated readme --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 320968a..3f37e9f 100644 --- a/README.rst +++ b/README.rst @@ -74,7 +74,7 @@ Despite the database connection values, you will have to define a YAML schema fi all anonymization rules for that database. Take a look at the `schema documentation`_ or the `YAML sample schema`_. -.. include:: ./sample_schema.yml +.. include:: ../sample_schema.yml Example call:: From 899b212f21cbb1c15c5bf43a8abb8e9059870a77 Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Tue, 11 Feb 2020 08:51:06 +0100 Subject: [PATCH 04/19] Updated readme --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 3f37e9f..620380f 100644 --- a/README.rst +++ b/README.rst @@ -74,7 +74,7 @@ Despite the database connection values, you will have to define a YAML schema fi all anonymization rules for that database. Take a look at the `schema documentation`_ or the `YAML sample schema`_. -.. include:: ../sample_schema.yml +.. include:: sample_schema.yml Example call:: From eb1940e294fb9fa809747171eefa87bc192eae7e Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Tue, 11 Feb 2020 08:51:59 +0100 Subject: [PATCH 05/19] Updated readme --- README.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 620380f..759d099 100644 --- a/README.rst +++ b/README.rst @@ -72,9 +72,10 @@ Usage Despite the database connection values, you will have to define a YAML schema file, that includes all anonymization rules for that database. Take a look at the `schema documentation`_ or the -`YAML sample schema`_. +YAML sample schema:: -.. include:: sample_schema.yml +.. literalinclude:: sample_schema.yml + :language: YAML Example call:: From 93626ac6f3608c27325f810a053ec1dff50317de Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Tue, 11 Feb 2020 08:53:41 +0100 Subject: [PATCH 06/19] Updated readme --- README.rst | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 759d099..666b235 100644 --- a/README.rst +++ b/README.rst @@ -72,10 +72,7 @@ Usage Despite the database connection values, you will have to define a YAML schema file, that includes all anonymization rules for that database. Take a look at the `schema documentation`_ or the -YAML sample schema:: - -.. literalinclude:: sample_schema.yml - :language: YAML +`YAML sample schema`_. Example call:: From fb206a9ce3448dc72e6f6811cc2b5cf7d5240748 Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Tue, 25 Feb 2020 12:09:54 +0100 Subject: [PATCH 07/19] Updated version information for the poetry file and fixed a typo within the README file --- README.rst | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 666b235..d5abf35 100644 --- a/README.rst +++ b/README.rst @@ -122,7 +122,7 @@ Now you can install all requirements and activate the virtualenv:: Docker ------ -If you want to run the anonymizher within a Docker container you first have to build the image:: +If you want to run the anonymizer within a Docker container you first have to build the image:: $ docker build -t pganonymizer . diff --git a/pyproject.toml b/pyproject.toml index 7abced2..a6efe77 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "postgresql-anonymizer" -version = "0.2.4" +version = "0.3.0" description = "Commandline tool to anonymize PostgreSQL databases" authors = [ "Henning Kage " From 06f64c1174d0301750c6fe0d781c6fa14ef8ff75 Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Tue, 25 Feb 2020 12:12:45 +0100 Subject: [PATCH 08/19] Updated README file --- README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index d5abf35..91ed946 100644 --- a/README.rst +++ b/README.rst @@ -86,9 +86,9 @@ Example call:: Database dump ~~~~~~~~~~~~~ -With the ``--dump-file`` argument it is possible to create a database dump file after anonymizing the database. -Please note, that the ``pg_dump`` command from the ``postgresql-client-common`` library is necessary to create -the dump file for t he connected database, e.g. under Linux:: +With the ``--dump-file`` argument it is possible to create a dump file after anonymizing the database. Please note, +that the ``pg_dump`` command from the ``postgresql-client-common`` library is necessary to create the dump file for the +database, e.g. under Linux:: sudo apt-get install postgresql-client-common From 580e4c2345090fbfaf423f9e2a936cfb89ea1626 Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Tue, 17 Nov 2020 10:36:09 +0100 Subject: [PATCH 09/19] Update .isort.cfg Updated isort config to multi_line_output=0 --- .isort.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.isort.cfg b/.isort.cfg index e6ba9b7..acd7116 100644 --- a/.isort.cfg +++ b/.isort.cfg @@ -1,3 +1,3 @@ [settings] line_length=120 -multi_line_output=4 \ No newline at end of file +multi_line_output=0 From 79bba4f23cebfe8d50f0767765c0c54d3568f91a Mon Sep 17 00:00:00 2001 From: Rehman Shafi Date: Thu, 3 Dec 2020 17:33:01 +0500 Subject: [PATCH 10/19] hotfix(): Removed error incase of no truncate section in schema. --- pganonymizer/utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pganonymizer/utils.py b/pganonymizer/utils.py index 763e29f..a33b552 100644 --- a/pganonymizer/utils.py +++ b/pganonymizer/utils.py @@ -254,7 +254,7 @@ def truncate_tables(connection, tables): cursor = connection.cursor() table_names = ', '.join(tables) logging.info('Truncating tables "%s"', table_names) - cursor.execute('TRUNCATE TABLE {tables};'.format(tables=table_names)) + cursor.execute('TRUNCATE TABLE {tables};'.format(tables=table_names)) if len(tables) else None cursor.close() From d9fc0c3a295a38118165ae4c9a6e1dc0f76ba2c1 Mon Sep 17 00:00:00 2001 From: Rehman Shafi Date: Thu, 3 Dec 2020 17:53:22 +0500 Subject: [PATCH 11/19] Workflow Test --- .github/workflows/python-test.yml | 41 +++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .github/workflows/python-test.yml diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml new file mode 100644 index 0000000..ae142c2 --- /dev/null +++ b/.github/workflows/python-test.yml @@ -0,0 +1,41 @@ +name: Test + +on: [push, pull_request] + +jobs: + + testing: + runs-on: ubuntu-latest + strategy: + max-parallel: 4 + matrix: + python-version: [2.7, 3.5, 3.6, 3.7, 3.8] + + steps: + - uses: actions/checkout@v1 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + - name: Install and set up Poetry + run: | + python get-poetry.py --preview -y + source $HOME/.poetry/env + poetry config virtualenvs.in-project true + - name: Set up cache + uses: actions/cache@v1 + with: + path: .venv + key: ${{ runner.os }}-venv-${{ matrix.python-version }}-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies + run: | + source $HOME/.poetry/env + poetry install + - name: Test with pytest + run: | + source $HOME/.poetry/env + poetry run pytest -q tests + - name: Lint with flake8 + run: | + source $HOME/.poetry/env + poetry run flake8 From 8c2e72e5912ebb3c49e912bf2feb3d305fe47d63 Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Thu, 3 Dec 2020 15:14:12 +0100 Subject: [PATCH 12/19] Update for ghe Github action (test workflow) --- .github/workflows/python_test.yml | 25 +- get-poetry.py | 959 ------------------------------ 2 files changed, 18 insertions(+), 966 deletions(-) delete mode 100644 get-poetry.py diff --git a/.github/workflows/python_test.yml b/.github/workflows/python_test.yml index ae142c2..82ed5fc 100644 --- a/.github/workflows/python_test.yml +++ b/.github/workflows/python_test.yml @@ -3,38 +3,49 @@ name: Test on: [push, pull_request] jobs: - + testing: + runs-on: ubuntu-latest + strategy: max-parallel: 4 matrix: python-version: [2.7, 3.5, 3.6, 3.7, 3.8] + poetry-version: [1.1.4] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 + uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - - name: Install and set up Poetry + + - name: Install poetry ${{ matrix.poetry-version }} run: | - python get-poetry.py --preview -y - source $HOME/.poetry/env - poetry config virtualenvs.in-project true + python -m ensurepip + python -m pip install --upgrade pip + python -m pip install poetry==${{ matrix.poetry-version }} + source $HOME/.poetry/env + poetry config virtualenvs.in-project true + - name: Set up cache uses: actions/cache@v1 with: path: .venv key: ${{ runner.os }}-venv-${{ matrix.python-version }}-${{ hashFiles('**/poetry.lock') }} + - name: Install dependencies run: | source $HOME/.poetry/env poetry install + - name: Test with pytest run: | source $HOME/.poetry/env poetry run pytest -q tests + - name: Lint with flake8 run: | source $HOME/.poetry/env diff --git a/get-poetry.py b/get-poetry.py deleted file mode 100644 index 803f13f..0000000 --- a/get-poetry.py +++ /dev/null @@ -1,959 +0,0 @@ -""" -This script will install Poetry and its dependencies -in isolation from the rest of the system. - -It does, in order: - - - Downloads the latest stable (or pre-release) version of poetry. - - Downloads all its dependencies in the poetry/_vendor directory. - - Copies it and all extra files in $POETRY_HOME. - - Updates the PATH in a system-specific way. - -There will be a `poetry` script that will be installed in $POETRY_HOME/bin -which will act as the poetry command but is slightly different in the sense -that it will use the current Python installation. - -What this means is that one Poetry installation can serve for multiple -Python versions. -""" -import argparse -import hashlib -import json -import os -import platform -import re -import shutil -import stat -import subprocess -import sys -import tarfile -import tempfile - -from contextlib import closing -from contextlib import contextmanager -from functools import cmp_to_key -from gzip import GzipFile -from io import UnsupportedOperation -from io import open - - -try: - from urllib.error import HTTPError - from urllib.request import Request - from urllib.request import urlopen -except ImportError: - from urllib2 import HTTPError - from urllib2 import Request - from urllib2 import urlopen - -try: - input = raw_input -except NameError: - pass - - -try: - try: - import winreg - except ImportError: - import _winreg as winreg -except ImportError: - winreg = None - -try: - u = unicode -except NameError: - u = str - -SHELL = os.getenv("SHELL", "") -WINDOWS = sys.platform.startswith("win") or (sys.platform == "cli" and os.name == "nt") - - -FOREGROUND_COLORS = { - "black": 30, - "red": 31, - "green": 32, - "yellow": 33, - "blue": 34, - "magenta": 35, - "cyan": 36, - "white": 37, -} - -BACKGROUND_COLORS = { - "black": 40, - "red": 41, - "green": 42, - "yellow": 43, - "blue": 44, - "magenta": 45, - "cyan": 46, - "white": 47, -} - -OPTIONS = {"bold": 1, "underscore": 4, "blink": 5, "reverse": 7, "conceal": 8} - - -def style(fg, bg, options): - codes = [] - - if fg: - codes.append(FOREGROUND_COLORS[fg]) - - if bg: - codes.append(BACKGROUND_COLORS[bg]) - - if options: - if not isinstance(options, (list, tuple)): - options = [options] - - for option in options: - codes.append(OPTIONS[option]) - - return "\033[{}m".format(";".join(map(str, codes))) - - -STYLES = { - "info": style("green", None, None), - "comment": style("yellow", None, None), - "error": style("red", None, None), - "warning": style("yellow", None, None), -} - - -def is_decorated(): - if platform.system().lower() == "windows": - return ( - os.getenv("ANSICON") is not None - or "ON" == os.getenv("ConEmuANSI") - or "xterm" == os.getenv("Term") - ) - - if not hasattr(sys.stdout, "fileno"): - return False - - try: - return os.isatty(sys.stdout.fileno()) - except UnsupportedOperation: - return False - - -def is_interactive(): - if not hasattr(sys.stdin, "fileno"): - return False - - try: - return os.isatty(sys.stdin.fileno()) - except UnsupportedOperation: - return False - - -def colorize(style, text): - if not is_decorated(): - return text - - return "{}{}\033[0m".format(STYLES[style], text) - - -@contextmanager -def temporary_directory(*args, **kwargs): - try: - from tempfile import TemporaryDirectory - - with TemporaryDirectory(*args, **kwargs) as name: - yield name - except ImportError: - name = tempfile.mkdtemp(*args, **kwargs) - - yield name - - shutil.rmtree(name) - - -def string_to_bool(value): - value = value.lower() - - return value in {"true", "1", "y", "yes"} - - -def expanduser(path): - """ - Expand ~ and ~user constructions. - - Includes a workaround for http://bugs.python.org/issue14768 - """ - expanded = os.path.expanduser(path) - if path.startswith("~/") and expanded.startswith("//"): - expanded = expanded[1:] - - return expanded - - -HOME = expanduser("~") -POETRY_HOME = os.environ.get("POETRY_HOME") or os.path.join(HOME, ".poetry") -POETRY_BIN = os.path.join(POETRY_HOME, "bin") -POETRY_ENV = os.path.join(POETRY_HOME, "env") -POETRY_LIB = os.path.join(POETRY_HOME, "lib") -POETRY_LIB_BACKUP = os.path.join(POETRY_HOME, "lib-backup") - - -BIN = """#!/usr/bin/env python -# -*- coding: utf-8 -*- -import glob -import sys -import os - -lib = os.path.normpath(os.path.join(os.path.realpath(__file__), "../..", "lib")) - -sys.path.insert(0, lib) - -if __name__ == "__main__": - from poetry.console import main - - main() -""" - -BAT = u('@echo off\r\npython "{poetry_bin}" %*\r\n') - - -PRE_MESSAGE = """# Welcome to {poetry}! - -This will download and install the latest version of {poetry}, -a dependency and package manager for Python. - -It will add the `poetry` command to {poetry}'s bin directory, located at: - -{poetry_home_bin} - -{platform_msg} - -You can uninstall at any time with `poetry self uninstall`, -or by executing this script with the --uninstall option, -and these changes will be reverted. -""" - -PRE_UNINSTALL_MESSAGE = """# We are sorry to see you go! - -This will uninstall {poetry}. - -It will remove the `poetry` command from {poetry}'s bin directory, located at: - -{poetry_home_bin} - -This will also remove {poetry} from your system's PATH. -""" - - -PRE_MESSAGE_UNIX = """This path will then be added to your `PATH` environment variable by -modifying the profile file{plural} located at: - -{rcfiles}""" - - -PRE_MESSAGE_FISH = """This path will then be added to your `PATH` environment variable by -modifying the `fish_user_paths` universal variable.""" - -PRE_MESSAGE_WINDOWS = """This path will then be added to your `PATH` environment variable by -modifying the `HKEY_CURRENT_USER/Environment/PATH` registry key.""" - -PRE_MESSAGE_NO_MODIFY_PATH = """This path needs to be in your `PATH` environment variable, -but will not be added automatically.""" - -POST_MESSAGE_UNIX = """{poetry} ({version}) is installed now. Great! - -To get started you need {poetry}'s bin directory ({poetry_home_bin}) in your `PATH` -environment variable. Next time you log in this will be done -automatically. - -To configure your current shell run `source {poetry_home_env}` -""" - -POST_MESSAGE_FISH = """{poetry} ({version}) is installed now. Great! - -{poetry}'s bin directory ({poetry_home_bin}) has been added to your `PATH` -environment variable by modifying the `fish_user_paths` universal variable. -""" - -POST_MESSAGE_WINDOWS = """{poetry} ({version}) is installed now. Great! - -To get started you need Poetry's bin directory ({poetry_home_bin}) in your `PATH` -environment variable. Future applications will automatically have the -correct environment, but you may need to restart your current shell. -""" - -POST_MESSAGE_UNIX_NO_MODIFY_PATH = """{poetry} ({version}) is installed now. Great! - -To get started you need {poetry}'s bin directory ({poetry_home_bin}) in your `PATH` -environment variable. - -To configure your current shell run `source {poetry_home_env}` -""" - -POST_MESSAGE_FISH_NO_MODIFY_PATH = """{poetry} ({version}) is installed now. Great! - -To get started you need {poetry}'s bin directory ({poetry_home_bin}) -in your `PATH` environment variable, which you can add by running -the following command: - - set -U fish_user_paths {poetry_home_bin} $fish_user_paths -""" - -POST_MESSAGE_WINDOWS_NO_MODIFY_PATH = """{poetry} ({version}) is installed now. Great! - -To get started you need Poetry's bin directory ({poetry_home_bin}) in your `PATH` -environment variable. This has not been done automatically. -""" - - -class Installer: - - CURRENT_PYTHON = sys.executable - CURRENT_PYTHON_VERSION = sys.version_info[:2] - METADATA_URL = "https://pypi.org/pypi/poetry/json" - VERSION_REGEX = re.compile( - r"v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:\.(\d+))?" - "(" - "[._-]?" - r"(?:(stable|beta|b|RC|alpha|a|patch|pl|p)((?:[.-]?\d+)*)?)?" - "([.-]?dev)?" - ")?" - r"(?:\+[^\s]+)?" - ) - - REPOSITORY_URL = "https://github.com/python-poetry/poetry" - BASE_URL = REPOSITORY_URL + "/releases/download/" - FALLBACK_BASE_URL = "https://github.com/sdispater/poetry/releases/download/" - - def __init__( - self, - version=None, - preview=False, - force=False, - accept_all=False, - base_url=BASE_URL, - ): - self._version = version - self._preview = preview - self._force = force - self._modify_path = True - self._accept_all = accept_all - self._base_url = base_url - - def allows_prereleases(self): - return self._preview - - def run(self): - version, current_version = self.get_version() - - if version is None: - return 0 - - self.customize_install() - self.display_pre_message() - self.ensure_home() - - try: - self.install(version, upgrade=current_version is not None) - except subprocess.CalledProcessError as e: - print(colorize("error", "An error has occured: {}".format(str(e)))) - print(e.output.decode()) - - return e.returncode - - self.display_post_message(version) - - return 0 - - def uninstall(self): - self.display_pre_uninstall_message() - - if not self.customize_uninstall(): - return - - self.remove_home() - self.remove_from_path() - - def get_version(self): - print(colorize("info", "Retrieving Poetry metadata")) - - metadata = json.loads(self._get(self.METADATA_URL).decode()) - - def _compare_versions(x, y): - mx = self.VERSION_REGEX.match(x) - my = self.VERSION_REGEX.match(y) - - vx = tuple(int(p) for p in mx.groups()[:3]) + (mx.group(5),) - vy = tuple(int(p) for p in my.groups()[:3]) + (my.group(5),) - - if vx < vy: - return -1 - elif vx > vy: - return 1 - - return 0 - - print("") - releases = sorted( - metadata["releases"].keys(), key=cmp_to_key(_compare_versions) - ) - - if self._version and self._version not in releases: - print(colorize("error", "Version {} does not exist.".format(self._version))) - - return None, None - - version = self._version - if not version: - for release in reversed(releases): - m = self.VERSION_REGEX.match(release) - if m.group(5) and not self.allows_prereleases(): - continue - - version = release - - break - - current_version = None - if os.path.exists(POETRY_LIB): - with open( - os.path.join(POETRY_LIB, "poetry", "__version__.py"), encoding="utf-8" - ) as f: - version_content = f.read() - - current_version_re = re.match( - '(?ms).*__version__ = "(.+)".*', version_content - ) - if not current_version_re: - print( - colorize( - "warning", - "Unable to get the current Poetry version. Assuming None", - ) - ) - else: - current_version = current_version_re.group(1) - - if current_version == version and not self._force: - print("Latest version already installed.") - return None, current_version - - return version, current_version - - def customize_install(self): - if not self._accept_all: - print("Before we start, please answer the following questions.") - print("You may simply press the Enter key to leave unchanged.") - - modify_path = input("Modify PATH variable? ([y]/n) ") or "y" - if modify_path.lower() in {"n", "no"}: - self._modify_path = False - - print("") - - def customize_uninstall(self): - if not self._accept_all: - print() - - uninstall = ( - input("Are you sure you want to uninstall Poetry? (y/[n]) ") or "n" - ) - if uninstall.lower() not in {"y", "yes"}: - return False - - print("") - - return True - - def ensure_home(self): - """ - Ensures that $POETRY_HOME exists or create it. - """ - if not os.path.exists(POETRY_HOME): - os.mkdir(POETRY_HOME, 0o755) - - def remove_home(self): - """ - Removes $POETRY_HOME. - """ - if not os.path.exists(POETRY_HOME): - return - - shutil.rmtree(POETRY_HOME) - - def install(self, version, upgrade=False): - """ - Installs Poetry in $POETRY_HOME. - """ - print("Installing version: " + colorize("info", version)) - - self.make_lib(version) - self.make_bin() - self.make_env() - self.update_path() - - return 0 - - def make_lib(self, version): - """ - Packs everything into a single lib/ directory. - """ - if os.path.exists(POETRY_LIB_BACKUP): - shutil.rmtree(POETRY_LIB_BACKUP) - - # Backup the current installation - if os.path.exists(POETRY_LIB): - shutil.copytree(POETRY_LIB, POETRY_LIB_BACKUP) - shutil.rmtree(POETRY_LIB) - - try: - self._make_lib(version) - except Exception: - if not os.path.exists(POETRY_LIB_BACKUP): - raise - - shutil.copytree(POETRY_LIB_BACKUP, POETRY_LIB) - shutil.rmtree(POETRY_LIB_BACKUP) - - raise - finally: - if os.path.exists(POETRY_LIB_BACKUP): - shutil.rmtree(POETRY_LIB_BACKUP) - - def _make_lib(self, version): - # We get the payload from the remote host - platform = sys.platform - if platform == "linux2": - platform = "linux" - - url = self._base_url + "{}/".format(version) - name = "poetry-{}-{}.tar.gz".format(version, platform) - checksum = "poetry-{}-{}.sha256sum".format(version, platform) - - try: - r = urlopen(url + "{}".format(checksum)) - except HTTPError as e: - if e.code == 404: - raise RuntimeError("Could not find {} file".format(checksum)) - - raise - - checksum = r.read().decode() - - try: - r = urlopen(url + "{}".format(name)) - except HTTPError as e: - if e.code == 404: - raise RuntimeError("Could not find {} file".format(name)) - - raise - - meta = r.info() - size = int(meta["Content-Length"]) - current = 0 - block_size = 8192 - - print( - " - Downloading {} ({:.2f}MB)".format( - colorize("comment", name), size / 1024 / 1024 - ) - ) - - sha = hashlib.sha256() - with temporary_directory(prefix="poetry-installer-") as dir_: - tar = os.path.join(dir_, name) - with open(tar, "wb") as f: - while True: - buffer = r.read(block_size) - if not buffer: - break - - current += len(buffer) - f.write(buffer) - sha.update(buffer) - - # Checking hashes - if checksum != sha.hexdigest(): - raise RuntimeError( - "Hashes for {} do not match: {} != {}".format( - name, checksum, sha.hexdigest() - ) - ) - - gz = GzipFile(tar, mode="rb") - try: - with tarfile.TarFile(tar, fileobj=gz, format=tarfile.PAX_FORMAT) as f: - f.extractall(POETRY_LIB) - finally: - gz.close() - - def make_bin(self): - if not os.path.exists(POETRY_BIN): - os.mkdir(POETRY_BIN, 0o755) - - if WINDOWS: - with open(os.path.join(POETRY_BIN, "poetry.bat"), "w") as f: - f.write( - u( - BAT.format( - poetry_bin=os.path.join(POETRY_BIN, "poetry").replace( - os.environ["USERPROFILE"], "%USERPROFILE%" - ) - ) - ) - ) - - with open(os.path.join(POETRY_BIN, "poetry"), "w", encoding="utf-8") as f: - f.write(u(BIN)) - - if not WINDOWS: - # Making the file executable - st = os.stat(os.path.join(POETRY_BIN, "poetry")) - os.chmod(os.path.join(POETRY_BIN, "poetry"), st.st_mode | stat.S_IEXEC) - - def make_env(self): - if WINDOWS: - return - - with open(os.path.join(POETRY_HOME, "env"), "w") as f: - f.write(u(self.get_export_string())) - - def update_path(self): - """ - Tries to update the $PATH automatically. - """ - if not self._modify_path: - return - - if "fish" in SHELL: - return self.add_to_fish_path() - - if WINDOWS: - return self.add_to_windows_path() - - # Updating any profile we can on UNIX systems - export_string = self.get_export_string() - - addition = "\n{}\n".format(export_string) - - profiles = self.get_unix_profiles() - for profile in profiles: - if not os.path.exists(profile): - continue - - with open(profile, "r") as f: - content = f.read() - - if addition not in content: - with open(profile, "a") as f: - f.write(u(addition)) - - def add_to_fish_path(self): - """ - Ensure POETRY_BIN directory is on Fish shell $PATH - """ - current_path = os.environ.get("PATH", None) - if current_path is None: - print( - colorize( - "warning", - "\nUnable to get the PATH value. It will not be updated automatically.", - ) - ) - self._modify_path = False - - return - - if POETRY_BIN not in current_path: - fish_user_paths = subprocess.check_output( - ["fish", "-c", "echo $fish_user_paths"] - ).decode("utf-8") - if POETRY_BIN not in fish_user_paths: - cmd = "set -U fish_user_paths {} $fish_user_paths".format(POETRY_BIN) - set_fish_user_path = ["fish", "-c", "{}".format(cmd)] - subprocess.check_output(set_fish_user_path) - else: - print( - colorize( - "warning", - "\nPATH already contains {} and thus was not modified.".format( - POETRY_BIN - ), - ) - ) - - def add_to_windows_path(self): - try: - old_path = self.get_windows_path_var() - except WindowsError: - old_path = None - - if old_path is None: - print( - colorize( - "warning", - "Unable to get the PATH value. It will not be updated automatically", - ) - ) - self._modify_path = False - - return - - new_path = POETRY_BIN - if POETRY_BIN in old_path: - old_path = old_path.replace(POETRY_BIN + ";", "") - - if old_path: - new_path += ";" - new_path += old_path - - self.set_windows_path_var(new_path) - - def get_windows_path_var(self): - with winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) as root: - with winreg.OpenKey(root, "Environment", 0, winreg.KEY_ALL_ACCESS) as key: - path, _ = winreg.QueryValueEx(key, "PATH") - - return path - - def set_windows_path_var(self, value): - import ctypes - - with winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER) as root: - with winreg.OpenKey(root, "Environment", 0, winreg.KEY_ALL_ACCESS) as key: - winreg.SetValueEx(key, "PATH", 0, winreg.REG_EXPAND_SZ, value) - - # Tell other processes to update their environment - HWND_BROADCAST = 0xFFFF - WM_SETTINGCHANGE = 0x1A - - SMTO_ABORTIFHUNG = 0x0002 - - result = ctypes.c_long() - SendMessageTimeoutW = ctypes.windll.user32.SendMessageTimeoutW - SendMessageTimeoutW( - HWND_BROADCAST, - WM_SETTINGCHANGE, - 0, - u"Environment", - SMTO_ABORTIFHUNG, - 5000, - ctypes.byref(result), - ) - - def remove_from_path(self): - if "fish" in SHELL: - return self.remove_from_fish_path() - - elif WINDOWS: - return self.remove_from_windows_path() - - return self.remove_from_unix_path() - - def remove_from_fish_path(self): - fish_user_paths = subprocess.check_output( - ["fish", "-c", "echo $fish_user_paths"] - ).decode("utf-8") - if POETRY_BIN in fish_user_paths: - cmd = "set -U fish_user_paths (string match -v {} $fish_user_paths)".format( - POETRY_BIN - ) - set_fish_user_path = ["fish", "-c", "{}".format(cmd)] - subprocess.check_output(set_fish_user_path) - - def remove_from_windows_path(self): - path = self.get_windows_path_var() - - poetry_path = POETRY_BIN - if poetry_path in path: - path = path.replace(POETRY_BIN + ";", "") - - if poetry_path in path: - path = path.replace(POETRY_BIN, "") - - self.set_windows_path_var(path) - - def remove_from_unix_path(self): - # Updating any profile we can on UNIX systems - export_string = self.get_export_string() - - addition = "{}\n".format(export_string) - - profiles = self.get_unix_profiles() - for profile in profiles: - if not os.path.exists(profile): - continue - - with open(profile, "r") as f: - content = f.readlines() - - if addition not in content: - continue - - new_content = [] - for line in content: - if line == addition: - if new_content and not new_content[-1].strip(): - new_content = new_content[:-1] - - continue - - new_content.append(line) - - with open(profile, "w") as f: - f.writelines(new_content) - - def get_export_string(self): - path = POETRY_BIN.replace(os.getenv("HOME", ""), "$HOME") - export_string = 'export PATH="{}:$PATH"'.format(path) - - return export_string - - def get_unix_profiles(self): - profiles = [os.path.join(HOME, ".profile")] - - if "zsh" in SHELL: - zdotdir = os.getenv("ZDOTDIR", HOME) - profiles.append(os.path.join(zdotdir, ".zprofile")) - - bash_profile = os.path.join(HOME, ".bash_profile") - if os.path.exists(bash_profile): - profiles.append(bash_profile) - - return profiles - - def display_pre_message(self): - if WINDOWS: - home = POETRY_BIN.replace(os.getenv("USERPROFILE", ""), "%USERPROFILE%") - else: - home = POETRY_BIN.replace(os.getenv("HOME", ""), "$HOME") - - kwargs = { - "poetry": colorize("info", "Poetry"), - "poetry_home_bin": colorize("comment", home), - } - - if not self._modify_path: - kwargs["platform_msg"] = PRE_MESSAGE_NO_MODIFY_PATH - else: - if "fish" in SHELL: - kwargs["platform_msg"] = PRE_MESSAGE_FISH - elif WINDOWS: - kwargs["platform_msg"] = PRE_MESSAGE_WINDOWS - else: - profiles = [ - colorize("comment", p.replace(os.getenv("HOME", ""), "$HOME")) - for p in self.get_unix_profiles() - ] - kwargs["platform_msg"] = PRE_MESSAGE_UNIX.format( - rcfiles="\n".join(profiles), plural="s" if len(profiles) > 1 else "" - ) - - print(PRE_MESSAGE.format(**kwargs)) - - def display_pre_uninstall_message(self): - home_bin = POETRY_BIN - if WINDOWS: - home_bin = home_bin.replace(os.getenv("USERPROFILE", ""), "%USERPROFILE%") - else: - home_bin = home_bin.replace(os.getenv("HOME", ""), "$HOME") - - kwargs = { - "poetry": colorize("info", "Poetry"), - "poetry_home_bin": colorize("comment", home_bin), - } - - print(PRE_UNINSTALL_MESSAGE.format(**kwargs)) - - def display_post_message(self, version): - print("") - - kwargs = { - "poetry": colorize("info", "Poetry"), - "version": colorize("comment", version), - } - - if WINDOWS: - message = POST_MESSAGE_WINDOWS - if not self._modify_path: - message = POST_MESSAGE_WINDOWS_NO_MODIFY_PATH - - poetry_home_bin = POETRY_BIN.replace( - os.getenv("USERPROFILE", ""), "%USERPROFILE%" - ) - elif "fish" in SHELL: - message = POST_MESSAGE_FISH - if not self._modify_path: - message = POST_MESSAGE_FISH_NO_MODIFY_PATH - - poetry_home_bin = POETRY_BIN.replace(os.getenv("HOME", ""), "$HOME") - else: - message = POST_MESSAGE_UNIX - if not self._modify_path: - message = POST_MESSAGE_UNIX_NO_MODIFY_PATH - - poetry_home_bin = POETRY_BIN.replace(os.getenv("HOME", ""), "$HOME") - kwargs["poetry_home_env"] = colorize( - "comment", POETRY_ENV.replace(os.getenv("HOME", ""), "$HOME") - ) - - kwargs["poetry_home_bin"] = colorize("comment", poetry_home_bin) - - print(message.format(**kwargs)) - - def call(self, *args): - return subprocess.check_output(args, stderr=subprocess.STDOUT) - - def _get(self, url): - request = Request(url, headers={"User-Agent": "Python Poetry"}) - - with closing(urlopen(request)) as r: - return r.read() - - -def main(): - parser = argparse.ArgumentParser( - description="Installs the latest (or given) version of poetry" - ) - parser.add_argument( - "-p", "--preview", dest="preview", action="store_true", default=False - ) - parser.add_argument("--version", dest="version") - parser.add_argument( - "-f", "--force", dest="force", action="store_true", default=False - ) - parser.add_argument( - "-y", "--yes", dest="accept_all", action="store_true", default=False - ) - parser.add_argument( - "--uninstall", dest="uninstall", action="store_true", default=False - ) - - args = parser.parse_args() - - base_url = Installer.BASE_URL - try: - urlopen(Installer.REPOSITORY_URL) - except HTTPError as e: - if e.code == 404: - base_url = Installer.FALLBACK_BASE_URL - else: - raise - - installer = Installer( - version=args.version or os.getenv("POETRY_VERSION"), - preview=args.preview or string_to_bool(os.getenv("POETRY_PREVIEW", "0")), - force=args.force, - accept_all=args.accept_all - or string_to_bool(os.getenv("POETRY_ACCEPT", "0")) - or not is_interactive(), - base_url=base_url, - ) - - if args.uninstall or string_to_bool(os.getenv("POETRY_UNINSTALL", "0")): - return installer.uninstall() - - return installer.run() - - -if __name__ == "__main__": - sys.exit(main()) From f256a0ded6a62a66683c19783edc6160c4c1620d Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Thu, 3 Dec 2020 15:22:48 +0100 Subject: [PATCH 13/19] Update for ghe Github action (test workflow) --- .github/workflows/python_test.yml | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/.github/workflows/python_test.yml b/.github/workflows/python_test.yml index 82ed5fc..851ade6 100644 --- a/.github/workflows/python_test.yml +++ b/.github/workflows/python_test.yml @@ -24,29 +24,32 @@ jobs: - name: Install poetry ${{ matrix.poetry-version }} run: | - python -m ensurepip - python -m pip install --upgrade pip - python -m pip install poetry==${{ matrix.poetry-version }} - source $HOME/.poetry/env - poetry config virtualenvs.in-project true + curl -fsS -o get-poetry.py https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py + python get-poetry.py -y + echo "::set-env name=PATH::$HOME/.poetry/bin:$PATH" + + - name: Configure poetry + run: poetry config virtualenvs.in-project true - name: Set up cache uses: actions/cache@v1 + id: cache with: - path: .venv - key: ${{ runner.os }}-venv-${{ matrix.python-version }}-${{ hashFiles('**/poetry.lock') }} + path: .venv + key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} + + - name: Ensure cache is healthy + if: steps.cache.outputs.cache-hit == 'true' + run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv - name: Install dependencies run: | - source $HOME/.poetry/env poetry install - name: Test with pytest run: | - source $HOME/.poetry/env poetry run pytest -q tests - name: Lint with flake8 run: | - source $HOME/.poetry/env poetry run flake8 From fc888509e353a02ca3e7f095a98d0163af74113d Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Thu, 3 Dec 2020 15:25:28 +0100 Subject: [PATCH 14/19] Update for ghe Github action (test workflow) --- .github/workflows/python_test.yml | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/.github/workflows/python_test.yml b/.github/workflows/python_test.yml index 851ade6..7b96cc8 100644 --- a/.github/workflows/python_test.yml +++ b/.github/workflows/python_test.yml @@ -26,10 +26,11 @@ jobs: run: | curl -fsS -o get-poetry.py https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py python get-poetry.py -y - echo "::set-env name=PATH::$HOME/.poetry/bin:$PATH" - name: Configure poetry - run: poetry config virtualenvs.in-project true + run: | + source $HOME/.poetry/env + poetry config virtualenvs.in-project true - name: Set up cache uses: actions/cache@v1 @@ -38,18 +39,21 @@ jobs: path: .venv key: venv-${{ runner.os }}-${{ steps.full-python-version.outputs.version }}-${{ hashFiles('**/poetry.lock') }} - - name: Ensure cache is healthy - if: steps.cache.outputs.cache-hit == 'true' - run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv + - name: Ensure cache is healthy + if: steps.cache.outputs.cache-hit == 'true' + run: poetry run pip --version >/dev/null 2>&1 || rm -rf .venv - name: Install dependencies run: | + source $HOME/.poetry/env poetry install - name: Test with pytest run: | + source $HOME/.poetry/env poetry run pytest -q tests - name: Lint with flake8 run: | + source $HOME/.poetry/env poetry run flake8 From 940497c83060a2c135b0d9de93818e5fe75a98a2 Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Thu, 3 Dec 2020 15:28:26 +0100 Subject: [PATCH 15/19] Removed obsolete poetry version from the test workflow --- .github/workflows/python_test.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/python_test.yml b/.github/workflows/python_test.yml index 7b96cc8..095c1b8 100644 --- a/.github/workflows/python_test.yml +++ b/.github/workflows/python_test.yml @@ -12,7 +12,6 @@ jobs: max-parallel: 4 matrix: python-version: [2.7, 3.5, 3.6, 3.7, 3.8] - poetry-version: [1.1.4] steps: - uses: actions/checkout@v2 @@ -22,7 +21,7 @@ jobs: with: python-version: ${{ matrix.python-version }} - - name: Install poetry ${{ matrix.poetry-version }} + - name: Install poetry run: | curl -fsS -o get-poetry.py https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py python get-poetry.py -y From 5525c76349bafddc1f1d397a3c19065672ef4f8c Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Thu, 3 Dec 2020 15:34:19 +0100 Subject: [PATCH 16/19] Update poetry lock file --- poetry.lock | 1211 ++++++++++++++++++++------------------------------- 1 file changed, 472 insertions(+), 739 deletions(-) diff --git a/poetry.lock b/poetry.lock index c391e55..8f49b24 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,212 +1,188 @@ [[package]] -category = "dev" -description = "A configurable sidebar-enabled Sphinx theme" name = "alabaster" +version = "0.7.12" +description = "A configurable sidebar-enabled Sphinx theme" +category = "dev" optional = true python-versions = "*" -version = "0.7.12" [[package]] -category = "dev" -description = "apipkg: namespace control and lazy-import mechanism" name = "apipkg" +version = "1.5" +description = "apipkg: namespace control and lazy-import mechanism" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.5" [[package]] -category = "dev" -description = "Disable App Nap on OS X 10.9" -marker = "python_version == \"2.7\" and sys_platform == \"darwin\" or python_version >= \"3.4\" and sys_platform == \"darwin\"" name = "appnope" +version = "0.1.2" +description = "Disable App Nap on macOS >= 10.9" +category = "dev" optional = false python-versions = "*" -version = "0.1.0" [[package]] -category = "dev" -description = "Atomic file writes." name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.3.0" [[package]] -category = "dev" -description = "Classes Without Boilerplate" name = "attrs" +version = "20.3.0" +description = "Classes Without Boilerplate" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "19.3.0" [package.extras] -azure-pipelines = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "pytest-azurepipelines"] -dev = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface", "sphinx", "pre-commit"] -docs = ["sphinx", "zope.interface"] -tests = ["coverage", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "zope.interface"] +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]] -category = "dev" -description = "Internationalization utilities" name = "babel" +version = "2.9.0" +description = "Internationalization utilities" +category = "dev" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.8.0" [package.dependencies] pytz = ">=2015.7" [[package]] -category = "dev" -description = "Specifications for callback functions passed in to an API" -marker = "python_version >= \"3.4\"" name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +category = "dev" optional = false python-versions = "*" -version = "0.1.0" [[package]] -category = "dev" -description = "Backport of functools.lru_cache" -marker = "python_version < \"3.2\"" name = "backports.functools-lru-cache" +version = "1.6.1" +description = "Backport of functools.lru_cache" +category = "dev" optional = false python-versions = ">=2.6" -version = "1.6.1" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-black-multipy", "pytest-cov"] [[package]] -category = "dev" -description = "A backport of the get_terminal_size function from Python 3.3's shutil." -marker = "python_version == \"2.7\"" name = "backports.shutil-get-terminal-size" +version = "1.0.0" +description = "A backport of the get_terminal_size function from Python 3.3's shutil." +category = "dev" optional = false python-versions = "*" -version = "1.0.0" [[package]] -category = "dev" -description = "Python package for providing Mozilla's CA Bundle." name = "certifi" +version = "2020.11.8" +description = "Python package for providing Mozilla's CA Bundle." +category = "dev" optional = true python-versions = "*" -version = "2019.11.28" [[package]] -category = "dev" -description = "Universal encoding detector for Python 2 and 3" name = "chardet" +version = "3.0.4" +description = "Universal encoding detector for Python 2 and 3" +category = "dev" optional = true python-versions = "*" -version = "3.0.4" [[package]] -category = "dev" -description = "Cross-platform colored terminal text." -marker = "sys_platform == \"win32\" and python_version != \"3.4\" or python_version == \"2.7\" and sys_platform == \"win32\" or sys_platform == \"win32\" or python_version >= \"3.4\" and sys_platform == \"win32\"" name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.4.3" [[package]] -category = "dev" -description = "Python parser for the CommonMark Markdown spec" name = "commonmark" +version = "0.9.1" +description = "Python parser for the CommonMark Markdown spec" +category = "dev" optional = true python-versions = "*" -version = "0.9.1" [package.dependencies] -[package.dependencies.future] -python = "<3" -version = ">=0.14.0" +future = {version = ">=0.14.0", markers = "python_version < \"3\""} [package.extras] test = ["flake8 (3.7.8)", "hypothesis (3.55.3)"] [[package]] -category = "dev" -description = "Updated configparser from Python 3.7 for Python 2.6+." -marker = "python_version < \"3.2\"" name = "configparser" +version = "4.0.2" +description = "Updated configparser from Python 3.7 for Python 2.6+." +category = "dev" optional = false python-versions = ">=2.6" -version = "4.0.2" [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["pytest (>=3.5,<3.7.3 || >3.7.3)", "pytest-checkdocs (>=1.2)", "pytest-flake8", "pytest-black-multipy"] [[package]] -category = "dev" -description = "Backports and enhancements for the contextlib module" -marker = "python_version < \"3\"" name = "contextlib2" +version = "0.6.0.post1" +description = "Backports and enhancements for the contextlib module" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.6.0.post1" [[package]] -category = "dev" -description = "Code coverage measurement for Python" name = "coverage" +version = "5.3" +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" -version = "5.0.1" [package.extras] toml = ["toml"] [[package]] -category = "dev" -description = "Decorators for Humans" -marker = "python_version == \"2.7\" or python_version >= \"3.4\"" name = "decorator" +version = "4.4.2" +description = "Decorators for Humans" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.4.1" [[package]] -category = "dev" -description = "Docutils -- Python Documentation Utilities" name = "docutils" -optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" version = "0.16" - -[[package]] +description = "Docutils -- Python Documentation Utilities" category = "dev" -description = "Discover and load entry points from installed packages." -name = "entrypoints" -optional = false -python-versions = ">=2.7" -version = "0.3" - -[package.dependencies] -[package.dependencies.configparser] -python = ">=2.7,<2.8" -version = ">=3.5" +optional = true +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] -category = "dev" -description = "Python 3.4 Enum backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4" -marker = "python_version < \"3.4\"" name = "enum34" +version = "1.1.10" +description = "Python 3.4 Enum backported to 3.3, 3.2, 3.1, 2.7, 2.6, 2.5, and 2.4" +category = "dev" optional = false python-versions = "*" -version = "1.1.6" [[package]] -category = "dev" -description = "execnet: rapid multi-Python deployment" name = "execnet" +version = "1.7.1" +description = "execnet: rapid multi-Python deployment" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.7.1" [package.dependencies] apipkg = ">=1.4" @@ -215,194 +191,149 @@ apipkg = ">=1.4" testing = ["pre-commit"] [[package]] -category = "main" -description = "Faker is a Python package that generates fake data for you." name = "faker" +version = "3.0.1" +description = "Faker is a Python package that generates fake data for you." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "3.0.0" [package.dependencies] +ipaddress = {version = "*", markers = "python_version < \"3.3\""} python-dateutil = ">=2.4" six = ">=1.10" text-unidecode = "1.3" -[package.dependencies.ipaddress] -python = "<3.3" -version = "*" - [[package]] -category = "dev" -description = "the modular source code checker: pep8, pyflakes and co" name = "flake8" +version = "3.8.4" +description = "the modular source code checker: pep8 pyflakes and co" +category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.7.9" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" [package.dependencies] -entrypoints = ">=0.3.0,<0.4.0" +configparser = {version = "*", markers = "python_version < \"3.2\""} +enum34 = {version = "*", markers = "python_version < \"3.4\""} +functools32 = {version = "*", markers = "python_version < \"3.2\""} +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.5.0,<2.6.0" -pyflakes = ">=2.1.0,<2.2.0" - -[package.dependencies.configparser] -python = "<3.2" -version = "*" - -[package.dependencies.enum34] -python = "<3.4" -version = "*" - -[package.dependencies.functools32] -python = "<3.2" -version = "*" - -[package.dependencies.typing] -python = "<3.5" -version = "*" +pycodestyle = ">=2.6.0a1,<2.7.0" +pyflakes = ">=2.2.0,<2.3.0" +typing = {version = "*", markers = "python_version < \"3.5\""} [[package]] -category = "dev" -description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+" -marker = "python_version < \"3.3\"" name = "funcsigs" +version = "1.0.2" +description = "Python function signatures from PEP362 for Python 2.6, 2.7 and 3.2+" +category = "dev" optional = false python-versions = "*" -version = "1.0.2" [[package]] -category = "dev" -description = "Backport of the functools module from Python 3.2.3 for use on 2.7 and PyPy." -marker = "python_version < \"3.2\"" name = "functools32" +version = "3.2.3-2" +description = "Backport of the functools module from Python 3.2.3 for use on 2.7 and PyPy." +category = "dev" optional = false python-versions = "*" -version = "3.2.3-2" [[package]] -category = "dev" -description = "Clean single-source support for Python 3 and 2" -marker = "python_version < \"3\"" name = "future" +version = "0.18.2" +description = "Clean single-source support for Python 3 and 2" +category = "dev" optional = true python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "0.18.2" [[package]] -category = "dev" -description = "Backport of the concurrent.futures package from Python 3" -marker = "python_version < \"3.2\"" name = "futures" +version = "3.3.0" +description = "Backport of the concurrent.futures package from Python 3" +category = "dev" optional = false python-versions = ">=2.6, <3" -version = "3.3.0" [[package]] -category = "dev" -description = "Internationalized Domain Names in Applications (IDNA)" name = "idna" +version = "2.10" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "dev" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.8" [[package]] -category = "dev" -description = "Getting image size from png/jpeg/jpeg2000/gif file" name = "imagesize" +version = "1.2.0" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +category = "dev" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.2.0" [[package]] -category = "dev" -description = "Read metadata from Python packages" -marker = "python_version < \"3.8\"" name = "importlib-metadata" +version = "2.1.1" +description = "Read metadata from Python packages" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "1.3.0" [package.dependencies] +configparser = {version = ">=3.5", markers = "python_version < \"3\""} +contextlib2 = {version = "*", markers = "python_version < \"3\""} +pathlib2 = {version = "*", markers = "python_version < \"3\""} zipp = ">=0.5" -[package.dependencies.configparser] -python = "<3" -version = ">=3.5" - -[package.dependencies.contextlib2] -python = "<3" -version = "*" - -[package.dependencies.pathlib2] -python = "<3" -version = "*" - [package.extras] docs = ["sphinx", "rst.linker"] -testing = ["packaging", "importlib-resources"] +testing = ["packaging", "pep517", "unittest2", "importlib-resources (>=1.3)"] [[package]] -category = "main" -description = "IPv4/IPv6 manipulation library" -marker = "python_version < \"3.3\"" name = "ipaddress" +version = "1.0.23" +description = "IPv4/IPv6 manipulation library" +category = "main" optional = false python-versions = "*" -version = "1.0.23" [[package]] -category = "dev" -description = "IPython-enabled pdb" name = "ipdb" +version = "0.12.3" +description = "IPython-enabled pdb" +category = "dev" optional = false python-versions = ">=2.7" -version = "0.12.3" [package.dependencies] -setuptools = "*" -[[package.dependencies.ipython]] -python = ">=2.7,<2.8" -version = ">=5.1.0,<6.0.0" - -[[package.dependencies.ipython]] -python = ">=3.4" -version = ">=5.1.0" +ipython = [ + {version = ">=5.1.0,<6.0.0", markers = "python_version == \"2.7\""}, + {version = ">=5.1.0", markers = "python_version >= \"3.4\""}, +] [[package]] -category = "dev" -description = "IPython: Productive Interactive Computing" -marker = "python_version == \"2.7\"" name = "ipython" +version = "5.10.0" +description = "IPython: Productive Interactive Computing" +category = "dev" optional = false python-versions = "*" -version = "5.9.0" [package.dependencies] -appnope = "*" -colorama = "*" +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +"backports.shutil-get-terminal-size" = {version = "*", markers = "python_version == \"2.7\""} +colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" -pexpect = "*" +pathlib2 = {version = "*", markers = "python_version == \"2.7\" or python_version == \"3.3\""} +pexpect = {version = "*", markers = "sys_platform != \"win32\""} pickleshare = "*" prompt-toolkit = ">=1.0.4,<2.0.0" -pygments = "*" -setuptools = ">=18.5" +pygments = "<2.6" simplegeneric = ">0.8" traitlets = ">=4.2" - -[package.dependencies."backports.shutil-get-terminal-size"] -python = ">=2.7,<2.8" -version = "*" - -[package.dependencies.pathlib2] -python = ">=2.7,<2.8 || >=3.3,<3.4" -version = "*" - -[package.dependencies.win-unicode-console] -python = "<3.6" -version = ">=0.5" +win-unicode-console = {version = ">=0.5", markers = "sys_platform == \"win32\" and python_version < \"3.6\""} [package.extras] -all = ["nbformat", "ipykernel", "pygments", "testpath", "notebook", "nbconvert", "ipyparallel", "qtconsole", "Sphinx (>=1.3)", "requests", "nose (>=0.10.1)", "ipywidgets"] +all = ["nbformat", "ipykernel", "pygments (<2.6)", "testpath", "notebook", "nbconvert", "ipyparallel", "qtconsole", "Sphinx (>=1.3)", "requests", "nose (>=0.10.1)", "ipywidgets"] doc = ["Sphinx (>=1.3)"] kernel = ["ipykernel"] nbconvert = ["nbconvert"] @@ -410,33 +341,28 @@ nbformat = ["nbformat"] notebook = ["notebook", "ipywidgets"] parallel = ["ipyparallel"] qtconsole = ["qtconsole"] -test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "mock", "numpy"] +test = ["nose (>=0.10.1)", "requests", "testpath", "pygments (<2.6)", "nbformat", "ipykernel", "mock", "numpy"] [[package]] -category = "dev" -description = "IPython: Productive Interactive Computing" -marker = "python_version >= \"3.4\"" name = "ipython" +version = "7.9.0" +description = "IPython: Productive Interactive Computing" +category = "dev" optional = false python-versions = ">=3.5" -version = "7.9.0" [package.dependencies] -appnope = "*" +appnope = {version = "*", markers = "sys_platform == \"darwin\""} backcall = "*" -colorama = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" jedi = ">=0.10" -pexpect = "*" +pexpect = {version = "*", markers = "sys_platform != \"win32\""} pickleshare = "*" prompt-toolkit = ">=2.0.0,<2.1.0" pygments = "*" -setuptools = ">=18.5" traitlets = ">=4.2" - -[package.dependencies.win-unicode-console] -python = "<3.6" -version = ">=0.5" +win-unicode-console = {version = ">=0.5", markers = "sys_platform == \"win32\" and python_version < \"3.6\""} [package.extras] all = ["testpath", "nbformat", "numpy", "notebook", "ipyparallel", "nbconvert", "ipywidgets", "pygments", "requests", "nose (>=0.10.1)", "qtconsole", "ipykernel", "Sphinx (>=1.3)"] @@ -450,30 +376,24 @@ qtconsole = ["qtconsole"] test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy"] [[package]] -category = "dev" -description = "Vestigial utilities from IPython" -marker = "python_version == \"2.7\" or python_version >= \"3.4\"" name = "ipython-genutils" +version = "0.2.0" +description = "Vestigial utilities from IPython" +category = "dev" optional = false python-versions = "*" -version = "0.2.0" [[package]] -category = "dev" -description = "A Python utility / library to sort Python imports." name = "isort" +version = "4.3.21" +description = "A Python utility / library to sort Python imports." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "4.3.21" [package.dependencies] -[package.dependencies."backports.functools-lru-cache"] -python = "<3.2" -version = "*" - -[package.dependencies.futures] -python = "<3.2" -version = "*" +"backports.functools-lru-cache" = {version = "*", markers = "python_version < \"3.2\""} +futures = {version = "*", markers = "python_version < \"3.2\""} [package.extras] pipfile = ["pipreqs", "requirementslib"] @@ -482,27 +402,27 @@ requirements = ["pipreqs", "pip-api"] xdg_home = ["appdirs (>=1.4.0)"] [[package]] -category = "dev" -description = "An autocompletion tool for Python that can be used for text editors." -marker = "python_version >= \"3.4\"" name = "jedi" +version = "0.17.2" +description = "An autocompletion tool for Python that can be used for text editors." +category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.15.2" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] -parso = ">=0.5.2" +parso = ">=0.7.0,<0.8.0" [package.extras] -testing = ["colorama (0.4.1)", "docopt", "pytest (>=3.9.0,<5.0.0)"] +qa = ["flake8 (3.7.9)"] +testing = ["Django (<3.1)", "colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] [[package]] -category = "dev" -description = "A very fast and expressive template engine." name = "jinja2" +version = "2.11.2" +description = "A very fast and expressive template engine." +category = "dev" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.11.1" [package.dependencies] MarkupSafe = ">=0.23" @@ -511,321 +431,285 @@ MarkupSafe = ">=0.23" i18n = ["Babel (>=0.8)"] [[package]] -category = "dev" -description = "Safely add untrusted strings to HTML/XML markup." name = "markupsafe" +version = "1.1.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "dev" optional = true python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -version = "1.1.1" [[package]] -category = "dev" -description = "McCabe checker, plugin for flake8" name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +category = "dev" optional = false python-versions = "*" -version = "0.6.1" [[package]] -category = "dev" -description = "Rolling backport of unittest.mock for all Pythons" name = "mock" +version = "3.0.5" +description = "Rolling backport of unittest.mock for all Pythons" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.0.5" [package.dependencies] +funcsigs = {version = ">=1", markers = "python_version < \"3.3\""} six = "*" -[package.dependencies.funcsigs] -python = "<3.3" -version = ">=1" - [package.extras] build = ["twine", "wheel", "blurb"] docs = ["sphinx"] test = ["pytest", "pytest-cov"] [[package]] -category = "dev" -description = "More routines for operating on iterables, beyond itertools" -marker = "python_version < \"3.8\"" name = "more-itertools" +version = "5.0.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" optional = false python-versions = "*" -version = "5.0.0" [package.dependencies] six = ">=1.0.0,<2.0.0" [[package]] -category = "dev" -description = "More routines for operating on iterables, beyond itertools" -marker = "python_version < \"3.8\" or python_version > \"2.7\"" name = "more-itertools" +version = "8.6.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" optional = false python-versions = ">=3.5" -version = "8.0.2" [[package]] -category = "dev" -description = "Core utilities for Python packages" name = "packaging" +version = "20.7" +description = "Core utilities for Python packages" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "19.2" [package.dependencies] pyparsing = ">=2.0.2" -six = "*" [[package]] -category = "dev" -description = "A Python Parser" -marker = "python_version >= \"3.4\"" name = "parso" +version = "0.7.1" +description = "A Python Parser" +category = "dev" optional = false -python-versions = "*" -version = "0.5.2" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [package.extras] testing = ["docopt", "pytest (>=3.0.7)"] [[package]] -category = "dev" -description = "Object-oriented filesystem paths" -marker = "python_version < \"3.6\" or python_version == \"2.7\"" name = "pathlib2" +version = "2.3.5" +description = "Object-oriented filesystem paths" +category = "dev" optional = false python-versions = "*" -version = "2.3.5" [package.dependencies] +scandir = {version = "*", markers = "python_version < \"3.5\""} six = "*" -[package.dependencies.scandir] -python = "<3.5" -version = "*" - [[package]] -category = "dev" -description = "Python style guide checker" name = "pep8" +version = "1.7.1" +description = "Python style guide checker" +category = "dev" optional = false python-versions = "*" -version = "1.7.1" [[package]] -category = "dev" -description = "Pexpect allows easy control of interactive console applications." -marker = "python_version == \"2.7\" and sys_platform != \"win32\" or python_version >= \"3.4\" and sys_platform != \"win32\"" name = "pexpect" +version = "4.8.0" +description = "Pexpect allows easy control of interactive console applications." +category = "dev" optional = false python-versions = "*" -version = "4.7.0" [package.dependencies] ptyprocess = ">=0.5" [[package]] -category = "dev" -description = "Tiny 'shelve'-like database with concurrency support" -marker = "python_version == \"2.7\" or python_version >= \"3.4\"" name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +category = "dev" optional = false python-versions = "*" -version = "0.7.5" [package.dependencies] -[package.dependencies.pathlib2] -python = ">=2.6.0,<2.8.0 || >=3.2.0,<3.4.0" -version = "*" +pathlib2 = {version = "*", markers = "python_version in \"2.6 2.7 3.2 3.3\""} [[package]] -category = "dev" -description = "plugin and hook calling mechanisms for python" name = "pluggy" +version = "0.13.1" +description = "plugin and hook calling mechanisms for python" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.13.1" [package.dependencies] -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} [package.extras] dev = ["pre-commit", "tox"] [[package]] -category = "main" -description = "Easy to use progress bars" name = "progress" +version = "1.5" +description = "Easy to use progress bars" +category = "main" optional = false python-versions = "*" -version = "1.5" [[package]] -category = "dev" -description = "Library for building powerful interactive command lines in Python" -marker = "python_version == \"2.7\"" name = "prompt-toolkit" +version = "1.0.18" +description = "Library for building powerful interactive command lines in Python" +category = "dev" optional = false python-versions = "*" -version = "1.0.18" [package.dependencies] six = ">=1.9.0" wcwidth = "*" [[package]] -category = "dev" -description = "Library for building powerful interactive command lines in Python" -marker = "python_version >= \"3.4\"" name = "prompt-toolkit" +version = "2.0.10" +description = "Library for building powerful interactive command lines in Python" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.0.10" [package.dependencies] six = ">=1.9.0" wcwidth = "*" [[package]] -category = "main" -description = "psycopg2 - Python-PostgreSQL Database Adapter" name = "psycopg2-binary" +version = "2.8.6" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -version = "2.8.4" [[package]] -category = "dev" -description = "Run a subprocess in a pseudo terminal" -marker = "python_version == \"2.7\" and sys_platform != \"win32\" and (python_version == \"2.7\" and sys_platform != \"win32\" or python_version >= \"3.4\" and sys_platform != \"win32\") or python_version >= \"3.4\" and sys_platform != \"win32\" and (python_version == \"2.7\" and sys_platform != \"win32\" or python_version >= \"3.4\" and sys_platform != \"win32\")" name = "ptyprocess" +version = "0.6.0" +description = "Run a subprocess in a pseudo terminal" +category = "dev" optional = false python-versions = "*" -version = "0.6.0" [[package]] -category = "dev" -description = "library with cross-python path, ini-parsing, io, code, log facilities" name = "py" +version = "1.9.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.*" -version = "1.8.1" [[package]] -category = "dev" -description = "Python style guide checker" name = "pycodestyle" +version = "2.6.0" +description = "Python style guide checker" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.5.0" [[package]] -category = "dev" -description = "passive checker of Python programs" name = "pyflakes" +version = "2.2.0" +description = "passive checker of Python programs" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.1.1" [[package]] -category = "dev" -description = "Pygments is a syntax highlighting package written in Python." name = "pygments" +version = "2.5.2" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.5.2" [[package]] -category = "dev" -description = "Python parsing module" name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.4.6" [[package]] -category = "dev" -description = "pytest: simple powerful testing with Python" name = "pytest" +version = "4.6.11" +description = "pytest: simple powerful testing with Python" +category = "dev" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -version = "4.6.8" [package.dependencies] atomicwrites = ">=1.0" attrs = ">=17.4.0" +colorama = {version = "*", markers = "sys_platform == \"win32\" and python_version != \"3.4\""} +funcsigs = {version = ">=1.0", markers = "python_version < \"3.0\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} +more-itertools = [ + {version = ">=4.0.0,<6.0.0", markers = "python_version <= \"2.7\""}, + {version = ">=4.0.0", markers = "python_version > \"2.7\""}, +] packaging = "*" +pathlib2 = {version = ">=2.2.0", markers = "python_version < \"3.6\""} pluggy = ">=0.12,<1.0" py = ">=1.5.0" six = ">=1.10.0" wcwidth = "*" -[[package.dependencies.more-itertools]] -python = "<2.8" -version = ">=4.0.0,<6.0.0" - -[[package.dependencies.more-itertools]] -python = ">=2.8" -version = ">=4.0.0" - -[package.dependencies.colorama] -python = "<3.4.0 || >=3.5.0" -version = "*" - -[package.dependencies.funcsigs] -python = "<3.0" -version = ">=1.0" - -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" - -[package.dependencies.pathlib2] -python = "<3.6" -version = ">=2.2.0" - [package.extras] testing = ["argcomplete", "hypothesis (>=3.56)", "nose", "requests", "mock"] [[package]] -category = "dev" -description = "pytest plugin with mechanisms for caching across test runs" name = "pytest-cache" +version = "1.0" +description = "pytest plugin with mechanisms for caching across test runs" +category = "dev" optional = false python-versions = "*" -version = "1.0" [package.dependencies] execnet = ">=1.1.dev1" pytest = ">=2.2" [[package]] -category = "dev" -description = "Pytest plugin for measuring coverage." name = "pytest-cov" +version = "2.10.1" +description = "Pytest plugin for measuring coverage." +category = "dev" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.8.1" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [package.dependencies] coverage = ">=4.4" -pytest = ">=3.6" +pytest = ">=4.6" [package.extras] -testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "virtualenv"] +testing = ["fields", "hunter", "process-tests (2.0.2)", "six", "pytest-xdist", "virtualenv"] [[package]] -category = "dev" -description = "pytest plugin to check PEP8 requirements" name = "pytest-pep8" +version = "1.0.6" +description = "pytest plugin to check PEP8 requirements" +category = "dev" optional = false python-versions = "*" -version = "1.0.6" [package.dependencies] pep8 = ">=1.3" @@ -833,50 +717,50 @@ pytest = ">=2.4.2" pytest-cache = "*" [[package]] -category = "dev" -description = "pytest plugin for adding to the PYTHONPATH from command line or configs." name = "pytest-pythonpath" +version = "0.7.3" +description = "pytest plugin for adding to the PYTHONPATH from command line or configs." +category = "dev" optional = false python-versions = "*" -version = "0.7.3" [package.dependencies] pytest = ">=2.5.2" [[package]] -category = "main" -description = "Extensions to the standard Python datetime module" name = "python-dateutil" +version = "2.8.1" +description = "Extensions to the standard Python datetime module" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -version = "2.8.1" [package.dependencies] six = ">=1.5" [[package]] -category = "dev" -description = "World timezone definitions, modern and historical" name = "pytz" +version = "2020.4" +description = "World timezone definitions, modern and historical" +category = "dev" optional = true python-versions = "*" -version = "2019.3" [[package]] -category = "main" -description = "YAML parser and emitter for Python" name = "pyyaml" +version = "5.3.1" +description = "YAML parser and emitter for Python" +category = "main" optional = false -python-versions = "*" -version = "5.2" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] -category = "dev" -description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." name = "recommonmark" +version = "0.6.0" +description = "A docutils-compatibility bridge to CommonMark, enabling you to write CommonMark inside of Docutils & Sphinx projects." +category = "dev" optional = true python-versions = "*" -version = "0.6.0" [package.dependencies] commonmark = ">=0.8.1" @@ -884,252 +768,144 @@ docutils = ">=0.11" sphinx = ">=1.3.1" [[package]] -category = "dev" -description = "Python HTTP for Humans." name = "requests" +version = "2.25.0" +description = "Python HTTP for Humans." +category = "dev" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.22.0" [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" +chardet = ">=3.0.2,<4" +idna = ">=2.5,<3" +urllib3 = ">=1.21.1,<1.27" [package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)"] +security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] [[package]] -category = "dev" -description = "scandir, a better directory iterator and faster os.walk()" -marker = "python_version < \"3.5\" or python_version == \"2.7\"" name = "scandir" +version = "1.10.0" +description = "scandir, a better directory iterator and faster os.walk()" +category = "dev" optional = false python-versions = "*" -version = "1.10.0" [[package]] -category = "dev" -description = "Simple generic functions (similar to Python's own len(), pickle.dump(), etc.)" -marker = "python_version == \"2.7\"" name = "simplegeneric" +version = "0.8.1" +description = "Simple generic functions (similar to Python's own len(), pickle.dump(), etc.)" +category = "dev" optional = false python-versions = "*" -version = "0.8.1" [[package]] -category = "main" -description = "Python 2 and 3 compatibility utilities" name = "six" +version = "1.15.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "1.13.0" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" [[package]] -category = "dev" -description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." name = "snowballstemmer" +version = "2.0.0" +description = "This package provides 26 stemmers for 25 languages generated from Snowball algorithms." +category = "dev" optional = true python-versions = "*" -version = "2.0.0" [[package]] -category = "dev" -description = "Python documentation generator" name = "sphinx" +version = "1.8.5" +description = "Python documentation generator" +category = "dev" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.8.5" [package.dependencies] -Jinja2 = ">=2.3" -Pygments = ">=2.0" alabaster = ">=0.7,<0.8" babel = ">=1.3,<2.0 || >2.0" -colorama = ">=0.3.5" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} docutils = ">=0.11" imagesize = "*" +Jinja2 = ">=2.3" packaging = "*" +Pygments = ">=2.0" requests = ">=2.0.0" -setuptools = "*" six = ">=1.5" snowballstemmer = ">=1.1" sphinxcontrib-websupport = "*" - -[package.dependencies.typing] -python = "<3.5" -version = "*" +typing = {version = "*", markers = "python_version < \"3.5\""} [package.extras] test = ["mock", "pytest", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "enum34", "mypy", "typed-ast"] websupport = ["sqlalchemy (>=0.9)", "whoosh (>=2.0)"] [[package]] -category = "dev" -description = "Python documentation generator" -name = "sphinx" -optional = true -python-versions = ">=3.5" -version = "2.3.0" - -[package.dependencies] -Jinja2 = ">=2.3" -Pygments = ">=2.0" -alabaster = ">=0.7,<0.8" -babel = ">=1.3,<2.0 || >2.0" -colorama = ">=0.3.5" -docutils = ">=0.12" -imagesize = "*" -packaging = "*" -requests = ">=2.5.0" -setuptools = "*" -snowballstemmer = ">=1.1" -sphinxcontrib-applehelp = "*" -sphinxcontrib-devhelp = "*" -sphinxcontrib-htmlhelp = "*" -sphinxcontrib-jsmath = "*" -sphinxcontrib-qthelp = "*" -sphinxcontrib-serializinghtml = "*" - -[package.extras] -docs = ["sphinxcontrib-websupport"] -test = ["pytest", "pytest-cov", "html5lib", "flake8 (>=3.5.0)", "flake8-import-order", "mypy (>=0.750)", "docutils-stubs"] - -[[package]] -category = "dev" -description = "Read the Docs theme for Sphinx" name = "sphinx-rtd-theme" -optional = true -python-versions = "*" version = "0.4.3" - -[package.dependencies] -sphinx = "*" - -[[package]] -category = "dev" -description = "" -name = "sphinxcontrib-applehelp" -optional = true -python-versions = "*" -version = "1.0.1" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -category = "dev" -description = "" -name = "sphinxcontrib-devhelp" -optional = true -python-versions = "*" -version = "1.0.1" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -category = "dev" -description = "" -name = "sphinxcontrib-htmlhelp" -optional = true -python-versions = "*" -version = "1.0.2" - -[package.extras] -test = ["pytest", "flake8", "mypy", "html5lib"] - -[[package]] -category = "dev" -description = "A sphinx extension which renders display math in HTML via JavaScript" -name = "sphinxcontrib-jsmath" -optional = true -python-versions = ">=3.5" -version = "1.0.1" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] -category = "dev" -description = "" -name = "sphinxcontrib-qthelp" -optional = true -python-versions = "*" -version = "1.0.2" - -[package.extras] -test = ["pytest", "flake8", "mypy"] - -[[package]] +description = "Read the Docs theme for Sphinx" category = "dev" -description = "" -name = "sphinxcontrib-serializinghtml" optional = true python-versions = "*" -version = "1.1.3" -[package.extras] -test = ["pytest", "flake8", "mypy"] +[package.dependencies] +sphinx = "*" [[package]] -category = "dev" -description = "Sphinx API for Web Apps" name = "sphinxcontrib-websupport" +version = "1.1.2" +description = "Sphinx API for Web Apps" +category = "dev" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.1.2" [package.extras] test = ["pytest", "mock"] [[package]] -category = "main" -description = "The most basic Text::Unidecode port" name = "text-unidecode" +version = "1.3" +description = "The most basic Text::Unidecode port" +category = "main" optional = false python-versions = "*" -version = "1.3" [[package]] -category = "dev" -description = "Traitlets Python config system" -marker = "python_version == \"2.7\" or python_version >= \"3.4\"" name = "traitlets" +version = "4.3.3" +description = "Traitlets Python config system" +category = "dev" optional = false python-versions = "*" -version = "4.3.3" [package.dependencies] decorator = "*" +enum34 = {version = "*", markers = "python_version == \"2.7\""} ipython-genutils = "*" six = "*" -[package.dependencies.enum34] -python = ">=2.7,<2.8" -version = "*" - [package.extras] test = ["pytest", "mock"] [[package]] -category = "dev" -description = "Type Hints for Python" -marker = "python_version < \"3.5\"" name = "typing" +version = "3.7.4.3" +description = "Type Hints for Python" +category = "dev" optional = false -python-versions = "*" -version = "3.7.4.1" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] -category = "dev" -description = "HTTP library with thread-safe connection pooling, file post, and more." name = "urllib3" +version = "1.26.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "dev" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.25.8" [package.extras] brotli = ["brotlipy (>=0.6.0)"] @@ -1137,52 +913,43 @@ secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "cer socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] [[package]] -category = "dev" -description = "Measures number of Terminal column cells of wide-character codes" name = "wcwidth" -optional = false -python-versions = "*" -version = "0.1.8" - -[[package]] +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" category = "dev" -description = "A built-package format for Python." -name = "wheel" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.33.6" +python-versions = "*" -[package.extras] -test = ["pytest (>=3.0.0)", "pytest-cov"] +[package.dependencies] +"backports.functools-lru-cache" = {version = ">=1.2.1", markers = "python_version < \"3.2\""} [[package]] -category = "dev" -description = "Enable Unicode input and display when running Python from Windows console." -marker = "sys_platform == \"win32\" and python_version == \"2.7\" or sys_platform == \"win32\" and python_version < \"3.6\" and python_version >= \"3.4\"" name = "win-unicode-console" +version = "0.5" +description = "Enable Unicode input and display when running Python from Windows console." +category = "dev" optional = false python-versions = "*" -version = "0.5" [[package]] -category = "dev" -description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\"" name = "zipp" +version = "1.2.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" optional = false python-versions = ">=2.7" -version = "0.6.0" [package.dependencies] -more-itertools = "*" +contextlib2 = {version = "*", markers = "python_version < \"3.4\""} [package.extras] docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pathlib2", "contextlib2", "unittest2"] +testing = ["pathlib2", "unittest2", "jaraco.itertools", "func-timeout"] [metadata] -content-hash = "9c666c6dd82943018963a04d95106c1d424434a14c9217e43f2fe0df37df1d12" +lock-version = "1.1" python-versions = "~2.7 || ^3.5" +content-hash = "9c666c6dd82943018963a04d95106c1d424434a14c9217e43f2fe0df37df1d12" [metadata.files] alabaster = [ @@ -1194,24 +961,24 @@ apipkg = [ {file = "apipkg-1.5.tar.gz", hash = "sha256:37228cda29411948b422fae072f57e31d3396d2ee1c9783775980ee9c9990af6"}, ] appnope = [ - {file = "appnope-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0"}, - {file = "appnope-0.1.0.tar.gz", hash = "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71"}, + {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, + {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, ] atomicwrites = [ - {file = "atomicwrites-1.3.0-py2.py3-none-any.whl", hash = "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4"}, - {file = "atomicwrites-1.3.0.tar.gz", hash = "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6"}, + {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-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, - {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, + {file = "attrs-20.3.0-py2.py3-none-any.whl", hash = "sha256:31b2eced602aa8423c2aea9c76a724617ed67cf9513173fd3a4f03e3a929c7e6"}, + {file = "attrs-20.3.0.tar.gz", hash = "sha256:832aa3cde19744e49938b91fea06d69ecb9e649c93ba974535d08ad92164f700"}, ] babel = [ - {file = "Babel-2.8.0-py2.py3-none-any.whl", hash = "sha256:d670ea0b10f8b723672d3a6abeb87b565b244da220d76b4dba1b66269ec152d4"}, - {file = "Babel-2.8.0.tar.gz", hash = "sha256:1aac2ae2d0d8ea368fa90906567f5c08463d98ade155c0c4bfedd6a0f7160e38"}, + {file = "Babel-2.9.0-py2.py3-none-any.whl", hash = "sha256:9d35c22fcc79893c3ecc85ac4a56cde1ecf3f19c540bba0922308a6c06ca6fa5"}, + {file = "Babel-2.9.0.tar.gz", hash = "sha256:da031ab54472314f210b0adcff1588ee5d1d1d0ba4dbd07b94dba82bde791e05"}, ] backcall = [ - {file = "backcall-0.1.0.tar.gz", hash = "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4"}, - {file = "backcall-0.1.0.zip", hash = "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"}, + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] "backports.functools-lru-cache" = [ {file = "backports.functools_lru_cache-1.6.1-py2.py3-none-any.whl", hash = "sha256:0bada4c2f8a43d533e4ecb7a12214d9420e66eb206d54bf2d682581ca4b80848"}, @@ -1222,16 +989,16 @@ backcall = [ {file = "backports.shutil_get_terminal_size-1.0.0.tar.gz", hash = "sha256:713e7a8228ae80341c70586d1cc0a8caa5207346927e23d09dcbcaf18eadec80"}, ] certifi = [ - {file = "certifi-2019.11.28-py2.py3-none-any.whl", hash = "sha256:017c25db2a153ce562900032d5bc68e9f191e44e9a0f762f373977de9df1fbb3"}, - {file = "certifi-2019.11.28.tar.gz", hash = "sha256:25b64c7da4cd7479594d035c08c2d809eb4aab3a26e5a990ea98cc450c320f1f"}, + {file = "certifi-2020.11.8-py2.py3-none-any.whl", hash = "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd"}, + {file = "certifi-2020.11.8.tar.gz", hash = "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4"}, ] chardet = [ {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, ] colorama = [ - {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, - {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ] commonmark = [ {file = "commonmark-0.9.1-py2.py3-none-any.whl", hash = "sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9"}, @@ -1246,67 +1013,65 @@ contextlib2 = [ {file = "contextlib2-0.6.0.post1.tar.gz", hash = "sha256:01f490098c18b19d2bd5bb5dc445b2054d2fa97f09a4280ba2c5f3c394c8162e"}, ] coverage = [ - {file = "coverage-5.0.1-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:c90bda74e16bcd03861b09b1d37c0a4158feda5d5a036bb2d6e58de6ff65793e"}, - {file = "coverage-5.0.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:bb3d29df5d07d5399d58a394d0ef50adf303ab4fbf66dfd25b9ef258effcb692"}, - {file = "coverage-5.0.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1ca43dbd739c0fc30b0a3637a003a0d2c7edc1dd618359d58cc1e211742f8bd1"}, - {file = "coverage-5.0.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:591506e088901bdc25620c37aec885e82cc896528f28c57e113751e3471fc314"}, - {file = "coverage-5.0.1-cp27-cp27m-win32.whl", hash = "sha256:a50b0888d8a021a3342d36a6086501e30de7d840ab68fca44913e97d14487dc1"}, - {file = "coverage-5.0.1-cp27-cp27m-win_amd64.whl", hash = "sha256:c792d3707a86c01c02607ae74364854220fb3e82735f631cd0a345dea6b4cee5"}, - {file = "coverage-5.0.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f425f50a6dd807cb9043d15a4fcfba3b5874a54d9587ccbb748899f70dc18c47"}, - {file = "coverage-5.0.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:25b8f60b5c7da71e64c18888f3067d5b6f1334b9681876b2fb41eea26de881ae"}, - {file = "coverage-5.0.1-cp35-cp35m-macosx_10_12_x86_64.whl", hash = "sha256:7362a7f829feda10c7265b553455de596b83d1623b3d436b6d3c51c688c57bf6"}, - {file = "coverage-5.0.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:fcd4459fe35a400b8f416bc57906862693c9f88b66dc925e7f2a933e77f6b18b"}, - {file = "coverage-5.0.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:40fbfd6b044c9db13aeec1daf5887d322c710d811f944011757526ef6e323fd9"}, - {file = "coverage-5.0.1-cp35-cp35m-win32.whl", hash = "sha256:7f2675750c50151f806070ec11258edf4c328340916c53bac0adbc465abd6b1e"}, - {file = "coverage-5.0.1-cp35-cp35m-win_amd64.whl", hash = "sha256:24bcfa86fd9ce86b73a8368383c39d919c497a06eebb888b6f0c12f13e920b1a"}, - {file = "coverage-5.0.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:eeafb646f374988c22c8e6da5ab9fb81367ecfe81c70c292623373d2a021b1a1"}, - {file = "coverage-5.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:2ca2cd5264e84b2cafc73f0045437f70c6378c0d7dbcddc9ee3fe192c1e29e5d"}, - {file = "coverage-5.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2cc707fc9aad2592fc686d63ef72dc0031fc98b6fb921d2f5395d9ab84fbc3ef"}, - {file = "coverage-5.0.1-cp36-cp36m-win32.whl", hash = "sha256:04b961862334687549eb91cd5178a6fbe977ad365bddc7c60f2227f2f9880cf4"}, - {file = "coverage-5.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:232f0b52a5b978288f0bbc282a6c03fe48cd19a04202df44309919c142b3bb9c"}, - {file = "coverage-5.0.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:cfce79ce41cc1a1dc7fc85bb41eeeb32d34a4cf39a645c717c0550287e30ff06"}, - {file = "coverage-5.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c9c6a1d1190c0b75ec7c0f339088309952b82ae8d67a79ff1319eb4e749b96"}, - {file = "coverage-5.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:1cbb88b34187bdb841f2599770b7e6ff8e259dc3bb64fc7893acf44998acf5f8"}, - {file = "coverage-5.0.1-cp37-cp37m-win32.whl", hash = "sha256:ff3936dd5feaefb4f91c8c1f50a06c588b5dc69fba4f7d9c79a6617ad80bb7df"}, - {file = "coverage-5.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:65bead1ac8c8930cf92a1ccaedcce19a57298547d5d1db5c9d4d068a0675c38b"}, - {file = "coverage-5.0.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:348630edea485f4228233c2f310a598abf8afa5f8c716c02a9698089687b6085"}, - {file = "coverage-5.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:960d7f42277391e8b1c0b0ae427a214e1b31a1278de6b73f8807b20c2e913bba"}, - {file = "coverage-5.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0101888bd1592a20ccadae081ba10e8b204d20235d18d05c6f7d5e904a38fc10"}, - {file = "coverage-5.0.1-cp38-cp38m-win32.whl", hash = "sha256:c0fff2733f7c2950f58a4fd09b5db257b00c6fec57bf3f68c5bae004d804b407"}, - {file = "coverage-5.0.1-cp38-cp38m-win_amd64.whl", hash = "sha256:5f622f19abda4e934938e24f1d67599249abc201844933a6f01aaa8663094489"}, - {file = "coverage-5.0.1-cp39-cp39m-win32.whl", hash = "sha256:2714160a63da18aed9340c70ed514973971ee7e665e6b336917ff4cca81a25b1"}, - {file = "coverage-5.0.1-cp39-cp39m-win_amd64.whl", hash = "sha256:b7dbc5e8c39ea3ad3db22715f1b5401cd698a621218680c6daf42c2f9d36e205"}, - {file = "coverage-5.0.1.tar.gz", hash = "sha256:5ac71bba1e07eab403b082c4428f868c1c9e26a21041436b4905c4c3d4e49b08"}, + {file = "coverage-5.3-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:bd3166bb3b111e76a4f8e2980fa1addf2920a4ca9b2b8ca36a3bc3dedc618270"}, + {file = "coverage-5.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9342dd70a1e151684727c9c91ea003b2fb33523bf19385d4554f7897ca0141d4"}, + {file = "coverage-5.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:63808c30b41f3bbf65e29f7280bf793c79f54fb807057de7e5238ffc7cc4d7b9"}, + {file = "coverage-5.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:4d6a42744139a7fa5b46a264874a781e8694bb32f1d76d8137b68138686f1729"}, + {file = "coverage-5.3-cp27-cp27m-win32.whl", hash = "sha256:86e9f8cd4b0cdd57b4ae71a9c186717daa4c5a99f3238a8723f416256e0b064d"}, + {file = "coverage-5.3-cp27-cp27m-win_amd64.whl", hash = "sha256:7858847f2d84bf6e64c7f66498e851c54de8ea06a6f96a32a1d192d846734418"}, + {file = "coverage-5.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:530cc8aaf11cc2ac7430f3614b04645662ef20c348dce4167c22d99bec3480e9"}, + {file = "coverage-5.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:381ead10b9b9af5f64646cd27107fb27b614ee7040bb1226f9c07ba96625cbb5"}, + {file = "coverage-5.3-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:71b69bd716698fa62cd97137d6f2fdf49f534decb23a2c6fc80813e8b7be6822"}, + {file = "coverage-5.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1d44bb3a652fed01f1f2c10d5477956116e9b391320c94d36c6bf13b088a1097"}, + {file = "coverage-5.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1c6703094c81fa55b816f5ae542c6ffc625fec769f22b053adb42ad712d086c9"}, + {file = "coverage-5.3-cp35-cp35m-win32.whl", hash = "sha256:cedb2f9e1f990918ea061f28a0f0077a07702e3819602d3507e2ff98c8d20636"}, + {file = "coverage-5.3-cp35-cp35m-win_amd64.whl", hash = "sha256:7f43286f13d91a34fadf61ae252a51a130223c52bfefb50310d5b2deb062cf0f"}, + {file = "coverage-5.3-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:c851b35fc078389bc16b915a0a7c1d5923e12e2c5aeec58c52f4aa8085ac8237"}, + {file = "coverage-5.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:aac1ba0a253e17889550ddb1b60a2063f7474155465577caa2a3b131224cfd54"}, + {file = "coverage-5.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2b31f46bf7b31e6aa690d4c7a3d51bb262438c6dcb0d528adde446531d0d3bb7"}, + {file = "coverage-5.3-cp36-cp36m-win32.whl", hash = "sha256:c5f17ad25d2c1286436761b462e22b5020d83316f8e8fcb5deb2b3151f8f1d3a"}, + {file = "coverage-5.3-cp36-cp36m-win_amd64.whl", hash = "sha256:aef72eae10b5e3116bac6957de1df4d75909fc76d1499a53fb6387434b6bcd8d"}, + {file = "coverage-5.3-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:e8caf961e1b1a945db76f1b5fa9c91498d15f545ac0ababbe575cfab185d3bd8"}, + {file = "coverage-5.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:29a6272fec10623fcbe158fdf9abc7a5fa032048ac1d8631f14b50fbfc10d17f"}, + {file = "coverage-5.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:2d43af2be93ffbad25dd959899b5b809618a496926146ce98ee0b23683f8c51c"}, + {file = "coverage-5.3-cp37-cp37m-win32.whl", hash = "sha256:c3888a051226e676e383de03bf49eb633cd39fc829516e5334e69b8d81aae751"}, + {file = "coverage-5.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9669179786254a2e7e57f0ecf224e978471491d660aaca833f845b72a2df3709"}, + {file = "coverage-5.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0203acd33d2298e19b57451ebb0bed0ab0c602e5cf5a818591b4918b1f97d516"}, + {file = "coverage-5.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:582ddfbe712025448206a5bc45855d16c2e491c2dd102ee9a2841418ac1c629f"}, + {file = "coverage-5.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:0f313707cdecd5cd3e217fc68c78a960b616604b559e9ea60cc16795c4304259"}, + {file = "coverage-5.3-cp38-cp38-win32.whl", hash = "sha256:78e93cc3571fd928a39c0b26767c986188a4118edc67bc0695bc7a284da22e82"}, + {file = "coverage-5.3-cp38-cp38-win_amd64.whl", hash = "sha256:8f264ba2701b8c9f815b272ad568d555ef98dfe1576802ab3149c3629a9f2221"}, + {file = "coverage-5.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:50691e744714856f03a86df3e2bff847c2acede4c191f9a1da38f088df342978"}, + {file = "coverage-5.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9361de40701666b034c59ad9e317bae95c973b9ff92513dd0eced11c6adf2e21"}, + {file = "coverage-5.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:c1b78fb9700fc961f53386ad2fd86d87091e06ede5d118b8a50dea285a071c24"}, + {file = "coverage-5.3-cp39-cp39-win32.whl", hash = "sha256:cb7df71de0af56000115eafd000b867d1261f786b5eebd88a0ca6360cccfaca7"}, + {file = "coverage-5.3-cp39-cp39-win_amd64.whl", hash = "sha256:47a11bdbd8ada9b7ee628596f9d97fbd3851bd9999d398e9436bd67376dbece7"}, + {file = "coverage-5.3.tar.gz", hash = "sha256:280baa8ec489c4f542f8940f9c4c2181f0306a8ee1a54eceba071a449fb870a0"}, ] decorator = [ - {file = "decorator-4.4.1-py2.py3-none-any.whl", hash = "sha256:5d19b92a3c8f7f101c8dd86afd86b0f061a8ce4540ab8cd401fa2542756bce6d"}, - {file = "decorator-4.4.1.tar.gz", hash = "sha256:54c38050039232e1db4ad7375cfce6748d7b41c29e95a081c8a6d2c30364a2ce"}, + {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, + {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, ] docutils = [ {file = "docutils-0.16-py2.py3-none-any.whl", hash = "sha256:0c5b78adfbf7762415433f5515cd5c9e762339e23369dbe8000d84a4bf4ab3af"}, {file = "docutils-0.16.tar.gz", hash = "sha256:c2de3a60e9e7d07be26b7f2b00ca0309c207e06c100f9cc2a94931fc75a478fc"}, ] -entrypoints = [ - {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, - {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, -] enum34 = [ - {file = "enum34-1.1.6-py2-none-any.whl", hash = "sha256:6bd0f6ad48ec2aa117d3d141940d484deccda84d4fcd884f5c3d93c23ecd8c79"}, - {file = "enum34-1.1.6-py3-none-any.whl", hash = "sha256:644837f692e5f550741432dd3f223bbb9852018674981b1664e5dc339387588a"}, - {file = "enum34-1.1.6.tar.gz", hash = "sha256:8ad8c4783bf61ded74527bffb48ed9b54166685e4230386a9ed9b1279e2df5b1"}, - {file = "enum34-1.1.6.zip", hash = "sha256:2d81cbbe0e73112bdfe6ef8576f2238f2ba27dd0d55752a776c41d38b7da2850"}, + {file = "enum34-1.1.10-py2-none-any.whl", hash = "sha256:a98a201d6de3f2ab3db284e70a33b0f896fbf35f8086594e8c9e74b909058d53"}, + {file = "enum34-1.1.10-py3-none-any.whl", hash = "sha256:c3858660960c984d6ab0ebad691265180da2b43f07e061c0f8dca9ef3cffd328"}, + {file = "enum34-1.1.10.tar.gz", hash = "sha256:cce6a7477ed816bd2542d03d53db9f0db935dd013b70f336a95c73979289f248"}, ] execnet = [ {file = "execnet-1.7.1-py2.py3-none-any.whl", hash = "sha256:d4efd397930c46415f62f8a31388d6be4f27a91d7550eb79bc64a756e0056547"}, {file = "execnet-1.7.1.tar.gz", hash = "sha256:cacb9df31c9680ec5f95553976c4da484d407e85e41c83cb812aa014f0eddc50"}, ] faker = [ - {file = "Faker-3.0.0-py2.py3-none-any.whl", hash = "sha256:202ad3b2ec16ae7c51c02904fb838831f8d2899e61bf18db1e91a5a582feab11"}, - {file = "Faker-3.0.0.tar.gz", hash = "sha256:92c84a10bec81217d9cb554ee12b3838c8986ce0b5d45f72f769da22e4bb5432"}, + {file = "Faker-3.0.1-py2.py3-none-any.whl", hash = "sha256:6eb3581e990e36ef6f1cf37f70f9a799e119e1a7b94a6062a14f1b8d781c67e4"}, + {file = "Faker-3.0.1.tar.gz", hash = "sha256:c7f7466cb9ba58d582f713494acdb5ebcc462336c5e38c5230b0cdab37069985"}, ] flake8 = [ - {file = "flake8-3.7.9-py2.py3-none-any.whl", hash = "sha256:49356e766643ad15072a789a20915d3c91dc89fd313ccd71802303fd67e4deca"}, - {file = "flake8-3.7.9.tar.gz", hash = "sha256:45681a117ecc81e870cbf1262835ae4af5e7a8b08e40b944a8a6e6b895914cfb"}, + {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, + {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, ] funcsigs = [ {file = "funcsigs-1.0.2-py2.py3-none-any.whl", hash = "sha256:330cc27ccbf7f1e992e69fef78261dc7c6569012cf397db8d3de0234e6c937ca"}, @@ -1324,16 +1089,16 @@ futures = [ {file = "futures-3.3.0.tar.gz", hash = "sha256:7e033af76a5e35f58e56da7a91e687706faf4e7bdfb2cbc3f2cca6b9bcda9794"}, ] idna = [ - {file = "idna-2.8-py2.py3-none-any.whl", hash = "sha256:ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"}, - {file = "idna-2.8.tar.gz", hash = "sha256:c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407"}, + {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, + {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ] imagesize = [ {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, ] importlib-metadata = [ - {file = "importlib_metadata-1.3.0-py2.py3-none-any.whl", hash = "sha256:d95141fbfa7ef2ec65cfd945e2af7e5a6ddbd7c8d9a25e66ff3be8e3daf9f60f"}, - {file = "importlib_metadata-1.3.0.tar.gz", hash = "sha256:073a852570f92da5f744a3472af1b61e28e9f78ccf0c9117658dc32b15de7b45"}, + {file = "importlib_metadata-2.1.1-py2.py3-none-any.whl", hash = "sha256:c2d6341ff566f609e89a2acb2db190e5e1d23d5409d6cc8d2fe34d72443876d4"}, + {file = "importlib_metadata-2.1.1.tar.gz", hash = "sha256:b8de9eff2b35fb037368f28a7df1df4e6436f578fa74423505b6c6a778d5b5dd"}, ] ipaddress = [ {file = "ipaddress-1.0.23-py2.py3-none-any.whl", hash = "sha256:6e0f4a39e66cb5bb9a137b00276a2eff74f93b71dcbdad6f10ff7df9d3557fcc"}, @@ -1343,9 +1108,9 @@ ipdb = [ {file = "ipdb-0.12.3.tar.gz", hash = "sha256:5d9a4a0e3b7027a158fc6f2929934341045b9c3b0b86ed5d7e84e409653f72fd"}, ] ipython = [ - {file = "ipython-5.9.0-py2-none-any.whl", hash = "sha256:54526d92db62bedd872c18131ac7d753fcf054ea34752e1e6ef8eb26391fb1f0"}, - {file = "ipython-5.9.0-py3-none-any.whl", hash = "sha256:fbeb7b8344dbb7f4939227ed9b2816ac6028db1775521365619b77f3c943ba74"}, - {file = "ipython-5.9.0.tar.gz", hash = "sha256:8ac83f3a6232b7a5ee4d3535193e782d3de8c260e7b034b968a9cd1e1580f789"}, + {file = "ipython-5.10.0-py2-none-any.whl", hash = "sha256:68eb2d70595ea5c3f9f5f8f562c9119e86b0f84de3e5d23407a142cb2a73ba11"}, + {file = "ipython-5.10.0-py3-none-any.whl", hash = "sha256:c58f6aabf833393babf321bc88091a53b861cbd2eff3588dabfc710e2e1cddaf"}, + {file = "ipython-5.10.0.tar.gz", hash = "sha256:d1f9e2d02bb0900ddef7b6af114aca3a5cf3dc43b9de1f19d37c4aedbc724fee"}, {file = "ipython-7.9.0-py3-none-any.whl", hash = "sha256:ed7ebe1cba899c1c3ccad6f7f1c2d2369464cc77dba8eebc65e2043e19cda995"}, {file = "ipython-7.9.0.tar.gz", hash = "sha256:dfd303b270b7b5232b3d08bd30ec6fd685d8a58cabd54055e3d69d8f029f7280"}, ] @@ -1358,12 +1123,12 @@ isort = [ {file = "isort-4.3.21.tar.gz", hash = "sha256:54da7e92468955c4fceacd0c86bd0ec997b0e1ee80d97f67c35a78b719dccab1"}, ] jedi = [ - {file = "jedi-0.15.2-py2.py3-none-any.whl", hash = "sha256:1349c1e8c107095a55386628bb3b2a79422f3a2cab8381e34ce19909e0cf5064"}, - {file = "jedi-0.15.2.tar.gz", hash = "sha256:e909527104a903606dd63bea6e8e888833f0ef087057829b89a18364a856f807"}, + {file = "jedi-0.17.2-py2.py3-none-any.whl", hash = "sha256:98cc583fa0f2f8304968199b01b6b4b94f469a1f4a74c1560506ca2a211378b5"}, + {file = "jedi-0.17.2.tar.gz", hash = "sha256:86ed7d9b750603e4ba582ea8edc678657fb4007894a12bcf6f4bb97892f31d20"}, ] jinja2 = [ - {file = "Jinja2-2.11.1-py2.py3-none-any.whl", hash = "sha256:b0eaf100007721b5c16c1fc1eecb87409464edc10469ddc9a22a27a99123be49"}, - {file = "Jinja2-2.11.1.tar.gz", hash = "sha256:93187ffbc7808079673ef52771baa950426fd664d3aad1d0fa3e95644360e250"}, + {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, + {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, ] markupsafe = [ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, @@ -1393,11 +1158,6 @@ markupsafe = [ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win32.whl", hash = "sha256:b00c1de48212e4cc9603895652c5c410df699856a2853135b3967591e4beebc2"}, {file = "MarkupSafe-1.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:9bf40443012702a1d2070043cb6291650a0841ece432556f784f004937f0f32c"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6788b695d50a51edb699cb55e35487e430fa21f1ed838122d722e0ff0ac5ba15"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:cdb132fc825c38e1aeec2c8aa9338310d29d337bebbd7baa06889d09a60a1fa2"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:13d3144e1e340870b25e7b10b98d779608c02016d5184cfb9927a9f10c689f42"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win32.whl", hash = "sha256:596510de112c685489095da617b5bcbbac7dd6384aeebeda4df6025d0256a81b"}, - {file = "MarkupSafe-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:e8313f01ba26fbbe36c7be1966a7b7424942f670f38e666995b88d012765b9be"}, {file = "MarkupSafe-1.1.1.tar.gz", hash = "sha256:29872e92839765e546828bb7754a68c418d927cd064fd4708fab9fe9c8bb116b"}, ] mccabe = [ @@ -1412,16 +1172,16 @@ more-itertools = [ {file = "more-itertools-5.0.0.tar.gz", hash = "sha256:38a936c0a6d98a38bcc2d03fdaaedaba9f412879461dd2ceff8d37564d6522e4"}, {file = "more_itertools-5.0.0-py2-none-any.whl", hash = "sha256:c0a5785b1109a6bd7fac76d6837fd1feca158e54e521ccd2ae8bfe393cc9d4fc"}, {file = "more_itertools-5.0.0-py3-none-any.whl", hash = "sha256:fe7a7cae1ccb57d33952113ff4fa1bc5f879963600ed74918f1236e212ee50b9"}, - {file = "more-itertools-8.0.2.tar.gz", hash = "sha256:b84b238cce0d9adad5ed87e745778d20a3f8487d0f0cb8b8a586816c7496458d"}, - {file = "more_itertools-8.0.2-py3-none-any.whl", hash = "sha256:c833ef592a0324bcc6a60e48440da07645063c453880c9477ceb22490aec1564"}, + {file = "more-itertools-8.6.0.tar.gz", hash = "sha256:b3a9005928e5bed54076e6e549c792b306fddfe72b2d1d22dd63d42d5d3899cf"}, + {file = "more_itertools-8.6.0-py3-none-any.whl", hash = "sha256:8e1a2a43b2f2727425f2b5839587ae37093f19153dc26c0927d1048ff6557330"}, ] packaging = [ - {file = "packaging-19.2-py2.py3-none-any.whl", hash = "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108"}, - {file = "packaging-19.2.tar.gz", hash = "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47"}, + {file = "packaging-20.7-py2.py3-none-any.whl", hash = "sha256:eb41423378682dadb7166144a4926e443093863024de508ca5c9737d6bc08376"}, + {file = "packaging-20.7.tar.gz", hash = "sha256:05af3bb85d320377db281cf254ab050e1a7ebcbf5410685a9a407e18a1f81236"}, ] parso = [ - {file = "parso-0.5.2-py2.py3-none-any.whl", hash = "sha256:5c1f7791de6bd5dbbeac8db0ef5594b36799de198b3f7f7014643b0c5536b9d3"}, - {file = "parso-0.5.2.tar.gz", hash = "sha256:55cf25df1a35fd88b878715874d2c4dc1ad3f0eebd1e0266a67e1f55efccfbe1"}, + {file = "parso-0.7.1-py2.py3-none-any.whl", hash = "sha256:97218d9159b2520ff45eb78028ba8b50d2bc61dcc062a9682666f2dc4bd331ea"}, + {file = "parso-0.7.1.tar.gz", hash = "sha256:caba44724b994a8a5e086460bb212abc5a8bc46951bf4a9a1210745953622eb9"}, ] pathlib2 = [ {file = "pathlib2-2.3.5-py2.py3-none-any.whl", hash = "sha256:0ec8205a157c80d7acc301c0b18fbd5d44fe655968f5d947b6ecef5290fc35db"}, @@ -1432,8 +1192,8 @@ pep8 = [ {file = "pep8-1.7.1.tar.gz", hash = "sha256:fe249b52e20498e59e0b5c5256aa52ee99fc295b26ec9eaa85776ffdb9fe6374"}, ] pexpect = [ - {file = "pexpect-4.7.0-py2.py3-none-any.whl", hash = "sha256:2094eefdfcf37a1fdbfb9aa090862c1a4878e5c7e0e7e7088bdb511c558e5cd1"}, - {file = "pexpect-4.7.0.tar.gz", hash = "sha256:9e2c1fd0e6ee3a49b28f95d4b33bc389c89b20af6a1255906e90ff1262ce62eb"}, + {file = "pexpect-4.8.0-py2.py3-none-any.whl", hash = "sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937"}, + {file = "pexpect-4.8.0.tar.gz", hash = "sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c"}, ] pickleshare = [ {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, @@ -1455,73 +1215,76 @@ prompt-toolkit = [ {file = "prompt_toolkit-2.0.10.tar.gz", hash = "sha256:f15af68f66e664eaa559d4ac8a928111eebd5feda0c11738b5998045224829db"}, ] psycopg2-binary = [ - {file = "psycopg2-binary-2.8.4.tar.gz", hash = "sha256:3a2522b1d9178575acee4adf8fd9f979f9c0449b00b4164bb63c3475ea6528ed"}, - {file = "psycopg2_binary-2.8.4-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:890167d5091279a27e2505ff0e1fb273f8c48c41d35c5b92adbf4af80e6b2ed6"}, - {file = "psycopg2_binary-2.8.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:dbc5cd56fff1a6152ca59445178652756f4e509f672e49ccdf3d79c1043113a4"}, - {file = "psycopg2_binary-2.8.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:7f42a8490c4fe854325504ce7a6e4796b207960dabb2cbafe3c3959cb00d1d7e"}, - {file = "psycopg2_binary-2.8.4-cp27-cp27m-win32.whl", hash = "sha256:8578d6b8192e4c805e85f187bc530d0f52ba86c39172e61cd51f68fddd648103"}, - {file = "psycopg2_binary-2.8.4-cp27-cp27m-win_amd64.whl", hash = "sha256:5dd90c5438b4f935c9d01fcbad3620253da89d19c1f5fca9158646407ed7df35"}, - {file = "psycopg2_binary-2.8.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:9aadff9032e967865f9778485571e93908d27dab21d0fdfdec0ca779bb6f8ad9"}, - {file = "psycopg2_binary-2.8.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:659c815b5b8e2a55193ede2795c1e2349b8011497310bb936da7d4745652823b"}, - {file = "psycopg2_binary-2.8.4-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:2166e770cb98f02ed5ee2b0b569d40db26788e0bf2ec3ae1a0d864ea6f1d8309"}, - {file = "psycopg2_binary-2.8.4-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:7e6e3c52e6732c219c07bd97fff6c088f8df4dae3b79752ee3a817e6f32e177e"}, - {file = "psycopg2_binary-2.8.4-cp34-cp34m-win32.whl", hash = "sha256:040234f8a4a8dfd692662a8308d78f63f31a97e1c42d2480e5e6810c48966a29"}, - {file = "psycopg2_binary-2.8.4-cp34-cp34m-win_amd64.whl", hash = "sha256:69b13fdf12878b10dc6003acc8d0abf3ad93e79813fd5f3812497c1c9fb9be49"}, - {file = "psycopg2_binary-2.8.4-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:19dc39616850342a2a6db70559af55b22955f86667b5f652f40c0e99253d9881"}, - {file = "psycopg2_binary-2.8.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:9f24f383a298a0c0f9b3113b982e21751a8ecde6615494a3f1470eb4a9d70e9e"}, - {file = "psycopg2_binary-2.8.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:eaed1c65f461a959284649e37b5051224f4db6ebdc84e40b5e65f2986f101a08"}, - {file = "psycopg2_binary-2.8.4-cp35-cp35m-win32.whl", hash = "sha256:4c6717962247445b4f9e21c962ea61d2e884fc17df5ddf5e35863b016f8a1f03"}, - {file = "psycopg2_binary-2.8.4-cp35-cp35m-win_amd64.whl", hash = "sha256:84156313f258eafff716b2961644a4483a9be44a5d43551d554844d15d4d224e"}, - {file = "psycopg2_binary-2.8.4-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:3b5deaa3ee7180585a296af33e14c9b18c218d148e735c7accf78130765a47e3"}, - {file = "psycopg2_binary-2.8.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:5057669b6a66aa9ca118a2a860159f0ee3acf837eda937bdd2a64f3431361a2d"}, - {file = "psycopg2_binary-2.8.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:afd96845e12638d2c44d213d4810a08f4dc4a563f9a98204b7428e567014b1cd"}, - {file = "psycopg2_binary-2.8.4-cp36-cp36m-win32.whl", hash = "sha256:a73021b44813b5c84eda4a3af5826dd72356a900bac9bd9dd1f0f81ee1c22c2f"}, - {file = "psycopg2_binary-2.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:407af6d7e46593415f216c7f56ba087a9a42bd6dc2ecb86028760aa45b802bd7"}, - {file = "psycopg2_binary-2.8.4-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:3aa773580f85a28ffdf6f862e59cb5a3cc7ef6885121f2de3fca8d6ada4dbf3b"}, - {file = "psycopg2_binary-2.8.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:eac8a3499754790187bb00574ab980df13e754777d346f85e0ff6df929bcd964"}, - {file = "psycopg2_binary-2.8.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:7a1cb80e35e1ccea3e11a48afe65d38744a0e0bde88795cc56a4d05b6e4f9d70"}, - {file = "psycopg2_binary-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:086f7e89ec85a6704db51f68f0dcae432eff9300809723a6e8782c41c2f48e03"}, - {file = "psycopg2_binary-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:b73ddf033d8cd4cc9dfed6324b1ad2a89ba52c410ef6877998422fcb9c23e3a8"}, - {file = "psycopg2_binary-2.8.4-cp38-cp38-macosx_10_9_x86_64.macosx_10_9_intel.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:4c3c09fb674401f630626310bcaf6cd6285daf0d5e4c26d6e55ca26a2734e39b"}, - {file = "psycopg2_binary-2.8.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:18ca813fdb17bc1db73fe61b196b05dd1ca2165b884dd5ec5568877cabf9b039"}, - {file = "psycopg2_binary-2.8.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:50446fae5681fc99f87e505d4e77c9407e683ab60c555ec302f9ac9bffa61103"}, - {file = "psycopg2_binary-2.8.4-cp38-cp38-win32.whl", hash = "sha256:98e10634792ac0e9e7a92a76b4991b44c2325d3e7798270a808407355e7bb0a1"}, - {file = "psycopg2_binary-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:b8f490f5fad1767a1331df1259763b3bad7d7af12a75b950c2843ba319b2415f"}, + {file = "psycopg2-binary-2.8.6.tar.gz", hash = "sha256:11b9c0ebce097180129e422379b824ae21c8f2a6596b159c7659e2e5a00e1aa0"}, + {file = "psycopg2_binary-2.8.6-cp27-cp27m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:d14b140a4439d816e3b1229a4a525df917d6ea22a0771a2a78332273fd9528a4"}, + {file = "psycopg2_binary-2.8.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:1fabed9ea2acc4efe4671b92c669a213db744d2af8a9fc5d69a8e9bc14b7a9db"}, + {file = "psycopg2_binary-2.8.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f5ab93a2cb2d8338b1674be43b442a7f544a0971da062a5da774ed40587f18f5"}, + {file = "psycopg2_binary-2.8.6-cp27-cp27m-win32.whl", hash = "sha256:b4afc542c0ac0db720cf516dd20c0846f71c248d2b3d21013aa0d4ef9c71ca25"}, + {file = "psycopg2_binary-2.8.6-cp27-cp27m-win_amd64.whl", hash = "sha256:e74a55f6bad0e7d3968399deb50f61f4db1926acf4a6d83beaaa7df986f48b1c"}, + {file = "psycopg2_binary-2.8.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:0deac2af1a587ae12836aa07970f5cb91964f05a7c6cdb69d8425ff4c15d4e2c"}, + {file = "psycopg2_binary-2.8.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ad20d2eb875aaa1ea6d0f2916949f5c08a19c74d05b16ce6ebf6d24f2c9f75d1"}, + {file = "psycopg2_binary-2.8.6-cp34-cp34m-win32.whl", hash = "sha256:950bc22bb56ee6ff142a2cb9ee980b571dd0912b0334aa3fe0fe3788d860bea2"}, + {file = "psycopg2_binary-2.8.6-cp34-cp34m-win_amd64.whl", hash = "sha256:b8a3715b3c4e604bcc94c90a825cd7f5635417453b253499664f784fc4da0152"}, + {file = "psycopg2_binary-2.8.6-cp35-cp35m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:d1b4ab59e02d9008efe10ceabd0b31e79519da6fb67f7d8e8977118832d0f449"}, + {file = "psycopg2_binary-2.8.6-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:ac0c682111fbf404525dfc0f18a8b5f11be52657d4f96e9fcb75daf4f3984859"}, + {file = "psycopg2_binary-2.8.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7d92a09b788cbb1aec325af5fcba9fed7203897bbd9269d5691bb1e3bce29550"}, + {file = "psycopg2_binary-2.8.6-cp35-cp35m-win32.whl", hash = "sha256:aaa4213c862f0ef00022751161df35804127b78adf4a2755b9f991a507e425fd"}, + {file = "psycopg2_binary-2.8.6-cp35-cp35m-win_amd64.whl", hash = "sha256:c2507d796fca339c8fb03216364cca68d87e037c1f774977c8fc377627d01c71"}, + {file = "psycopg2_binary-2.8.6-cp36-cp36m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:ee69dad2c7155756ad114c02db06002f4cded41132cc51378e57aad79cc8e4f4"}, + {file = "psycopg2_binary-2.8.6-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:e82aba2188b9ba309fd8e271702bd0d0fc9148ae3150532bbb474f4590039ffb"}, + {file = "psycopg2_binary-2.8.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d5227b229005a696cc67676e24c214740efd90b148de5733419ac9aaba3773da"}, + {file = "psycopg2_binary-2.8.6-cp36-cp36m-win32.whl", hash = "sha256:a0eb43a07386c3f1f1ebb4dc7aafb13f67188eab896e7397aa1ee95a9c884eb2"}, + {file = "psycopg2_binary-2.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:e1f57aa70d3f7cc6947fd88636a481638263ba04a742b4a37dd25c373e41491a"}, + {file = "psycopg2_binary-2.8.6-cp37-cp37m-macosx_10_6_intel.macosx_10_9_intel.macosx_10_9_x86_64.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:833709a5c66ca52f1d21d41865a637223b368c0ee76ea54ca5bad6f2526c7679"}, + {file = "psycopg2_binary-2.8.6-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:ba28584e6bca48c59eecbf7efb1576ca214b47f05194646b081717fa628dfddf"}, + {file = "psycopg2_binary-2.8.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6a32f3a4cb2f6e1a0b15215f448e8ce2da192fd4ff35084d80d5e39da683e79b"}, + {file = "psycopg2_binary-2.8.6-cp37-cp37m-win32.whl", hash = "sha256:0e4dc3d5996760104746e6cfcdb519d9d2cd27c738296525d5867ea695774e67"}, + {file = "psycopg2_binary-2.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:cec7e622ebc545dbb4564e483dd20e4e404da17ae07e06f3e780b2dacd5cee66"}, + {file = "psycopg2_binary-2.8.6-cp38-cp38-macosx_10_9_x86_64.macosx_10_9_intel.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:ba381aec3a5dc29634f20692349d73f2d21f17653bda1decf0b52b11d694541f"}, + {file = "psycopg2_binary-2.8.6-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a0c50db33c32594305b0ef9abc0cb7db13de7621d2cadf8392a1d9b3c437ef77"}, + {file = "psycopg2_binary-2.8.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:2dac98e85565d5688e8ab7bdea5446674a83a3945a8f416ad0110018d1501b94"}, + {file = "psycopg2_binary-2.8.6-cp38-cp38-win32.whl", hash = "sha256:bd1be66dde2b82f80afb9459fc618216753f67109b859a361cf7def5c7968729"}, + {file = "psycopg2_binary-2.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:8cd0fb36c7412996859cb4606a35969dd01f4ea34d9812a141cd920c3b18be77"}, + {file = "psycopg2_binary-2.8.6-cp39-cp39-macosx_10_9_x86_64.macosx_10_9_intel.macosx_10_10_intel.macosx_10_10_x86_64.whl", hash = "sha256:89705f45ce07b2dfa806ee84439ec67c5d9a0ef20154e0e475e2b2ed392a5b83"}, + {file = "psycopg2_binary-2.8.6-cp39-cp39-manylinux1_i686.whl", hash = "sha256:42ec1035841b389e8cc3692277a0bd81cdfe0b65d575a2c8862cec7a80e62e52"}, + {file = "psycopg2_binary-2.8.6-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7312e931b90fe14f925729cde58022f5d034241918a5c4f9797cac62f6b3a9dd"}, + {file = "psycopg2_binary-2.8.6-cp39-cp39-win32.whl", hash = "sha256:6422f2ff0919fd720195f64ffd8f924c1395d30f9a495f31e2392c2efafb5056"}, + {file = "psycopg2_binary-2.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:15978a1fbd225583dd8cdaf37e67ccc278b5abecb4caf6b2d6b8e2b948e953f6"}, ] ptyprocess = [ {file = "ptyprocess-0.6.0-py2.py3-none-any.whl", hash = "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"}, {file = "ptyprocess-0.6.0.tar.gz", hash = "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0"}, ] py = [ - {file = "py-1.8.1-py2.py3-none-any.whl", hash = "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0"}, - {file = "py-1.8.1.tar.gz", hash = "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa"}, + {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, + {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, ] pycodestyle = [ - {file = "pycodestyle-2.5.0-py2.py3-none-any.whl", hash = "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56"}, - {file = "pycodestyle-2.5.0.tar.gz", hash = "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"}, + {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, + {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, ] pyflakes = [ - {file = "pyflakes-2.1.1-py2.py3-none-any.whl", hash = "sha256:17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0"}, - {file = "pyflakes-2.1.1.tar.gz", hash = "sha256:d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2"}, + {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.5.2-py2.py3-none-any.whl", hash = "sha256:2a3fe295e54a20164a9df49c75fa58526d3be48e14aceba6d6b1e8ac0bfd6f1b"}, {file = "Pygments-2.5.2.tar.gz", hash = "sha256:98c8aa5a9f778fcd1026a17361ddaf7330d1b7c62ae97c3bb0ae73e0b9b6b0fe"}, ] pyparsing = [ - {file = "pyparsing-2.4.6-py2.py3-none-any.whl", hash = "sha256:c342dccb5250c08d45fd6f8b4a559613ca603b57498511740e65cd11a2e7dcec"}, - {file = "pyparsing-2.4.6.tar.gz", hash = "sha256:4c830582a84fb022400b85429791bc551f1f4871c33f23e44f353119e92f969f"}, + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, ] pytest = [ - {file = "pytest-4.6.8-py2.py3-none-any.whl", hash = "sha256:f8447ebf8fd3d362868a5d3f43a9df786dfdfe9608843bd9002a2d47a104808f"}, - {file = "pytest-4.6.8.tar.gz", hash = "sha256:6192875be8af57b694b7c4904e909680102befcb99e610ef3d9f786952f795aa"}, + {file = "pytest-4.6.11-py2.py3-none-any.whl", hash = "sha256:a00a7d79cbbdfa9d21e7d0298392a8dd4123316bfac545075e6f8f24c94d8c97"}, + {file = "pytest-4.6.11.tar.gz", hash = "sha256:50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353"}, ] pytest-cache = [ {file = "pytest-cache-1.0.tar.gz", hash = "sha256:be7468edd4d3d83f1e844959fd6e3fd28e77a481440a7118d430130ea31b07a9"}, ] pytest-cov = [ - {file = "pytest-cov-2.8.1.tar.gz", hash = "sha256:cc6742d8bac45070217169f5f72ceee1e0e55b0221f54bcf24845972d3a47f2b"}, - {file = "pytest_cov-2.8.1-py2.py3-none-any.whl", hash = "sha256:cdbdef4f870408ebdbfeb44e63e07eb18bb4619fae852f6e760645fa36172626"}, + {file = "pytest-cov-2.10.1.tar.gz", hash = "sha256:47bd0ce14056fdd79f93e1713f88fad7bdcc583dcd7783da86ef2f085a0bb88e"}, + {file = "pytest_cov-2.10.1-py2.py3-none-any.whl", hash = "sha256:45ec2d5182f89a81fc3eb29e3d1ed3113b9e9a873bcddb2a71faaab066110191"}, ] pytest-pep8 = [ {file = "pytest-pep8-1.0.6.tar.gz", hash = "sha256:032ef7e5fa3ac30f4458c73e05bb67b0f036a8a5cb418a534b3170f89f120318"}, @@ -1534,29 +1297,29 @@ python-dateutil = [ {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, ] pytz = [ - {file = "pytz-2019.3-py2.py3-none-any.whl", hash = "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d"}, - {file = "pytz-2019.3.tar.gz", hash = "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"}, + {file = "pytz-2020.4-py2.py3-none-any.whl", hash = "sha256:5c55e189b682d420be27c6995ba6edce0c0a77dd67bfbe2ae6607134d5851ffd"}, + {file = "pytz-2020.4.tar.gz", hash = "sha256:3e6b7dd2d1e0a59084bcee14a17af60c5c562cdc16d828e8eba2e683d3a7e268"}, ] pyyaml = [ - {file = "PyYAML-5.2-cp27-cp27m-win32.whl", hash = "sha256:35ace9b4147848cafac3db142795ee42deebe9d0dad885ce643928e88daebdcc"}, - {file = "PyYAML-5.2-cp27-cp27m-win_amd64.whl", hash = "sha256:ebc4ed52dcc93eeebeae5cf5deb2ae4347b3a81c3fa12b0b8c976544829396a4"}, - {file = "PyYAML-5.2-cp35-cp35m-win32.whl", hash = "sha256:38a4f0d114101c58c0f3a88aeaa44d63efd588845c5a2df5290b73db8f246d15"}, - {file = "PyYAML-5.2-cp35-cp35m-win_amd64.whl", hash = "sha256:483eb6a33b671408c8529106df3707270bfacb2447bf8ad856a4b4f57f6e3075"}, - {file = "PyYAML-5.2-cp36-cp36m-win32.whl", hash = "sha256:7f38e35c00e160db592091751d385cd7b3046d6d51f578b29943225178257b31"}, - {file = "PyYAML-5.2-cp36-cp36m-win_amd64.whl", hash = "sha256:0e7f69397d53155e55d10ff68fdfb2cf630a35e6daf65cf0bdeaf04f127c09dc"}, - {file = "PyYAML-5.2-cp37-cp37m-win32.whl", hash = "sha256:e4c015484ff0ff197564917b4b4246ca03f411b9bd7f16e02a2f586eb48b6d04"}, - {file = "PyYAML-5.2-cp37-cp37m-win_amd64.whl", hash = "sha256:4b6be5edb9f6bb73680f5bf4ee08ff25416d1400fbd4535fe0069b2994da07cd"}, - {file = "PyYAML-5.2-cp38-cp38-win32.whl", hash = "sha256:8100c896ecb361794d8bfdb9c11fce618c7cf83d624d73d5ab38aef3bc82d43f"}, - {file = "PyYAML-5.2-cp38-cp38-win_amd64.whl", hash = "sha256:2e9f0b7c5914367b0916c3c104a024bb68f269a486b9d04a2e8ac6f6597b7803"}, - {file = "PyYAML-5.2.tar.gz", hash = "sha256:c0ee8eca2c582d29c3c2ec6e2c4f703d1b7f1fb10bc72317355a746057e7346c"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, + {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, ] recommonmark = [ {file = "recommonmark-0.6.0-py2.py3-none-any.whl", hash = "sha256:2ec4207a574289355d5b6ae4ae4abb29043346ca12cdd5f07d374dc5987d2852"}, {file = "recommonmark-0.6.0.tar.gz", hash = "sha256:29cd4faeb6c5268c633634f2d69aef9431e0f4d347f90659fd0aab20e541efeb"}, ] requests = [ - {file = "requests-2.22.0-py2.py3-none-any.whl", hash = "sha256:9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"}, - {file = "requests-2.22.0.tar.gz", hash = "sha256:11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4"}, + {file = "requests-2.25.0-py2.py3-none-any.whl", hash = "sha256:e786fa28d8c9154e6a4de5d46a1d921b8749f8b74e28bde23768e5e16eece998"}, + {file = "requests-2.25.0.tar.gz", hash = "sha256:7f1a0b932f4a60a1a65caa4263921bb7d9ee911957e0ae4a23a6dd08185ad5f8"}, ] scandir = [ {file = "scandir-1.10.0-cp27-cp27m-win32.whl", hash = "sha256:92c85ac42f41ffdc35b6da57ed991575bdbe69db895507af88b9f499b701c188"}, @@ -1575,8 +1338,8 @@ simplegeneric = [ {file = "simplegeneric-0.8.1.zip", hash = "sha256:dc972e06094b9af5b855b3df4a646395e43d1c9d0d39ed345b7393560d0b9173"}, ] six = [ - {file = "six-1.13.0-py2.py3-none-any.whl", hash = "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd"}, - {file = "six-1.13.0.tar.gz", hash = "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"}, + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, ] snowballstemmer = [ {file = "snowballstemmer-2.0.0-py2.py3-none-any.whl", hash = "sha256:209f257d7533fdb3cb73bdbd24f436239ca3b2fa67d56f6ff88e86be08cc5ef0"}, @@ -1585,37 +1348,11 @@ snowballstemmer = [ sphinx = [ {file = "Sphinx-1.8.5-py2.py3-none-any.whl", hash = "sha256:9f3e17c64b34afc653d7c5ec95766e03043cc6d80b0de224f59b6b6e19d37c3c"}, {file = "Sphinx-1.8.5.tar.gz", hash = "sha256:c7658aab75c920288a8cf6f09f244c6cfdae30d82d803ac1634d9f223a80ca08"}, - {file = "Sphinx-2.3.0-py3-none-any.whl", hash = "sha256:138e39aa10f28d52aa5759fc6d1cba2be6a4b750010974047fa7d0e31addcf63"}, - {file = "Sphinx-2.3.0.tar.gz", hash = "sha256:0a11e2fd31fe5c7e64b4fc53c2c022946512f021d603eb41ac6ae51d5fcbb574"}, ] sphinx-rtd-theme = [ {file = "sphinx_rtd_theme-0.4.3-py2.py3-none-any.whl", hash = "sha256:00cf895504a7895ee433807c62094cf1e95f065843bf3acd17037c3e9a2becd4"}, {file = "sphinx_rtd_theme-0.4.3.tar.gz", hash = "sha256:728607e34d60456d736cc7991fd236afb828b21b82f956c5ea75f94c8414040a"}, ] -sphinxcontrib-applehelp = [ - {file = "sphinxcontrib-applehelp-1.0.1.tar.gz", hash = "sha256:edaa0ab2b2bc74403149cb0209d6775c96de797dfd5b5e2a71981309efab3897"}, - {file = "sphinxcontrib_applehelp-1.0.1-py2.py3-none-any.whl", hash = "sha256:fb8dee85af95e5c30c91f10e7eb3c8967308518e0f7488a2828ef7bc191d0d5d"}, -] -sphinxcontrib-devhelp = [ - {file = "sphinxcontrib-devhelp-1.0.1.tar.gz", hash = "sha256:6c64b077937330a9128a4da74586e8c2130262f014689b4b89e2d08ee7294a34"}, - {file = "sphinxcontrib_devhelp-1.0.1-py2.py3-none-any.whl", hash = "sha256:9512ecb00a2b0821a146736b39f7aeb90759834b07e81e8cc23a9c70bacb9981"}, -] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-1.0.2.tar.gz", hash = "sha256:4670f99f8951bd78cd4ad2ab962f798f5618b17675c35c5ac3b2132a14ea8422"}, - {file = "sphinxcontrib_htmlhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:d4fd39a65a625c9df86d7fa8a2d9f3cd8299a3a4b15db63b50aac9e161d8eff7"}, -] -sphinxcontrib-jsmath = [ - {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, - {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, -] -sphinxcontrib-qthelp = [ - {file = "sphinxcontrib-qthelp-1.0.2.tar.gz", hash = "sha256:79465ce11ae5694ff165becda529a600c754f4bc459778778c7017374d4d406f"}, - {file = "sphinxcontrib_qthelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:513049b93031beb1f57d4daea74068a4feb77aa5630f856fcff2e50de14e9a20"}, -] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.3.tar.gz", hash = "sha256:c0efb33f8052c04fd7a26c0a07f1678e8512e0faec19f4aa8f2473a8b81d5227"}, - {file = "sphinxcontrib_serializinghtml-1.1.3-py2.py3-none-any.whl", hash = "sha256:db6615af393650bf1151a6cd39120c29abaf93cc60db8c48eb2dddbfdc3a9768"}, -] sphinxcontrib-websupport = [ {file = "sphinxcontrib-websupport-1.1.2.tar.gz", hash = "sha256:1501befb0fdf1d1c29a800fdbf4ef5dc5369377300ddbdd16d2cd40e54c6eefc"}, {file = "sphinxcontrib_websupport-1.1.2-py2.py3-none-any.whl", hash = "sha256:e02f717baf02d0b6c3dd62cf81232ffca4c9d5c331e03766982e3ff9f1d2bc3f"}, @@ -1629,25 +1366,21 @@ traitlets = [ {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, ] typing = [ - {file = "typing-3.7.4.1-py2-none-any.whl", hash = "sha256:c8cabb5ab8945cd2f54917be357d134db9cc1eb039e59d1606dc1e60cb1d9d36"}, - {file = "typing-3.7.4.1-py3-none-any.whl", hash = "sha256:f38d83c5a7a7086543a0f649564d661859c5146a85775ab90c0d2f93ffaa9714"}, - {file = "typing-3.7.4.1.tar.gz", hash = "sha256:91dfe6f3f706ee8cc32d38edbbf304e9b7583fb37108fef38229617f8b3eba23"}, + {file = "typing-3.7.4.3-py2-none-any.whl", hash = "sha256:283d868f5071ab9ad873e5e52268d611e851c870a2ba354193026f2dfb29d8b5"}, + {file = "typing-3.7.4.3.tar.gz", hash = "sha256:1187fb9c82fd670d10aa07bbb6cfcfe4bdda42d6fab8d5134f04e8c4d0b71cc9"}, ] urllib3 = [ - {file = "urllib3-1.25.8-py2.py3-none-any.whl", hash = "sha256:2f3db8b19923a873b3e5256dc9c2dedfa883e33d87c690d9c7913e1f40673cdc"}, - {file = "urllib3-1.25.8.tar.gz", hash = "sha256:87716c2d2a7121198ebcb7ce7cccf6ce5e9ba539041cfbaeecfb641dc0bf6acc"}, + {file = "urllib3-1.26.2-py2.py3-none-any.whl", hash = "sha256:d8ff90d979214d7b4f8ce956e80f4028fc6860e4431f731ea4a8c08f23f99473"}, + {file = "urllib3-1.26.2.tar.gz", hash = "sha256:19188f96923873c92ccb987120ec4acaa12f0461fa9ce5d3d0772bc965a39e08"}, ] wcwidth = [ - {file = "wcwidth-0.1.8-py2.py3-none-any.whl", hash = "sha256:8fd29383f539be45b20bd4df0dc29c20ba48654a41e661925e612311e9f3c603"}, -] -wheel = [ - {file = "wheel-0.33.6-py2.py3-none-any.whl", hash = "sha256:f4da1763d3becf2e2cd92a14a7c920f0f00eca30fdde9ea992c836685b9faf28"}, - {file = "wheel-0.33.6.tar.gz", hash = "sha256:10c9da68765315ed98850f8e048347c3eb06dd81822dc2ab1d4fde9dc9702646"}, + {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, + {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, ] win-unicode-console = [ {file = "win_unicode_console-0.5.zip", hash = "sha256:d4142d4d56d46f449d6f00536a73625a871cba040f0bc1a2e305a04578f07d1e"}, ] zipp = [ - {file = "zipp-0.6.0-py2.py3-none-any.whl", hash = "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335"}, - {file = "zipp-0.6.0.tar.gz", hash = "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e"}, + {file = "zipp-1.2.0-py2.py3-none-any.whl", hash = "sha256:e0d9e63797e483a30d27e09fffd308c59a700d365ec34e93cc100844168bf921"}, + {file = "zipp-1.2.0.tar.gz", hash = "sha256:c70410551488251b0fee67b460fb9a536af8d6f9f008ad10ac51f615b6a521b1"}, ] From cf136f8ab105ad783b24b7c455db1aad1a5e9b62 Mon Sep 17 00:00:00 2001 From: Rehman Shafi Date: Fri, 4 Dec 2020 10:02:06 +0500 Subject: [PATCH 17/19] chore(): Removed unnecessary python-test file. --- .github/workflows/python-test.yml | 41 ------------------------------- 1 file changed, 41 deletions(-) delete mode 100644 .github/workflows/python-test.yml diff --git a/.github/workflows/python-test.yml b/.github/workflows/python-test.yml deleted file mode 100644 index ae142c2..0000000 --- a/.github/workflows/python-test.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Test - -on: [push, pull_request] - -jobs: - - testing: - runs-on: ubuntu-latest - strategy: - max-parallel: 4 - matrix: - python-version: [2.7, 3.5, 3.6, 3.7, 3.8] - - steps: - - uses: actions/checkout@v1 - - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: Install and set up Poetry - run: | - python get-poetry.py --preview -y - source $HOME/.poetry/env - poetry config virtualenvs.in-project true - - name: Set up cache - uses: actions/cache@v1 - with: - path: .venv - key: ${{ runner.os }}-venv-${{ matrix.python-version }}-${{ hashFiles('**/poetry.lock') }} - - name: Install dependencies - run: | - source $HOME/.poetry/env - poetry install - - name: Test with pytest - run: | - source $HOME/.poetry/env - poetry run pytest -q tests - - name: Lint with flake8 - run: | - source $HOME/.poetry/env - poetry run flake8 From adbe03714d33fa42e5d1d63e77bf4d65d04ead75 Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Fri, 4 Dec 2020 08:54:59 +0100 Subject: [PATCH 18/19] Check for tables before trying to truncate them and added a testcase --- CHANGELOG.md | 4 ++++ pganonymizer/utils.py | 4 +++- pganonymizer/version.py | 2 +- tests/test_utils.py | 23 ++++++++++++++++------- 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2c4dfb5..1781a7f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,10 @@ ## Development +## 0.3.1 (2020-12-04) + +* [#13](https://github.com/rheinwerk-verlag/postgresql-anonymizer/pull/13>): Fixed a syntax error if no truncated tables are defined ([ray-man](https://github.com/ray-man>)) + ## 0.3.0 (2020-02-11) * Use [python-poetry](https://github.com/python-poetry/poetry) for requirements management diff --git a/pganonymizer/utils.py b/pganonymizer/utils.py index a33b552..c50ea0c 100644 --- a/pganonymizer/utils.py +++ b/pganonymizer/utils.py @@ -251,10 +251,12 @@ def truncate_tables(connection, tables): :param connection: A database connection instance :param list[str] tables: A list of table names """ + if not tables: + return cursor = connection.cursor() table_names = ', '.join(tables) logging.info('Truncating tables "%s"', table_names) - cursor.execute('TRUNCATE TABLE {tables};'.format(tables=table_names)) if len(tables) else None + cursor.execute('TRUNCATE TABLE {tables};'.format(tables=table_names)) cursor.close() diff --git a/pganonymizer/version.py b/pganonymizer/version.py index e8e4b94..054fa83 100644 --- a/pganonymizer/version.py +++ b/pganonymizer/version.py @@ -1,3 +1,3 @@ # -*- coding: utf-8 -*- -__version__ = '0.3.0' +__version__ = '0.3.1' diff --git a/tests/test_utils.py b/tests/test_utils.py index 2098986..621d7b6 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -1,4 +1,5 @@ -from mock import call, patch, Mock +import pytest +from mock import Mock, call, patch from pganonymizer.utils import get_connection, truncate_tables @@ -20,12 +21,20 @@ def test(self, mock_connect): class TestTruncateTables: - def test(self): + @pytest.mark.parametrize('tables, expected_sql', [ + [('table_a', 'table_b'), 'TRUNCATE TABLE table_a, table_b;'], + [(), None], + ]) + def test(self, tables, expected_sql): mock_cursor = Mock() connection = Mock() connection.cursor.return_value = mock_cursor - truncate_tables(connection, ['table_a', 'table_b']) - assert mock_cursor.execute.call_args_list == [ - call('TRUNCATE TABLE table_a, table_b;'), - ] - mock_cursor.close.assert_called_once() + truncate_tables(connection, tables) + if tables: + connection.cursor.assert_called_once() + assert mock_cursor.execute.call_args_list == [call(expected_sql),] + mock_cursor.close.assert_called_once() + else: + connection.cursor.assert_not_called() + mock_cursor.execute.assert_not_called() + mock_cursor.close.assert_not_called() From 0ff46842cc7799e69c2091dbbc8f65013f9499ce Mon Sep 17 00:00:00 2001 From: Henning Kage Date: Fri, 4 Dec 2020 08:59:24 +0100 Subject: [PATCH 19/19] Fixed flake8 warning --- tests/test_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_utils.py b/tests/test_utils.py index 621d7b6..6d68a1d 100644 --- a/tests/test_utils.py +++ b/tests/test_utils.py @@ -32,7 +32,7 @@ def test(self, tables, expected_sql): truncate_tables(connection, tables) if tables: connection.cursor.assert_called_once() - assert mock_cursor.execute.call_args_list == [call(expected_sql),] + assert mock_cursor.execute.call_args_list == [call(expected_sql)] mock_cursor.close.assert_called_once() else: connection.cursor.assert_not_called()