From 3560eb08b652f88e5fb4008b1aa7f53343b04aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Wed, 28 Oct 2020 12:32:09 +0100 Subject: [PATCH 01/21] Initial flake.nix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- README.rst | 42 + flake.lock | 27 + flake.nix | 170 ++++ make-poetry-conversion-patch.sh | 59 ++ poetry-conversion.patch | 1373 +++++++++++++++++++++++++++++++ shell.nix | 3 + 6 files changed, 1674 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix create mode 100755 make-poetry-conversion-patch.sh create mode 100644 poetry-conversion.patch create mode 100644 shell.nix diff --git a/README.rst b/README.rst index 2c05c0fbb..07f353f00 100644 --- a/README.rst +++ b/README.rst @@ -132,6 +132,48 @@ When not running in development mode, an environment variable named is to use the code Django includes for this purpose: ``SECRET_KEY=$(python -c "from django.core.management import utils; print(utils.get_random_secret_key())")``. +Using Nix +~~~~~~~~~ + +You can install VulnerableCode with `Nix `__ (`Flake `__ support is needed). + +:: + + nix --print-build-logs flake check # build & run tests + +There are several options to use the Nix version + +:: + + # Enter an interactive environment with all dependencies setup. + nix-shell + > ./manage.py ... # invoke the local checkout + > vulnerablecode-manage.py ... # invoke the installed manage.py in the nix store + + # Test the import prodecure using the Nix version. + ./test-import-using-nix.sh --all # import everything + # Test the import using the local checkout. + INSTALL_DIR=. ./test-import-using-nix.sh ruby # import ruby only + + +**Keeping the Nix setup in sync** + +The Nix installation uses `poetry2nix `__ to handle Python dependencies because some dependencies are currently not available as Nix packages. +The file ``./poetry-conversion.patch`` allows to convert VulnerableCode into a `Poetry `__ project. +This is done on the fly during the Nix installation. +The patch file is created by ``./make-poetry-conversion-patch.sh``. +It needs to be recreated whenever ``./requirements.txt`` changes. +The ``expectedRequirementstxtMd5sum`` in ``flake.nix`` also needs to be updated in that case. +Running ``nix flake check`` will fail otherwise. + +:: + + # Update poetry-conversion.patch. + nix-shell -p poetry --run ./make-poetry-conversion-patch.sh + # Get new hash. See flake.nix. + md5sum requirements.txt + + Tests ----- diff --git a/flake.lock b/flake.lock new file mode 100644 index 000000000..27a4cf9cd --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1603791972, + "narHash": "sha256-nj2SvACFH+NERpye1kudcuygCcvnsZYv26M2+wgM5vE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "cd63096d6d887d689543a0b97743d28995bc9bc3", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "20.09", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 000000000..62ac8269d --- /dev/null +++ b/flake.nix @@ -0,0 +1,170 @@ +{ + description = + "Vulnerablecode - A free and open vulnerabilities database and the packages they impact."; + + # Nixpkgs / NixOS version to use. + inputs.nixpkgs = { + type = "github"; + owner = "NixOS"; + repo = "nixpkgs"; + ref = "20.09"; + }; + + outputs = { self, nixpkgs }: + let + + # Extract version from setup.py. + version = builtins.head (builtins.match ''.*version=["']?([^"',]+).*'' + (builtins.readFile ./setup.py)); + + vulnerablecode-src = ./.; + poetryPatch = ./poetry-conversion.patch; + # From commit cc7659f978b6ea17363511d25b7b30f52ccf45dd + expectedRequirementstxtMd5sum = "b40c1c5c07315647fff28c220aafea10"; + + # System types to support. + supportedSystems = [ "x86_64-linux" ]; + + # Helper function to generate an attrset '{ x86_64-linux = f "x86_64-linux"; ... }'. + forAllSystems = f: + nixpkgs.lib.genAttrs supportedSystems (system: f system); + + # Nixpkgs instantiated for supported system types. + nixpkgsFor = forAllSystems (system: + import nixpkgs { + inherit system; + overlays = [ self.overlay ]; + }); + + in { + + # A Nixpkgs overlay. + overlay = final: prev: + with final.pkgs; { + + # Create a patched version of Vulnerablecode. + patched-vulnerablecode-src = + runCommand "patched-vulnerablecode-src" { } '' + cp -r ${vulnerablecode-src} $out + chmod +w $out + cd $out + patch < ${poetryPatch} + ''; + + vulnerablecode = poetry2nix.mkPoetryApplication { + projectDir = + patched-vulnerablecode-src; # where to find {pyproject.toml,poetry.lock} + src = ./.; + python = python38; + overrides = poetry2nix.overrides.withDefaults (self: super: { + pygit2 = super.pygit2.overridePythonAttrs + (old: { buildInputs = old.buildInputs ++ [ libgit2-glib ]; }); + }); + + dontConfigure = true; # do not use ./configure + dontBuild = true; + + installPhase = '' + cp -r $src $out + ''; + + meta = { + homepage = "https://github.com/nexB/vulnerablecode"; + license = lib.licenses.asl20; + }; + }; + }; + + # Provide a nix-shell env to work with vulnerablecode. + devShell = forAllSystems (system: + nixpkgsFor.${system}.mkShell { + buildInputs = with nixpkgsFor.${system}; [ + postgresql + vulnerablecode + ]; + shellHook = '' + export VULNERABLECODE_INSTALL_DIR=${ + self.packages.${system}.vulnerablecode + } + alias vulnerablecode-manage.py=$VULNERABLECODE_INSTALL_DIR/manage.py + ''; + + }); + + # Provide some packages for selected system types. + packages = forAllSystems + (system: { inherit (nixpkgsFor.${system}) vulnerablecode; }); + + # The default package for 'nix build'. + defaultPackage = + forAllSystems (system: self.packages.${system}.vulnerablecode); + + # Tests run by 'nix flake check' and by Hydra. + checks = forAllSystems (system: { + inherit (self.packages.${system}) vulnerablecode; + + # Additional tests, if applicable. + vulnerablecode-pytest = with nixpkgsFor.${system}; + stdenv.mkDerivation { + name = "vulnerablecode-test-${version}"; + + buildInputs = [ wget ] ++ self.devShell.${system}.buildInputs; + + # Used by pygit2. + # See https://github.com/NixOS/nixpkgs/pull/72544#issuecomment-582674047. + SSL_CERT_FILE = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt"; + + unpackPhase = "true"; + + # Setup postgres, run migrations, run pytset and test-run the webserver. + # See ${vulnerablecode}/README.md for the original instructions. + # Notes: + # - $RUNDIR is used to prevent postgres from accessings its default run dir at /run/postgresql. + # See also https://github.com/NixOS/nixpkgs/issues/83770#issuecomment-607992517. + # - pytest can only be run with an running postgres database server. + buildPhase = '' + DATADIR=$(pwd)/pgdata + RUNDIR=$(pwd)/run + ENCODING="UTF-8" + mkdir -p $RUNDIR + initdb -D $DATADIR -E $ENCODING + pg_ctl -D $DATADIR -o "-k $RUNDIR" -l $DATADIR/logfile start + createuser --host $RUNDIR --no-createrole --no-superuser --login --inherit --createdb vulnerablecode + createdb --host $RUNDIR -E $ENCODING --owner=vulnerablecode --user=vulnerablecode --port=5432 vulnerablecode + ( + export DJANGO_DEV=1 + ${vulnerablecode}/manage.py migrate + (cd ${vulnerablecode} && pytest) + ${vulnerablecode}/manage.py runserver & + sleep 5 + ${wget}/bin/wget http://127.0.0.1:8000/api/ + kill %1 # kill webserver + ) + ''; + + installPhase = "mkdir -p $out"; + }; + vulnerablecode-requirements = with nixpkgsFor.${system}; + stdenv.mkDerivation { + name = "vulnerablecode-requirements-${version}"; + + unpackPhase = "true"; + + buildPhase = '' + EXPECTED=${expectedRequirementstxtMd5sum} + ACTUAL=$(md5sum ${vulnerablecode}/requirements.txt | cut -d ' ' -f 1) + if [[ $EXPECTED != $ACTUAL ]] ; then + echo "" + echo "The requirements.txt has changed!" + echo "You should recreate ${baseNameOf poetryPatch}!" + echo "1) Run make-poetry-conversion-patch.sh." + echo "2) Update expectedRequirementstxtMd5sum in flake.nix." + exit 1 + fi + ''; + + installPhase = "mkdir -p $out"; + }; + }); + }; +} diff --git a/make-poetry-conversion-patch.sh b/make-poetry-conversion-patch.sh new file mode 100755 index 000000000..1b7ff562d --- /dev/null +++ b/make-poetry-conversion-patch.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash + +# This script is used to update ./poetry-conversion.patch. Applying the patch +# will to convert this folder into a Poetry project. + +GENERATED_POETRY_FILES=(pyproject.toml poetry.lock) +PATCH_FILE=poetry-conversion.patch + +# Sanity check. +for f in "${GENERATED_POETRY_FILES[@]}" ; do + test -f "$f" && { echo "File $f exists! Aborting ..." ; exit 1; } +done + +# Extract some value from a variable/keyword argument in ./setup.py (removing +# (hopefully) all surrounding characters). +getFromSetupPy () { + VARIABLE_NAME=$1 + grep -E "$VARIABLE_NAME\s?=" setup.py | sed -e 's/^.*= *//' -e 's/,.*$//' -e 's/"//g' -e "s/'//g" +} + +NAME=$(getFromSetupPy name) +VERSION=$(getFromSetupPy version) +DESC=$(getFromSetupPy desc) +AUTHOR=$(getFromSetupPy author) +AUTHOR_EMAIL=$(getFromSetupPy author_email) +AUTHORS="$AUTHOR <$AUTHOR_EMAIL>" +LICENSE=$(getFromSetupPy license) +PYTHON="^3.8" +DEFINE_MAIN_DEPS_INTERACTIVELY="no" +DEFINE_DEV_DEPS_INTERACTIVELY="no" +CONFIRM_GENERATION="yes" + +# Create the pyproject.toml file using `poetry init` which runs interactively +# and asks a couple of questions. Answer them using predefined values. +poetry init <]+)/:$1/' requirements.txt | xargs -t -n 1 -I {} poetry add '{}' + +# Generate the patch file. +rm $PATCH_FILE +for f in "${GENERATED_POETRY_FILES[@]}" ; do + diff -u /dev/null "$f" >> $PATCH_FILE +done + +# Remove poetry files again. +rm "${GENERATED_POETRY_FILES[@]}" diff --git a/poetry-conversion.patch b/poetry-conversion.patch new file mode 100644 index 000000000..e1abfc8f4 --- /dev/null +++ b/poetry-conversion.patch @@ -0,0 +1,1373 @@ +--- /dev/null 2020-10-28 07:13:10.842256877 +0100 ++++ pyproject.toml 2020-10-28 15:19:24.040375941 +0100 +@@ -0,0 +1,71 @@ ++[tool.poetry] ++name = "vulnerablecode" ++version = "20.10" ++description = "Software package vulnerabilities database." ++authors = ["nexB Inc. and others "] ++license = "Apache-2.0" ++ ++[tool.poetry.dependencies] ++python = "^3.8" ++aiohttp = "==3.6.2" ++asgiref = "==3.2.7" ++attrs = "==19.3.0" ++backcall = "==0.1.0" ++beautifulsoup4 = "==4.7.1" ++cached-property = "==1.5.1" ++cffi = "==1.14.0" ++contextlib2 = "==0.5.5" ++decorator = "==4.4.2" ++dephell-specifier = "==0.2.1" ++dj-database-url = "==0.4.2" ++Django = "==3.0.7" ++django-filter = "==2.2.0" ++djangorestframework = "==3.11.0" ++django-widget-tweaks = "==1.4.8" ++drf-yasg = "==1.17.1" ++gunicorn = "==19.7.1" ++importlib-metadata = "==1.3.0" ++ipython = "==7.13.0" ++ipython-genutils = "==0.2.0" ++jedi = "==0.17.0" ++more-itertools = "==8.0.2" ++packageurl-python = "==0.9.1" ++packaging = "==19.2" ++parso = "==0.7.0" ++pexpect = "==4.8.0" ++pickleshare = "==0.7.5" ++pluggy = "==0.13.1" ++prompt-toolkit = "==3.0.5" ++psycopg2 = "==2.8.4" ++ptyprocess = "==0.6.0" ++py = "==1.8.0" ++pycodestyle = "==2.5.0" ++pycparser = "==2.20" ++pygit2 = "==1.2.0" ++Pygments = "==2.6.1" ++pyparsing = "==2.4.5" ++pytest = "==5.3.2" ++pytest-dependency = "==0.4.0" ++pytest-django = "==3.7.0" ++pytest-mock = "==1.13.0" ++python-dateutil = "==2.8.1" ++pytoml = "==0.1.21" ++pytz = "==2019.3" ++PyYAML = "==5.3.1" ++saneyaml = "==0.4" ++schema = "==0.7.1" ++six = "==1.13.0" ++soupsieve = "==1.9.5" ++sqlparse = "==0.3.0" ++tqdm = "==4.41.1" ++traitlets = "==4.3.3" ++wcwidth = "==0.1.7" ++whitenoise = "==5.0.1" ++zipp = "==0.6.0" ++requests = "==2.23.0" ++ ++[tool.poetry.dev-dependencies] ++ ++[build-system] ++requires = ["poetry>=0.12"] ++build-backend = "poetry.masonry.api" +--- /dev/null 2020-10-28 07:13:10.842256877 +0100 ++++ poetry.lock 2020-10-28 15:19:25.232377410 +0100 +@@ -0,0 +1,1296 @@ ++[[package]] ++category = "main" ++description = "Async http client/server framework (asyncio)" ++name = "aiohttp" ++optional = false ++python-versions = ">=3.5.3" ++version = "3.6.2" ++ ++[package.dependencies] ++async-timeout = ">=3.0,<4.0" ++attrs = ">=17.3.0" ++chardet = ">=2.0,<4.0" ++multidict = ">=4.5,<5.0" ++yarl = ">=1.0,<2.0" ++ ++[package.extras] ++speedups = ["aiodns", "brotlipy", "cchardet"] ++ ++[[package]] ++category = "main" ++description = "Disable App Nap on OS X 10.9" ++marker = "sys_platform == \"darwin\"" ++name = "appnope" ++optional = false ++python-versions = "*" ++version = "0.1.0" ++ ++[[package]] ++category = "main" ++description = "ASGI specs, helper code, and adapters" ++name = "asgiref" ++optional = false ++python-versions = ">=3.5" ++version = "3.2.7" ++ ++[package.extras] ++tests = ["pytest (>=4.3.0,<4.4.0)", "pytest-asyncio (>=0.10.0,<0.11.0)"] ++ ++[[package]] ++category = "main" ++description = "Timeout context manager for asyncio programs" ++name = "async-timeout" ++optional = false ++python-versions = ">=3.5.3" ++version = "3.0.1" ++ ++[[package]] ++category = "main" ++description = "Atomic file writes." ++marker = "sys_platform == \"win32\"" ++name = "atomicwrites" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" ++version = "1.4.0" ++ ++[[package]] ++category = "main" ++description = "Classes Without Boilerplate" ++name = "attrs" ++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"] ++ ++[[package]] ++category = "main" ++description = "Specifications for callback functions passed in to an API" ++name = "backcall" ++optional = false ++python-versions = "*" ++version = "0.1.0" ++ ++[[package]] ++category = "main" ++description = "Screen-scraping library" ++name = "beautifulsoup4" ++optional = false ++python-versions = "*" ++version = "4.7.1" ++ ++[package.dependencies] ++soupsieve = ">=1.2" ++ ++[package.extras] ++html5lib = ["html5lib"] ++lxml = ["lxml"] ++ ++[[package]] ++category = "main" ++description = "A decorator for caching properties in classes." ++name = "cached-property" ++optional = false ++python-versions = "*" ++version = "1.5.1" ++ ++[[package]] ++category = "main" ++description = "Python package for providing Mozilla's CA Bundle." ++name = "certifi" ++optional = false ++python-versions = "*" ++version = "2020.6.20" ++ ++[[package]] ++category = "main" ++description = "Foreign Function Interface for Python calling C code." ++name = "cffi" ++optional = false ++python-versions = "*" ++version = "1.14.0" ++ ++[package.dependencies] ++pycparser = "*" ++ ++[[package]] ++category = "main" ++description = "Universal encoding detector for Python 2 and 3" ++name = "chardet" ++optional = false ++python-versions = "*" ++version = "3.0.4" ++ ++[[package]] ++category = "main" ++description = "Cross-platform colored terminal text." ++marker = "sys_platform == \"win32\"" ++name = "colorama" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" ++version = "0.4.4" ++ ++[[package]] ++category = "main" ++description = "Backports and enhancements for the contextlib module" ++name = "contextlib2" ++optional = false ++python-versions = "*" ++version = "0.5.5" ++ ++[[package]] ++category = "main" ++description = "Python client library for Core API." ++name = "coreapi" ++optional = false ++python-versions = "*" ++version = "2.3.3" ++ ++[package.dependencies] ++coreschema = "*" ++itypes = "*" ++requests = "*" ++uritemplate = "*" ++ ++[[package]] ++category = "main" ++description = "Core Schema." ++name = "coreschema" ++optional = false ++python-versions = "*" ++version = "0.0.4" ++ ++[package.dependencies] ++jinja2 = "*" ++ ++[[package]] ++category = "main" ++description = "Decorators for Humans" ++name = "decorator" ++optional = false ++python-versions = ">=2.6, !=3.0.*, !=3.1.*" ++version = "4.4.2" ++ ++[[package]] ++category = "main" ++description = "Work with version specifiers." ++name = "dephell-specifier" ++optional = false ++python-versions = ">=3.5" ++version = "0.2.1" ++ ++[package.dependencies] ++packaging = ">=17.1" ++ ++[[package]] ++category = "main" ++description = "Use Database URLs in your Django Application." ++name = "dj-database-url" ++optional = false ++python-versions = "*" ++version = "0.4.2" ++ ++[[package]] ++category = "main" ++description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." ++name = "django" ++optional = false ++python-versions = ">=3.6" ++version = "3.0.7" ++ ++[package.dependencies] ++asgiref = ">=3.2,<4.0" ++pytz = "*" ++sqlparse = ">=0.2.2" ++ ++[package.extras] ++argon2 = ["argon2-cffi (>=16.1.0)"] ++bcrypt = ["bcrypt"] ++ ++[[package]] ++category = "main" ++description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." ++name = "django-filter" ++optional = false ++python-versions = ">=3.4" ++version = "2.2.0" ++ ++[package.dependencies] ++Django = ">=1.11" ++ ++[[package]] ++category = "main" ++description = "Tweak the form field rendering in templates, not in python-level form definitions." ++name = "django-widget-tweaks" ++optional = false ++python-versions = "*" ++version = "1.4.8" ++ ++[[package]] ++category = "main" ++description = "Web APIs for Django, made easy." ++name = "djangorestframework" ++optional = false ++python-versions = ">=3.5" ++version = "3.11.0" ++ ++[package.dependencies] ++django = ">=1.11" ++ ++[[package]] ++category = "main" ++description = "Automated generation of real Swagger/OpenAPI 2.0 schemas from Django Rest Framework code." ++name = "drf-yasg" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" ++version = "1.17.1" ++ ++[package.dependencies] ++Django = ">=1.11.7" ++coreapi = ">=2.3.3" ++coreschema = ">=0.0.4" ++djangorestframework = ">=3.8" ++inflection = ">=0.3.1" ++packaging = "*" ++"ruamel.yaml" = ">=0.15.34" ++six = ">=1.10.0" ++uritemplate = ">=3.0.0" ++ ++[package.extras] ++validation = ["swagger-spec-validator (>=2.1.0)"] ++ ++[[package]] ++category = "main" ++description = "WSGI HTTP Server for UNIX" ++name = "gunicorn" ++optional = false ++python-versions = "*" ++version = "19.7.1" ++ ++[[package]] ++category = "main" ++description = "Internationalized Domain Names in Applications (IDNA)" ++name = "idna" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" ++version = "2.10" ++ ++[[package]] ++category = "main" ++description = "Read metadata from Python packages" ++name = "importlib-metadata" ++optional = false ++python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" ++version = "1.3.0" ++ ++[package.dependencies] ++zipp = ">=0.5" ++ ++[package.extras] ++docs = ["sphinx", "rst.linker"] ++testing = ["packaging", "importlib-resources"] ++ ++[[package]] ++category = "main" ++description = "A port of Ruby on Rails inflector to Python" ++name = "inflection" ++optional = false ++python-versions = ">=3.5" ++version = "0.5.1" ++ ++[[package]] ++category = "main" ++description = "IPython: Productive Interactive Computing" ++name = "ipython" ++optional = false ++python-versions = ">=3.6" ++version = "7.13.0" ++ ++[package.dependencies] ++appnope = "*" ++backcall = "*" ++colorama = "*" ++decorator = "*" ++jedi = ">=0.10" ++pexpect = "*" ++pickleshare = "*" ++prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" ++pygments = "*" ++setuptools = ">=18.5" ++traitlets = ">=4.2" ++ ++[package.extras] ++all = ["numpy (>=1.14)", "testpath", "notebook", "nose (>=0.10.1)", "nbconvert", "requests", "ipywidgets", "qtconsole", "ipyparallel", "Sphinx (>=1.3)", "pygments", "nbformat", "ipykernel"] ++doc = ["Sphinx (>=1.3)"] ++kernel = ["ipykernel"] ++nbconvert = ["nbconvert"] ++nbformat = ["nbformat"] ++notebook = ["notebook", "ipywidgets"] ++parallel = ["ipyparallel"] ++qtconsole = ["qtconsole"] ++test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.14)"] ++ ++[[package]] ++category = "main" ++description = "Vestigial utilities from IPython" ++name = "ipython-genutils" ++optional = false ++python-versions = "*" ++version = "0.2.0" ++ ++[[package]] ++category = "main" ++description = "Simple immutable types for python." ++name = "itypes" ++optional = false ++python-versions = "*" ++version = "1.2.0" ++ ++[[package]] ++category = "main" ++description = "An autocompletion tool for Python that can be used for text editors." ++name = "jedi" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" ++version = "0.17.0" ++ ++[package.dependencies] ++parso = ">=0.7.0" ++ ++[package.extras] ++qa = ["flake8 (3.7.9)"] ++testing = ["colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] ++ ++[[package]] ++category = "main" ++description = "A very fast and expressive template engine." ++name = "jinja2" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" ++version = "2.11.2" ++ ++[package.dependencies] ++MarkupSafe = ">=0.23" ++ ++[package.extras] ++i18n = ["Babel (>=0.8)"] ++ ++[[package]] ++category = "main" ++description = "Safely add untrusted strings to HTML/XML markup." ++name = "markupsafe" ++optional = false ++python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" ++version = "1.1.1" ++ ++[[package]] ++category = "main" ++description = "More routines for operating on iterables, beyond itertools" ++name = "more-itertools" ++optional = false ++python-versions = ">=3.5" ++version = "8.0.2" ++ ++[[package]] ++category = "main" ++description = "multidict implementation" ++name = "multidict" ++optional = false ++python-versions = ">=3.5" ++version = "4.7.6" ++ ++[[package]] ++category = "main" ++description = "A \"purl\" aka. package URL parser and builder" ++name = "packageurl-python" ++optional = false ++python-versions = "*" ++version = "0.9.1" ++ ++[[package]] ++category = "main" ++description = "Core utilities for Python packages" ++name = "packaging" ++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 = "main" ++description = "A Python Parser" ++name = "parso" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" ++version = "0.7.0" ++ ++[package.extras] ++testing = ["docopt", "pytest (>=3.0.7)"] ++ ++[[package]] ++category = "main" ++description = "Pexpect allows easy control of interactive console applications." ++name = "pexpect" ++optional = false ++python-versions = "*" ++version = "4.8.0" ++ ++[package.dependencies] ++ptyprocess = ">=0.5" ++ ++[[package]] ++category = "main" ++description = "Tiny 'shelve'-like database with concurrency support" ++name = "pickleshare" ++optional = false ++python-versions = "*" ++version = "0.7.5" ++ ++[[package]] ++category = "main" ++description = "plugin and hook calling mechanisms for python" ++name = "pluggy" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" ++version = "0.13.1" ++ ++[package.extras] ++dev = ["pre-commit", "tox"] ++ ++[[package]] ++category = "main" ++description = "Library for building powerful interactive command lines in Python" ++name = "prompt-toolkit" ++optional = false ++python-versions = ">=3.6.1" ++version = "3.0.5" ++ ++[package.dependencies] ++wcwidth = "*" ++ ++[[package]] ++category = "main" ++description = "psycopg2 - Python-PostgreSQL Database Adapter" ++name = "psycopg2" ++optional = false ++python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" ++version = "2.8.4" ++ ++[[package]] ++category = "main" ++description = "Run a subprocess in a pseudo terminal" ++name = "ptyprocess" ++optional = false ++python-versions = "*" ++version = "0.6.0" ++ ++[[package]] ++category = "main" ++description = "library with cross-python path, ini-parsing, io, code, log facilities" ++name = "py" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" ++version = "1.8.0" ++ ++[[package]] ++category = "main" ++description = "Python style guide checker" ++name = "pycodestyle" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" ++version = "2.5.0" ++ ++[[package]] ++category = "main" ++description = "C parser in Python" ++name = "pycparser" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" ++version = "2.20" ++ ++[[package]] ++category = "main" ++description = "Python bindings for libgit2." ++name = "pygit2" ++optional = false ++python-versions = "*" ++version = "1.2.0" ++ ++[package.dependencies] ++cached-property = "*" ++cffi = "*" ++ ++[[package]] ++category = "main" ++description = "Pygments is a syntax highlighting package written in Python." ++name = "pygments" ++optional = false ++python-versions = ">=3.5" ++version = "2.6.1" ++ ++[[package]] ++category = "main" ++description = "Python parsing module" ++name = "pyparsing" ++optional = false ++python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" ++version = "2.4.5" ++ ++[[package]] ++category = "main" ++description = "pytest: simple powerful testing with Python" ++name = "pytest" ++optional = false ++python-versions = ">=3.5" ++version = "5.3.2" ++ ++[package.dependencies] ++atomicwrites = ">=1.0" ++attrs = ">=17.4.0" ++colorama = "*" ++more-itertools = ">=4.0.0" ++packaging = "*" ++pluggy = ">=0.12,<1.0" ++py = ">=1.5.0" ++wcwidth = "*" ++ ++[package.extras] ++testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] ++ ++[[package]] ++category = "main" ++description = "Manage dependencies of tests" ++name = "pytest-dependency" ++optional = false ++python-versions = "*" ++version = "0.4.0" ++ ++[package.dependencies] ++pytest = ">=3.6.0" ++ ++[[package]] ++category = "main" ++description = "A Django plugin for pytest." ++name = "pytest-django" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" ++version = "3.7.0" ++ ++[package.dependencies] ++pytest = ">=3.6" ++ ++[package.extras] ++docs = ["sphinx", "sphinx-rtd-theme"] ++testing = ["django", "django-configurations (>=2.0)", "six"] ++ ++[[package]] ++category = "main" ++description = "Thin-wrapper around the mock package for easier use with py.test" ++name = "pytest-mock" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" ++version = "1.13.0" ++ ++[package.dependencies] ++pytest = ">=2.7" ++ ++[package.extras] ++dev = ["pre-commit", "tox"] ++ ++[[package]] ++category = "main" ++description = "Extensions to the standard Python datetime module" ++name = "python-dateutil" ++optional = false ++python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" ++version = "2.8.1" ++ ++[package.dependencies] ++six = ">=1.5" ++ ++[[package]] ++category = "main" ++description = "A parser for TOML-0.4.0" ++name = "pytoml" ++optional = false ++python-versions = "*" ++version = "0.1.21" ++ ++[[package]] ++category = "main" ++description = "World timezone definitions, modern and historical" ++name = "pytz" ++optional = false ++python-versions = "*" ++version = "2019.3" ++ ++[[package]] ++category = "main" ++description = "YAML parser and emitter for Python" ++name = "pyyaml" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" ++version = "5.3.1" ++ ++[[package]] ++category = "main" ++description = "Python HTTP for Humans." ++name = "requests" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" ++version = "2.23.0" ++ ++[package.dependencies] ++certifi = ">=2017.4.17" ++chardet = ">=3.0.2,<4" ++idna = ">=2.5,<3" ++urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" ++ ++[package.extras] ++security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] ++socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] ++ ++[[package]] ++category = "main" ++description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" ++name = "ruamel.yaml" ++optional = false ++python-versions = "*" ++version = "0.16.12" ++ ++[package.dependencies] ++[package.dependencies."ruamel.yaml.clib"] ++python = "<3.9" ++version = ">=0.1.2" ++ ++[package.extras] ++docs = ["ryd"] ++jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] ++ ++[[package]] ++category = "main" ++description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" ++marker = "platform_python_implementation == \"CPython\" and python_version < \"3.9\"" ++name = "ruamel.yaml.clib" ++optional = false ++python-versions = "*" ++version = "0.2.2" ++ ++[[package]] ++category = "main" ++description = "Dump readable YAML and load safely any YAML preserving ordering and avoiding surprises of type conversions. This library is a PyYaml wrapper with sane behaviour to read and write readable YAML safely, typically when used for configuration." ++name = "saneyaml" ++optional = false ++python-versions = "*" ++version = "0.4" ++ ++[package.dependencies] ++PyYAML = "*" ++ ++[[package]] ++category = "main" ++description = "Simple data validation library" ++name = "schema" ++optional = false ++python-versions = "*" ++version = "0.7.1" ++ ++[package.dependencies] ++contextlib2 = "0.5.5" ++ ++[[package]] ++category = "main" ++description = "Python 2 and 3 compatibility utilities" ++name = "six" ++optional = false ++python-versions = ">=2.6, !=3.0.*, !=3.1.*" ++version = "1.13.0" ++ ++[[package]] ++category = "main" ++description = "A modern CSS selector implementation for Beautiful Soup." ++name = "soupsieve" ++optional = false ++python-versions = "*" ++version = "1.9.5" ++ ++[[package]] ++category = "main" ++description = "Non-validating SQL parser" ++name = "sqlparse" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" ++version = "0.3.0" ++ ++[[package]] ++category = "main" ++description = "Fast, Extensible Progress Meter" ++name = "tqdm" ++optional = false ++python-versions = ">=2.6, !=3.0.*, !=3.1.*" ++version = "4.41.1" ++ ++[package.extras] ++dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] ++ ++[[package]] ++category = "main" ++description = "Traitlets Python config system" ++name = "traitlets" ++optional = false ++python-versions = "*" ++version = "4.3.3" ++ ++[package.dependencies] ++decorator = "*" ++ipython-genutils = "*" ++six = "*" ++ ++[package.extras] ++test = ["pytest", "mock"] ++ ++[[package]] ++category = "main" ++description = "URI templates" ++name = "uritemplate" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" ++version = "3.0.1" ++ ++[[package]] ++category = "main" ++description = "HTTP library with thread-safe connection pooling, file post, and more." ++name = "urllib3" ++optional = false ++python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" ++version = "1.25.11" ++ ++[package.extras] ++brotli = ["brotlipy (>=0.6.0)"] ++secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] ++socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] ++ ++[[package]] ++category = "main" ++description = "Measures number of Terminal column cells of wide-character codes" ++name = "wcwidth" ++optional = false ++python-versions = "*" ++version = "0.1.7" ++ ++[[package]] ++category = "main" ++description = "Radically simplified static file serving for WSGI applications" ++name = "whitenoise" ++optional = false ++python-versions = ">=3.5, <4" ++version = "5.0.1" ++ ++[package.extras] ++brotli = ["brotli"] ++ ++[[package]] ++category = "main" ++description = "Yet another URL library" ++name = "yarl" ++optional = false ++python-versions = ">=3.6" ++version = "1.6.2" ++ ++[package.dependencies] ++idna = ">=2.0" ++multidict = ">=4.0" ++ ++[[package]] ++category = "main" ++description = "Backport of pathlib-compatible object wrapper for zip files" ++name = "zipp" ++optional = false ++python-versions = ">=2.7" ++version = "0.6.0" ++ ++[package.dependencies] ++more-itertools = "*" ++ ++[package.extras] ++docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] ++testing = ["pathlib2", "contextlib2", "unittest2"] ++ ++[metadata] ++content-hash = "8edf4138436bdf75e58012b29e8f0692b665848e878b7a7c054092f0f5f87201" ++lock-version = "1.0" ++python-versions = "^3.8" ++ ++[metadata.files] ++aiohttp = [ ++ {file = "aiohttp-3.6.2-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:1e984191d1ec186881ffaed4581092ba04f7c61582a177b187d3a2f07ed9719e"}, ++ {file = "aiohttp-3.6.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:50aaad128e6ac62e7bf7bd1f0c0a24bc968a0c0590a726d5a955af193544bcec"}, ++ {file = "aiohttp-3.6.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:65f31b622af739a802ca6fd1a3076fd0ae523f8485c52924a89561ba10c49b48"}, ++ {file = "aiohttp-3.6.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ae55bac364c405caa23a4f2d6cfecc6a0daada500274ffca4a9230e7129eac59"}, ++ {file = "aiohttp-3.6.2-cp36-cp36m-win32.whl", hash = "sha256:344c780466b73095a72c616fac5ea9c4665add7fc129f285fbdbca3cccf4612a"}, ++ {file = "aiohttp-3.6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:4c6efd824d44ae697814a2a85604d8e992b875462c6655da161ff18fd4f29f17"}, ++ {file = "aiohttp-3.6.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2f4d1a4fdce595c947162333353d4a44952a724fba9ca3205a3df99a33d1307a"}, ++ {file = "aiohttp-3.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6206a135d072f88da3e71cc501c59d5abffa9d0bb43269a6dcd28d66bfafdbdd"}, ++ {file = "aiohttp-3.6.2-cp37-cp37m-win32.whl", hash = "sha256:b778ce0c909a2653741cb4b1ac7015b5c130ab9c897611df43ae6a58523cb965"}, ++ {file = "aiohttp-3.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:32e5f3b7e511aa850829fbe5aa32eb455e5534eaa4b1ce93231d00e2f76e5654"}, ++ {file = "aiohttp-3.6.2-py3-none-any.whl", hash = "sha256:460bd4237d2dbecc3b5ed57e122992f60188afe46e7319116da5eb8a9dfedba4"}, ++ {file = "aiohttp-3.6.2.tar.gz", hash = "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326"}, ++] ++appnope = [ ++ {file = "appnope-0.1.0-py2.py3-none-any.whl", hash = "sha256:5b26757dc6f79a3b7dc9fab95359328d5747fcb2409d331ea66d0272b90ab2a0"}, ++ {file = "appnope-0.1.0.tar.gz", hash = "sha256:8b995ffe925347a2138d7ac0fe77155e4311a0ea6d6da4f5128fe4b3cbe5ed71"}, ++] ++asgiref = [ ++ {file = "asgiref-3.2.7-py2.py3-none-any.whl", hash = "sha256:9ca8b952a0a9afa61d30aa6d3d9b570bb3fd6bafcf7ec9e6bed43b936133db1c"}, ++ {file = "asgiref-3.2.7.tar.gz", hash = "sha256:8036f90603c54e93521e5777b2b9a39ba1bad05773fcf2d208f0299d1df58ce5"}, ++] ++async-timeout = [ ++ {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, ++ {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, ++] ++atomicwrites = [ ++ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, ++ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, ++] ++attrs = [ ++ {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, ++ {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, ++] ++backcall = [ ++ {file = "backcall-0.1.0.tar.gz", hash = "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4"}, ++ {file = "backcall-0.1.0.zip", hash = "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"}, ++] ++beautifulsoup4 = [ ++ {file = "beautifulsoup4-4.7.1-py2-none-any.whl", hash = "sha256:ba6d5c59906a85ac23dadfe5c88deaf3e179ef565f4898671253e50a78680718"}, ++ {file = "beautifulsoup4-4.7.1-py3-none-any.whl", hash = "sha256:034740f6cb549b4e932ae1ab975581e6103ac8f942200a0e9759065984391858"}, ++ {file = "beautifulsoup4-4.7.1.tar.gz", hash = "sha256:945065979fb8529dd2f37dbb58f00b661bdbcbebf954f93b32fdf5263ef35348"}, ++] ++cached-property = [ ++ {file = "cached-property-1.5.1.tar.gz", hash = "sha256:9217a59f14a5682da7c4b8829deadbfc194ac22e9908ccf7c8820234e80a1504"}, ++ {file = "cached_property-1.5.1-py2.py3-none-any.whl", hash = "sha256:3a026f1a54135677e7da5ce819b0c690f156f37976f3e30c5430740725203d7f"}, ++] ++certifi = [ ++ {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, ++ {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, ++] ++cffi = [ ++ {file = "cffi-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384"}, ++ {file = "cffi-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30"}, ++ {file = "cffi-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c"}, ++ {file = "cffi-1.14.0-cp27-cp27m-win32.whl", hash = "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78"}, ++ {file = "cffi-1.14.0-cp27-cp27m-win_amd64.whl", hash = "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793"}, ++ {file = "cffi-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e"}, ++ {file = "cffi-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a"}, ++ {file = "cffi-1.14.0-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff"}, ++ {file = "cffi-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f"}, ++ {file = "cffi-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa"}, ++ {file = "cffi-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5"}, ++ {file = "cffi-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4"}, ++ {file = "cffi-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d"}, ++ {file = "cffi-1.14.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc"}, ++ {file = "cffi-1.14.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac"}, ++ {file = "cffi-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f"}, ++ {file = "cffi-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b"}, ++ {file = "cffi-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3"}, ++ {file = "cffi-1.14.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66"}, ++ {file = "cffi-1.14.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0"}, ++ {file = "cffi-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f"}, ++ {file = "cffi-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26"}, ++ {file = "cffi-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd"}, ++ {file = "cffi-1.14.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55"}, ++ {file = "cffi-1.14.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2"}, ++ {file = "cffi-1.14.0-cp38-cp38-win32.whl", hash = "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8"}, ++ {file = "cffi-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b"}, ++ {file = "cffi-1.14.0.tar.gz", hash = "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6"}, ++] ++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.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, ++ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, ++] ++contextlib2 = [ ++ {file = "contextlib2-0.5.5-py2.py3-none-any.whl", hash = "sha256:f5260a6e679d2ff42ec91ec5252f4eeffdcf21053db9113bd0a8e4d953769c00"}, ++ {file = "contextlib2-0.5.5.tar.gz", hash = "sha256:509f9419ee91cdd00ba34443217d5ca51f5a364a404e1dce9e8979cea969ca48"}, ++] ++coreapi = [ ++ {file = "coreapi-2.3.3-py2.py3-none-any.whl", hash = "sha256:bf39d118d6d3e171f10df9ede5666f63ad80bba9a29a8ec17726a66cf52ee6f3"}, ++ {file = "coreapi-2.3.3.tar.gz", hash = "sha256:46145fcc1f7017c076a2ef684969b641d18a2991051fddec9458ad3f78ffc1cb"}, ++] ++coreschema = [ ++ {file = "coreschema-0.0.4-py2-none-any.whl", hash = "sha256:5e6ef7bf38c1525d5e55a895934ab4273548629f16aed5c0a6caa74ebf45551f"}, ++ {file = "coreschema-0.0.4.tar.gz", hash = "sha256:9503506007d482ab0867ba14724b93c18a33b22b6d19fb419ef2d239dd4a1607"}, ++] ++decorator = [ ++ {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, ++ {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, ++] ++dephell-specifier = [ ++ {file = "dephell_specifier-0.2.1-py3-none-any.whl", hash = "sha256:de46325cfd6adedf5f685a3c00242d8a16fe270a7a76948fd1957c99561eb89e"}, ++ {file = "dephell_specifier-0.2.1.tar.gz", hash = "sha256:c2ec7e62a2406960e19eb6db0f11918d82af64995ee1f26fe00d013791ae9758"}, ++] ++dj-database-url = [ ++ {file = "dj-database-url-0.4.2.tar.gz", hash = "sha256:a6832d8445ee9d788c5baa48aef8130bf61fdc442f7d9a548424d25cd85c9f08"}, ++ {file = "dj_database_url-0.4.2-py2.py3-none-any.whl", hash = "sha256:e16d94c382ea0564c48038fa7fe8d9c890ef1ab1a8ec4cb48e732c124b9482fd"}, ++] ++django = [ ++ {file = "Django-3.0.7-py3-none-any.whl", hash = "sha256:e1630333248c9b3d4e38f02093a26f1e07b271ca896d73097457996e0fae12e8"}, ++ {file = "Django-3.0.7.tar.gz", hash = "sha256:5052b34b34b3425233c682e0e11d658fd6efd587d11335a0203d827224ada8f2"}, ++] ++django-filter = [ ++ {file = "django-filter-2.2.0.tar.gz", hash = "sha256:c3deb57f0dd7ff94d7dce52a047516822013e2b441bed472b722a317658cfd14"}, ++ {file = "django_filter-2.2.0-py3-none-any.whl", hash = "sha256:558c727bce3ffa89c4a7a0b13bc8976745d63e5fd576b3a9a851650ef11c401b"}, ++] ++django-widget-tweaks = [ ++ {file = "django-widget-tweaks-1.4.8.tar.gz", hash = "sha256:9f91ca4217199b7671971d3c1f323a2bec71a0c27dec6260b3c006fa541bc489"}, ++ {file = "django_widget_tweaks-1.4.8-py2.py3-none-any.whl", hash = "sha256:f80bff4a8a59b278bb277a405a76a8b9a884e4bae7a6c70e78a39c626cd1c836"}, ++] ++djangorestframework = [ ++ {file = "djangorestframework-3.11.0-py3-none-any.whl", hash = "sha256:05809fc66e1c997fd9a32ea5730d9f4ba28b109b9da71fccfa5ff241201fd0a4"}, ++ {file = "djangorestframework-3.11.0.tar.gz", hash = "sha256:e782087823c47a26826ee5b6fa0c542968219263fb3976ec3c31edab23a4001f"}, ++] ++drf-yasg = [ ++ {file = "drf-yasg-1.17.1.tar.gz", hash = "sha256:5572e9d5baab9f6b49318169df9789f7399d0e3c7bdac8fdb8dfccf1d5d2b1ca"}, ++ {file = "drf_yasg-1.17.1-py2.py3-none-any.whl", hash = "sha256:7d7af27ad16e18507e9392b2afd6b218fbffc432ec8dbea053099a2241e184ff"}, ++] ++gunicorn = [ ++ {file = "gunicorn-19.7.1-py2.py3-none-any.whl", hash = "sha256:75af03c99389535f218cc596c7de74df4763803f7b63eb09d77e92b3956b36c6"}, ++ {file = "gunicorn-19.7.1.tar.gz", hash = "sha256:eee1169f0ca667be05db3351a0960765620dad53f53434262ff8901b68a1b622"}, ++] ++idna = [ ++ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, ++ {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ++] ++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"}, ++] ++inflection = [ ++ {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, ++ {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, ++] ++ipython = [ ++ {file = "ipython-7.13.0-py3-none-any.whl", hash = "sha256:eb8d075de37f678424527b5ef6ea23f7b80240ca031c2dd6de5879d687a65333"}, ++ {file = "ipython-7.13.0.tar.gz", hash = "sha256:ca478e52ae1f88da0102360e57e528b92f3ae4316aabac80a2cd7f7ab2efb48a"}, ++] ++ipython-genutils = [ ++ {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, ++ {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, ++] ++itypes = [ ++ {file = "itypes-1.2.0-py2.py3-none-any.whl", hash = "sha256:03da6872ca89d29aef62773672b2d408f490f80db48b23079a4b194c86dd04c6"}, ++ {file = "itypes-1.2.0.tar.gz", hash = "sha256:af886f129dea4a2a1e3d36595a2d139589e4dd287f5cab0b40e799ee81570ff1"}, ++] ++jedi = [ ++ {file = "jedi-0.17.0-py2.py3-none-any.whl", hash = "sha256:cd60c93b71944d628ccac47df9a60fec53150de53d42dc10a7fc4b5ba6aae798"}, ++ {file = "jedi-0.17.0.tar.gz", hash = "sha256:df40c97641cb943661d2db4c33c2e1ff75d491189423249e989bcea4464f3030"}, ++] ++jinja2 = [ ++ {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"}, ++ {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, ++ {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, ++ {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, ++ {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, ++ {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, ++ {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, ++ {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, ++ {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, ++ {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, ++ {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, ++ {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, ++ {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, ++ {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, ++ {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, ++ {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, ++ {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, ++ {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, ++ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, ++ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, ++ {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, ++ {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, ++ {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, ++ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, ++ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, ++ {file = "MarkupSafe-1.1.1-cp37-cp37m-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"}, ++] ++more-itertools = [ ++ {file = "more-itertools-8.0.2.tar.gz", hash = "sha256:b84b238cce0d9adad5ed87e745778d20a3f8487d0f0cb8b8a586816c7496458d"}, ++ {file = "more_itertools-8.0.2-py3-none-any.whl", hash = "sha256:c833ef592a0324bcc6a60e48440da07645063c453880c9477ceb22490aec1564"}, ++] ++multidict = [ ++ {file = "multidict-4.7.6-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:275ca32383bc5d1894b6975bb4ca6a7ff16ab76fa622967625baeebcf8079000"}, ++ {file = "multidict-4.7.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1ece5a3369835c20ed57adadc663400b5525904e53bae59ec854a5d36b39b21a"}, ++ {file = "multidict-4.7.6-cp35-cp35m-win32.whl", hash = "sha256:5141c13374e6b25fe6bf092052ab55c0c03d21bd66c94a0e3ae371d3e4d865a5"}, ++ {file = "multidict-4.7.6-cp35-cp35m-win_amd64.whl", hash = "sha256:9456e90649005ad40558f4cf51dbb842e32807df75146c6d940b6f5abb4a78f3"}, ++ {file = "multidict-4.7.6-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:e0d072ae0f2a179c375f67e3da300b47e1a83293c554450b29c900e50afaae87"}, ++ {file = "multidict-4.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3750f2205b800aac4bb03b5ae48025a64e474d2c6cc79547988ba1d4122a09e2"}, ++ {file = "multidict-4.7.6-cp36-cp36m-win32.whl", hash = "sha256:f07acae137b71af3bb548bd8da720956a3bc9f9a0b87733e0899226a2317aeb7"}, ++ {file = "multidict-4.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:6513728873f4326999429a8b00fc7ceddb2509b01d5fd3f3be7881a257b8d463"}, ++ {file = "multidict-4.7.6-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:feed85993dbdb1dbc29102f50bca65bdc68f2c0c8d352468c25b54874f23c39d"}, ++ {file = "multidict-4.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fcfbb44c59af3f8ea984de67ec7c306f618a3ec771c2843804069917a8f2e255"}, ++ {file = "multidict-4.7.6-cp37-cp37m-win32.whl", hash = "sha256:4538273208e7294b2659b1602490f4ed3ab1c8cf9dbdd817e0e9db8e64be2507"}, ++ {file = "multidict-4.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d14842362ed4cf63751648e7672f7174c9818459d169231d03c56e84daf90b7c"}, ++ {file = "multidict-4.7.6-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:c026fe9a05130e44157b98fea3ab12969e5b60691a276150db9eda71710cd10b"}, ++ {file = "multidict-4.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:51a4d210404ac61d32dada00a50ea7ba412e6ea945bbe992e4d7a595276d2ec7"}, ++ {file = "multidict-4.7.6-cp38-cp38-win32.whl", hash = "sha256:5cf311a0f5ef80fe73e4f4c0f0998ec08f954a6ec72b746f3c179e37de1d210d"}, ++ {file = "multidict-4.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:7388d2ef3c55a8ba80da62ecfafa06a1c097c18032a501ffd4cabbc52d7f2b19"}, ++ {file = "multidict-4.7.6.tar.gz", hash = "sha256:fbb77a75e529021e7c4a8d4e823d88ef4d23674a202be4f5addffc72cbb91430"}, ++] ++packageurl-python = [ ++ {file = "packageurl-python-0.9.1.tar.gz", hash = "sha256:114ebcf4bf96f5619b5a9b8e9af453a8b1960600687525916d9063a9ffb5046e"}, ++ {file = "packageurl_python-0.9.1-py2.py3-none-any.whl", hash = "sha256:eb360b755444b98d2757c28b1356f48a11bf64f530a2b69a78ae0ca767f0bcfb"}, ++] ++packaging = [ ++ {file = "packaging-19.2-py2.py3-none-any.whl", hash = "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108"}, ++ {file = "packaging-19.2.tar.gz", hash = "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47"}, ++] ++parso = [ ++ {file = "parso-0.7.0-py2.py3-none-any.whl", hash = "sha256:158c140fc04112dc45bca311633ae5033c2c2a7b732fa33d0955bad8152a8dd0"}, ++ {file = "parso-0.7.0.tar.gz", hash = "sha256:908e9fae2144a076d72ae4e25539143d40b8e3eafbaeae03c1bfe226f4cdf12c"}, ++] ++pexpect = [ ++ {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"}, ++ {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, ++] ++pluggy = [ ++ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, ++ {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, ++] ++prompt-toolkit = [ ++ {file = "prompt_toolkit-3.0.5-py3-none-any.whl", hash = "sha256:df7e9e63aea609b1da3a65641ceaf5bc7d05e0a04de5bd45d05dbeffbabf9e04"}, ++ {file = "prompt_toolkit-3.0.5.tar.gz", hash = "sha256:563d1a4140b63ff9dd587bda9557cffb2fe73650205ab6f4383092fb882e7dc8"}, ++] ++psycopg2 = [ ++ {file = "psycopg2-2.8.4-cp27-cp27m-win32.whl", hash = "sha256:72772181d9bad1fa349792a1e7384dde56742c14af2b9986013eb94a240f005b"}, ++ {file = "psycopg2-2.8.4-cp27-cp27m-win_amd64.whl", hash = "sha256:893c11064b347b24ecdd277a094413e1954f8a4e8cdaf7ffbe7ca3db87c103f0"}, ++ {file = "psycopg2-2.8.4-cp34-cp34m-win32.whl", hash = "sha256:9ab75e0b2820880ae24b7136c4d230383e07db014456a476d096591172569c38"}, ++ {file = "psycopg2-2.8.4-cp34-cp34m-win_amd64.whl", hash = "sha256:b0845e3bdd4aa18dc2f9b6fb78fbd3d9d371ad167fd6d1b7ad01c0a6cdad4fc6"}, ++ {file = "psycopg2-2.8.4-cp35-cp35m-win32.whl", hash = "sha256:ef6df7e14698e79c59c7ee7cf94cd62e5b869db369ed4b1b8f7b729ea825712a"}, ++ {file = "psycopg2-2.8.4-cp35-cp35m-win_amd64.whl", hash = "sha256:965c4c93e33e6984d8031f74e51227bd755376a9df6993774fd5b6fb3288b1f4"}, ++ {file = "psycopg2-2.8.4-cp36-cp36m-win32.whl", hash = "sha256:ed686e5926929887e2c7ae0a700e32c6129abb798b4ad2b846e933de21508151"}, ++ {file = "psycopg2-2.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:dca2d7203f0dfce8ea4b3efd668f8ea65cd2b35112638e488a4c12594015f67b"}, ++ {file = "psycopg2-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:8396be6e5ff844282d4d49b81631772f80dabae5658d432202faf101f5283b7c"}, ++ {file = "psycopg2-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:47fc642bf6f427805daf52d6e52619fe0637648fe27017062d898f3bf891419d"}, ++ {file = "psycopg2-2.8.4-cp38-cp38-win32.whl", hash = "sha256:4212ca404c4445dc5746c0d68db27d2cbfb87b523fe233dc84ecd24062e35677"}, ++ {file = "psycopg2-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:92a07dfd4d7c325dd177548c4134052d4842222833576c8391aab6f74038fc3f"}, ++ {file = "psycopg2-2.8.4.tar.gz", hash = "sha256:f898e5cc0a662a9e12bde6f931263a1bbd350cfb18e1d5336a12927851825bb6"}, ++] ++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.0-py2.py3-none-any.whl", hash = "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa"}, ++ {file = "py-1.8.0.tar.gz", hash = "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53"}, ++] ++pycodestyle = [ ++ {file = "pycodestyle-2.5.0-py2.py3-none-any.whl", hash = "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56"}, ++ {file = "pycodestyle-2.5.0.tar.gz", hash = "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"}, ++] ++pycparser = [ ++ {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, ++ {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, ++] ++pygit2 = [ ++ {file = "pygit2-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:997430ffbf3a327c3608ae6b0c18c714b3334bfb6e88d850746f37ccd29c61ab"}, ++ {file = "pygit2-1.2.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:ed13fd6945b7508f1763d5d170dedbc7001601afed606f989d778019c2a198f6"}, ++ {file = "pygit2-1.2.0-cp36-cp36m-win32.whl", hash = "sha256:10c7b5ff733d75f198233012fe33570d8f9bec2dd73079edfd42a892a8322629"}, ++ {file = "pygit2-1.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:55965517b2775d34878d87ab2e66edbd3a3a9ff5fc9181e342e40511d5bea63f"}, ++ {file = "pygit2-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:32b210da98c7e37800db5b2d4b9217ba933e3f58b34a8894bea02ed12601bccf"}, ++ {file = "pygit2-1.2.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a65dbe2485f7d888d46a70f192e7e7ab0a0d4623c8c2974dbbf98da235338e48"}, ++ {file = "pygit2-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:c7484d277319a347aa44dd0363320d34059716a7b95b4609c40572188229405e"}, ++ {file = "pygit2-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1fc1afe2acd06811416adc67942259eaa903f86a2f631d92d7fa5b0e9ad36a0c"}, ++ {file = "pygit2-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8688eab31cdd773236dd594712072fa20f9f6e3766e2f016c9a580149c2cd82"}, ++ {file = "pygit2-1.2.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5916e8ce38cfc30fb1798c29ed8ffa87317a4125096e5008d78951e3a8f907ee"}, ++ {file = "pygit2-1.2.0-cp38-cp38-win32.whl", hash = "sha256:12cc53e7d812404e6121840216885e23dbcf4577c1f0929b5660b12b4f35312c"}, ++ {file = "pygit2-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:ab07a81b5411be041784ca6334fb4467a76c4c272d53abe33178651e5dbbc015"}, ++ {file = "pygit2-1.2.0.tar.gz", hash = "sha256:f991347f5b11589ac8dc5a3c8257a514cf802545b75c11133a43ae9f76388278"}, ++] ++pygments = [ ++ {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, ++ {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, ++] ++pyparsing = [ ++ {file = "pyparsing-2.4.5-py2.py3-none-any.whl", hash = "sha256:20f995ecd72f2a1f4bf6b072b63b22e2eb457836601e76d6e5dfcd75436acc1f"}, ++ {file = "pyparsing-2.4.5.tar.gz", hash = "sha256:4ca62001be367f01bd3e92ecbb79070272a9d4964dce6a48a82ff0b8bc7e683a"}, ++] ++pytest = [ ++ {file = "pytest-5.3.2-py3-none-any.whl", hash = "sha256:e41d489ff43948babd0fad7ad5e49b8735d5d55e26628a58673c39ff61d95de4"}, ++ {file = "pytest-5.3.2.tar.gz", hash = "sha256:6b571215b5a790f9b41f19f3531c53a45cf6bb8ef2988bc1ff9afb38270b25fa"}, ++] ++pytest-dependency = [ ++ {file = "pytest-dependency-0.4.0.tar.gz", hash = "sha256:bda0ef48e6a44c091399b12ab4a7e580d2dd8294c222b301f88d7d57f47ba142"}, ++] ++pytest-django = [ ++ {file = "pytest-django-3.7.0.tar.gz", hash = "sha256:17592f06d51c2ef4b7a0fb24aa32c8b6998506a03c8439606cb96db160106659"}, ++ {file = "pytest_django-3.7.0-py2.py3-none-any.whl", hash = "sha256:ef3d15b35ed7e46293475e6f282e71a53bcd8c6f87bdc5d5e7ad0f4d49352127"}, ++] ++pytest-mock = [ ++ {file = "pytest-mock-1.13.0.tar.gz", hash = "sha256:e24a911ec96773022ebcc7030059b57cd3480b56d4f5d19b7c370ec635e6aed5"}, ++ {file = "pytest_mock-1.13.0-py2.py3-none-any.whl", hash = "sha256:67e414b3caef7bff6fc6bd83b22b5bc39147e4493f483c2679bc9d4dc485a94d"}, ++] ++python-dateutil = [ ++ {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, ++ {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, ++] ++pytoml = [ ++ {file = "pytoml-0.1.21-py2.py3-none-any.whl", hash = "sha256:57a21e6347049f73bfb62011ff34cd72774c031b9828cb628a752225136dfc33"}, ++ {file = "pytoml-0.1.21.tar.gz", hash = "sha256:8eecf7c8d0adcff3b375b09fe403407aa9b645c499e5ab8cac670ac4a35f61e7"}, ++] ++pytz = [ ++ {file = "pytz-2019.3-py2.py3-none-any.whl", hash = "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d"}, ++ {file = "pytz-2019.3.tar.gz", hash = "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"}, ++] ++pyyaml = [ ++ {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, ++ {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, ++ {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, ++ {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, ++ {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, ++ {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, ++ {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, ++ {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, ++ {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, ++ {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, ++ {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, ++] ++requests = [ ++ {file = "requests-2.23.0-py2.7.egg", hash = "sha256:5d2d0ffbb515f39417009a46c14256291061ac01ba8f875b90cad137de83beb4"}, ++ {file = "requests-2.23.0-py2.py3-none-any.whl", hash = "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee"}, ++ {file = "requests-2.23.0.tar.gz", hash = "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"}, ++] ++"ruamel.yaml" = [ ++ {file = "ruamel.yaml-0.16.12-py2.py3-none-any.whl", hash = "sha256:012b9470a0ea06e4e44e99e7920277edf6b46eee0232a04487ea73a7386340a5"}, ++ {file = "ruamel.yaml-0.16.12.tar.gz", hash = "sha256:076cc0bc34f1966d920a49f18b52b6ad559fbe656a0748e3535cf7b3f29ebf9e"}, ++] ++"ruamel.yaml.clib" = [ ++ {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:28116f204103cb3a108dfd37668f20abe6e3cafd0d3fd40dba126c732457b3cc"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:daf21aa33ee9b351f66deed30a3d450ab55c14242cfdfcd377798e2c0d25c9f1"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win32.whl", hash = "sha256:30dca9bbcbb1cc858717438218d11eafb78666759e5094dd767468c0d577a7e7"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win_amd64.whl", hash = "sha256:f6061a31880c1ed6b6ce341215336e2f3d0c1deccd84957b6fa8ca474b41e89f"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:73b3d43e04cc4b228fa6fa5d796409ece6fcb53a6c270eb2048109cbcbc3b9c2"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:53b9dd1abd70e257a6e32f934ebc482dac5edb8c93e23deb663eac724c30b026"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:839dd72545ef7ba78fd2aa1a5dd07b33696adf3e68fae7f31327161c1093001b"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win32.whl", hash = "sha256:b1e981fe1aff1fd11627f531524826a4dcc1f26c726235a52fcb62ded27d150f"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4e52c96ca66de04be42ea2278012a2342d89f5e82b4512fb6fb7134e377e2e62"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a873e4d4954f865dcb60bdc4914af7eaae48fb56b60ed6daa1d6251c72f5337c"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ab845f1f51f7eb750a78937be9f79baea4a42c7960f5a94dde34e69f3cce1988"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win32.whl", hash = "sha256:e9f7d1d8c26a6a12c23421061f9022bb62704e38211fe375c645485f38df34a2"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2602e91bd5c1b874d6f93d3086f9830f3e907c543c7672cf293a97c3fabdcd91"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44c7b0498c39f27795224438f1a6be6c5352f82cb887bc33d962c3a3acc00df6"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8e8fd0a22c9d92af3a34f91e8a2594eeb35cba90ab643c5e0e643567dc8be43e"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win32.whl", hash = "sha256:464e66a04e740d754170be5e740657a3b3b6d2bcc567f0c3437879a6e6087ff6"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:52ae5739e4b5d6317b52f5b040b1b6639e8af68a5b8fd606a8b08658fbd0cab5"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df5019e7783d14b79217ad9c56edf1ba7485d614ad5a385d1b3c768635c81c0"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5254af7d8bdf4d5484c089f929cb7f5bafa59b4f01d4f48adda4be41e6d29f99"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win32.whl", hash = "sha256:74161d827407f4db9072011adcfb825b5258a5ccb3d2cd518dd6c9edea9e30f1"}, ++ {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:058a1cc3df2a8aecc12f983a48bda99315cebf55a3b3a5463e37bb599b05727b"}, ++ {file = "ruamel.yaml.clib-0.2.2.tar.gz", hash = "sha256:2d24bd98af676f4990c4d715bcdc2a60b19c56a3fb3a763164d2d8ca0e806ba7"}, ++] ++saneyaml = [ ++ {file = "saneyaml-0.4-py2.py3-none-any.whl", hash = "sha256:f0d5bdd51649f3253ca8c2d9e48c78540c39d9d035810a2cd4406dbeffd8da11"}, ++ {file = "saneyaml-0.4.tar.gz", hash = "sha256:9a1863a9d27586fd86c30b9736478a7d441bf1d118cdc71a2fec0d94cfc3cf5c"}, ++] ++schema = [ ++ {file = "schema-0.7.1-py2.py3-none-any.whl", hash = "sha256:10b550886f5ff402e1fdef85bd7be761b0e09a35a43633311807a57a5bc4db50"}, ++ {file = "schema-0.7.1.tar.gz", hash = "sha256:c9dc8f4624e287c7d1435f8fd758f6a0aabbb7eff442db9192cd46f0e2b6d959"}, ++] ++six = [ ++ {file = "six-1.13.0-py2.py3-none-any.whl", hash = "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd"}, ++ {file = "six-1.13.0.tar.gz", hash = "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"}, ++] ++soupsieve = [ ++ {file = "soupsieve-1.9.5-py2.py3-none-any.whl", hash = "sha256:bdb0d917b03a1369ce964056fc195cfdff8819c40de04695a80bc813c3cfa1f5"}, ++ {file = "soupsieve-1.9.5.tar.gz", hash = "sha256:e2c1c5dee4a1c36bcb790e0fabd5492d874b8ebd4617622c4f6a731701060dda"}, ++] ++sqlparse = [ ++ {file = "sqlparse-0.3.0-py2.py3-none-any.whl", hash = "sha256:40afe6b8d4b1117e7dff5504d7a8ce07d9a1b15aeeade8a2d10f130a834f8177"}, ++ {file = "sqlparse-0.3.0.tar.gz", hash = "sha256:7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873"}, ++] ++tqdm = [ ++ {file = "tqdm-4.41.1-py2.py3-none-any.whl", hash = "sha256:efab950cf7cc1e4d8ee50b2bb9c8e4a89f8307b49e0b2c9cfef3ec4ca26655eb"}, ++ {file = "tqdm-4.41.1.tar.gz", hash = "sha256:4789ccbb6fc122b5a6a85d512e4e41fc5acad77216533a6f2b8ce51e0f265c23"}, ++] ++traitlets = [ ++ {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, ++ {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, ++] ++uritemplate = [ ++ {file = "uritemplate-3.0.1-py2.py3-none-any.whl", hash = "sha256:07620c3f3f8eed1f12600845892b0e036a2420acf513c53f7de0abd911a5894f"}, ++ {file = "uritemplate-3.0.1.tar.gz", hash = "sha256:5af8ad10cec94f215e3f48112de2022e1d5a37ed427fbd88652fa908f2ab7cae"}, ++] ++urllib3 = [ ++ {file = "urllib3-1.25.11-py2.py3-none-any.whl", hash = "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e"}, ++ {file = "urllib3-1.25.11.tar.gz", hash = "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2"}, ++] ++wcwidth = [ ++ {file = "wcwidth-0.1.7-py2.py3-none-any.whl", hash = "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"}, ++ {file = "wcwidth-0.1.7.tar.gz", hash = "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e"}, ++] ++whitenoise = [ ++ {file = "whitenoise-5.0.1-py2.py3-none-any.whl", hash = "sha256:62556265ec1011bd87113fb81b7516f52688887b7a010ee899ff1fd18fd22700"}, ++ {file = "whitenoise-5.0.1.tar.gz", hash = "sha256:0f9137f74bd95fa54329ace88d8dc695fbe895369a632e35f7a136e003e41d73"}, ++] ++yarl = [ ++ {file = "yarl-1.6.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:d77f6c9133d2aabb290a7846aaa74ec14d7b5ab35b01591fac5a70c4a8c959a2"}, ++ {file = "yarl-1.6.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:311effab3b3828ab34f0e661bb57ff422f67d5c33056298bda4c12195251f8dd"}, ++ {file = "yarl-1.6.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f835015a825980b65356e9520979a1564c56efea7da7d4b68a14d4a07a3a7336"}, ++ {file = "yarl-1.6.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:59f78b5da34ddcffb663b772f7619e296518712e022e57fc5d9f921818e2ab7c"}, ++ {file = "yarl-1.6.2-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:3526cb5905907f0e42bee7ef57ae4a5f02bc27dcac27859269e2bba0caa4c2b6"}, ++ {file = "yarl-1.6.2-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:e77bf79ad1ccae672eab22453838382fe9029fc27c8029e84913855512a587d8"}, ++ {file = "yarl-1.6.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:b3dd1052afd436ba737e61f5d3bed1f43a7f9a33fc58fbe4226eb919a7006019"}, ++ {file = "yarl-1.6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:6f29115b0c330da25a04f48612d75333bca04521181a666ca0b8761005a99150"}, ++ {file = "yarl-1.6.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f3031c78edf10315abe232254e6a36b65afe65fded41ee54ed7976d0b2cdf0da"}, ++ {file = "yarl-1.6.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4bed5cd7c8e69551eb19df15295ba90e62b9a6a1149c76eb4a9bab194402a156"}, ++ {file = "yarl-1.6.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:39b1e586f34b1d2512c9b39aa3cf24c870c972d525e36edc9ee19065db4737bb"}, ++ {file = "yarl-1.6.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:03b7a44384ad60be1b7be93c2a24dc74895f8d767ea0bce15b2f6fc7695a3843"}, ++ {file = "yarl-1.6.2-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:a1fd575dd058e10ad4c35065e7c3007cc74d142f622b14e168d8a273a2fa8713"}, ++ {file = "yarl-1.6.2-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:9b48d31f8d881713fd461abfe7acbb4dcfeb47cec3056aa83f2fbcd2244577f7"}, ++ {file = "yarl-1.6.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:1c05ae3d5ea4287470046a2c2754f0a4c171b84ea72c8a691f776eb1753dfb91"}, ++ {file = "yarl-1.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:f4f27ff3dd80bc7c402def211a47291ea123d59a23f59fe18fc0e81e3e71f385"}, ++ {file = "yarl-1.6.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:73d4e1e1ef5e52d526c92f07d16329e1678612c6a81dd8101fdcae11a72de15c"}, ++ {file = "yarl-1.6.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:db643ce2b58a4bd11a82348225c53c76ecdd82bb37cf4c085e6df1b676f4038c"}, ++ {file = "yarl-1.6.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:d25d3311794e6c71b608d7c47651c8f65eea5ab15358a27f29330b3475e8f8e5"}, ++ {file = "yarl-1.6.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:51c6d3cf7a1f1fbe134bb92f33b7affd94d6de24cd64b466eb12de52120fb8c6"}, ++ {file = "yarl-1.6.2-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:cd623170c729a865037828e3f99f8ebdb22a467177a539680dfc5670b74c84e2"}, ++ {file = "yarl-1.6.2-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:c056e86bff5a0b566e0d9fab4f67e83b12ae9cbcd250d334cbe2005bbe8c96f2"}, ++ {file = "yarl-1.6.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:f4c007156732866aa4507d619fe6f8f2748caabed4f66b276ccd97c82572620c"}, ++ {file = "yarl-1.6.2-cp38-cp38-win_amd64.whl", hash = "sha256:2bb2e21cf062dfbe985c3cd4618bae9f25271efcad9e7be1277861247eee9839"}, ++ {file = "yarl-1.6.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b99c25ed5c355b35d1e6dae87ac7297a4844a57dc5766b173b88b6163a36eb0d"}, ++ {file = "yarl-1.6.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2467baf8233f7c64048df37e11879c553943ffe7f373e689711ec2807ea13805"}, ++ {file = "yarl-1.6.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e3a0c43a26dfed955b2a06fdc4d51d2c51bc2200aff8ce8faf14e676ea8c8862"}, ++ {file = "yarl-1.6.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:f2f0174cb15435957d3b751093f89aede77df59a499ab7516bbb633b77ead13a"}, ++ {file = "yarl-1.6.2-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d695439c201ed340745250f9eb4dfe8d32bf1e680c16477107b8f3ce4bff4fdb"}, ++ {file = "yarl-1.6.2-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:f57744fc61e118b5d114ae8077d8eb9df4d2d2c11e2af194e21f0c11ed9dcf6c"}, ++ {file = "yarl-1.6.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:d894a2442d2cd20a3b0b0dce5a353d316c57d25a2b445e03f7eac90eee27b8af"}, ++ {file = "yarl-1.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:076157404db9db4bb3fa9db22db319bbb36d075eeab19ba018ce20ae0cacf037"}, ++ {file = "yarl-1.6.2.tar.gz", hash = "sha256:c45b49b59a5724869899798e1bbd447ac486215269511d3b76b4c235a1b766b6"}, ++] ++zipp = [ ++ {file = "zipp-0.6.0-py2.py3-none-any.whl", hash = "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335"}, ++ {file = "zipp-0.6.0.tar.gz", hash = "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e"}, ++] diff --git a/shell.nix b/shell.nix new file mode 100644 index 000000000..db84e3d07 --- /dev/null +++ b/shell.nix @@ -0,0 +1,3 @@ +(import (fetchTarball https://github.com/edolstra/flake-compat/archive/master.tar.gz) { + src = builtins.fetchGit ./.; +}).shellNix From 1963218e5fd37e0574e2451fcf353f67e5dab804 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Sun, 1 Nov 2020 21:09:40 +0100 Subject: [PATCH 02/21] Further improvements MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- README.rst | 2 +- flake.nix | 19 +++++++++---------- 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/README.rst b/README.rst index 07f353f00..5338225ad 100644 --- a/README.rst +++ b/README.rst @@ -146,7 +146,7 @@ There are several options to use the Nix version :: # Enter an interactive environment with all dependencies setup. - nix-shell + nix develop > ./manage.py ... # invoke the local checkout > vulnerablecode-manage.py ... # invoke the installed manage.py in the nix store diff --git a/flake.nix b/flake.nix index 62ac8269d..92aaea325 100644 --- a/flake.nix +++ b/flake.nix @@ -61,6 +61,8 @@ (old: { buildInputs = old.buildInputs ++ [ libgit2-glib ]; }); }); + propagatedBuildInputs = [ postgresql ]; + dontConfigure = true; # do not use ./configure dontBuild = true; @@ -77,16 +79,13 @@ # Provide a nix-shell env to work with vulnerablecode. devShell = forAllSystems (system: - nixpkgsFor.${system}.mkShell { - buildInputs = with nixpkgsFor.${system}; [ - postgresql - vulnerablecode - ]; + with nixpkgsFor.${system}; + mkShell rec { + # will be available as env var in `nix develop` + VULNERABLECODE_INSTALL_DIR = vulnerablecode; + buildInputs = [ vulnerablecode ]; shellHook = '' - export VULNERABLECODE_INSTALL_DIR=${ - self.packages.${system}.vulnerablecode - } - alias vulnerablecode-manage.py=$VULNERABLECODE_INSTALL_DIR/manage.py + alias vulnerablecode-manage.py=${VULNERABLECODE_INSTALL_DIR}/manage.py ''; }); @@ -108,7 +107,7 @@ stdenv.mkDerivation { name = "vulnerablecode-test-${version}"; - buildInputs = [ wget ] ++ self.devShell.${system}.buildInputs; + buildInputs = [ wget vulnerablecode ]; # Used by pygit2. # See https://github.com/NixOS/nixpkgs/pull/72544#issuecomment-582674047. From 0d88ae6b1a13d207405cf079bf1edc99b4772b95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Sun, 1 Nov 2020 21:27:39 +0100 Subject: [PATCH 03/21] Rename package. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- flake.nix | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/flake.nix b/flake.nix index 92aaea325..2be222dc7 100644 --- a/flake.nix +++ b/flake.nix @@ -43,18 +43,17 @@ with final.pkgs; { # Create a patched version of Vulnerablecode. - patched-vulnerablecode-src = - runCommand "patched-vulnerablecode-src" { } '' - cp -r ${vulnerablecode-src} $out - chmod +w $out - cd $out - patch < ${poetryPatch} - ''; + patcheVulnerablecodeSrc = runCommand "patcheVulnerablecodeSrc" { } '' + cp -r ${vulnerablecode-src} $out + chmod +w $out + cd $out + patch < ${poetryPatch} + ''; vulnerablecode = poetry2nix.mkPoetryApplication { projectDir = - patched-vulnerablecode-src; # where to find {pyproject.toml,poetry.lock} - src = ./.; + patcheVulnerablecodeSrc; # where to find {pyproject.toml,poetry.lock} + src = vulnerablecode-src; python = python38; overrides = poetry2nix.overrides.withDefaults (self: super: { pygit2 = super.pygit2.overridePythonAttrs From 2a92a378467d560a88f31fad7064955b01049659 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Sun, 1 Nov 2020 21:30:46 +0100 Subject: [PATCH 04/21] Move requirements.txt check from test to package. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- flake.nix | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-) diff --git a/flake.nix b/flake.nix index 2be222dc7..15b89c484 100644 --- a/flake.nix +++ b/flake.nix @@ -18,7 +18,6 @@ (builtins.readFile ./setup.py)); vulnerablecode-src = ./.; - poetryPatch = ./poetry-conversion.patch; # From commit cc7659f978b6ea17363511d25b7b30f52ccf45dd expectedRequirementstxtMd5sum = "b40c1c5c07315647fff28c220aafea10"; @@ -47,7 +46,16 @@ cp -r ${vulnerablecode-src} $out chmod +w $out cd $out - patch < ${poetryPatch} + EXPECTED=${expectedRequirementstxtMd5sum} + ACTUAL=$(md5sum ${vulnerablecode-src}/requirements.txt | cut -d ' ' -f 1) + if [[ $EXPECTED != $ACTUAL ]] ; then + echo "" + echo "The requirements.txt has changed!" + echo "1) Run make-poetry-conversion-patch.sh." + echo "2) Update expectedRequirementstxtMd5sum in flake.nix." + exit 1 + fi + patch < ./poetry-conversion.patch ''; vulnerablecode = poetry2nix.mkPoetryApplication { @@ -140,27 +148,6 @@ ) ''; - installPhase = "mkdir -p $out"; - }; - vulnerablecode-requirements = with nixpkgsFor.${system}; - stdenv.mkDerivation { - name = "vulnerablecode-requirements-${version}"; - - unpackPhase = "true"; - - buildPhase = '' - EXPECTED=${expectedRequirementstxtMd5sum} - ACTUAL=$(md5sum ${vulnerablecode}/requirements.txt | cut -d ' ' -f 1) - if [[ $EXPECTED != $ACTUAL ]] ; then - echo "" - echo "The requirements.txt has changed!" - echo "You should recreate ${baseNameOf poetryPatch}!" - echo "1) Run make-poetry-conversion-patch.sh." - echo "2) Update expectedRequirementstxtMd5sum in flake.nix." - exit 1 - fi - ''; - installPhase = "mkdir -p $out"; }; }); From 67ec2fc0623ecbf2db0d8c5a3adf1b8ef8d1a786 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Sun, 1 Nov 2020 21:41:26 +0100 Subject: [PATCH 05/21] Add test-import-using-nix.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- test-import-using-nix.sh | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100755 test-import-using-nix.sh diff --git a/test-import-using-nix.sh b/test-import-using-nix.sh new file mode 100755 index 000000000..e2e0e8105 --- /dev/null +++ b/test-import-using-nix.sh @@ -0,0 +1,33 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i bash + +# Populate a test database using either the Nix installation or the local +# checkout. + +set -e +DEFAULT_INSTALL_DIR=$VULNERABLECODE_INSTALL_DIR # in the Nix store, see flake.nix +INSTALL_DIR=${INSTALL_DIR:-$DEFAULT_INSTALL_DIR} +ARGS=$(if [ $# -eq 0 ]; then echo "--all"; else echo "$@"; fi) +export DJANGO_DEV=${DJANGO_DEV:-1} + +export THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +export TEMPDIR=$(mktemp -d -p "$THIS_DIR") +export DATADIR="${TEMPDIR}/pgdata" +export RUNDIR="${TEMPDIR}/run" + +cleanup() { + pg_ctl -D "$DATADIR" stop + rm -rf "$TEMPDIR" +} + +trap cleanup EXIT + +ENCODING="UTF-8" +mkdir -p "$RUNDIR" +initdb -D "$DATADIR" -E $ENCODING +pg_ctl -D "$DATADIR" -o "-k $RUNDIR" -l "$DATADIR/logfile" start +createuser --host "$RUNDIR" --no-createrole --no-superuser --login --inherit --createdb vulnerablecode +createdb --host "$RUNDIR" -E $ENCODING --owner=vulnerablecode --user=vulnerablecode --port=5432 vulnerablecode + +"$INSTALL_DIR/manage.py" migrate +"$INSTALL_DIR/manage.py" import $ARGS From 131885567cbe15935c6ae6a76d1502e961483e30 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Sun, 1 Nov 2020 21:45:34 +0100 Subject: [PATCH 06/21] Update readme MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- README.rst | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/README.rst b/README.rst index 5338225ad..0ba63bacf 100644 --- a/README.rst +++ b/README.rst @@ -148,7 +148,7 @@ There are several options to use the Nix version # Enter an interactive environment with all dependencies setup. nix develop > ./manage.py ... # invoke the local checkout - > vulnerablecode-manage.py ... # invoke the installed manage.py in the nix store + > vulnerablecode-manage.py ... # invoke manage.py as installed in the nix store # Test the import prodecure using the Nix version. ./test-import-using-nix.sh --all # import everything @@ -161,10 +161,9 @@ There are several options to use the Nix version The Nix installation uses `poetry2nix `__ to handle Python dependencies because some dependencies are currently not available as Nix packages. The file ``./poetry-conversion.patch`` allows to convert VulnerableCode into a `Poetry `__ project. This is done on the fly during the Nix installation. -The patch file is created by ``./make-poetry-conversion-patch.sh``. -It needs to be recreated whenever ``./requirements.txt`` changes. +The patch file itself is created by ``./make-poetry-conversion-patch.sh``. +It needs to be recreated whenever ``./requirements.txt`` changes (this is not done automatically). The ``expectedRequirementstxtMd5sum`` in ``flake.nix`` also needs to be updated in that case. -Running ``nix flake check`` will fail otherwise. :: From e14c7aaa693ed99d99931d89d14bef4512a12ab9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Sun, 1 Nov 2020 22:32:23 +0100 Subject: [PATCH 07/21] Use nix-shell in make-poetry-conversion-patch.sh MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- make-poetry-conversion-patch.sh | 5 +-- poetry-conversion.patch | 57 +++++++++++++++++++++++++++++---- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/make-poetry-conversion-patch.sh b/make-poetry-conversion-patch.sh index 1b7ff562d..cb926569e 100755 --- a/make-poetry-conversion-patch.sh +++ b/make-poetry-conversion-patch.sh @@ -1,4 +1,5 @@ -#!/usr/bin/env bash +#!/usr/bin/env nix-shell +#!nix-shell -i bash -p diffutils libxml2 libxslt perl poetry # This script is used to update ./poetry-conversion.patch. Applying the patch # will to convert this folder into a Poetry project. @@ -52,7 +53,7 @@ perl -pe 's/([<=>]+)/:$1/' requirements.txt | xargs -t -n 1 -I {} poetry add '{} # Generate the patch file. rm $PATCH_FILE for f in "${GENERATED_POETRY_FILES[@]}" ; do - diff -u /dev/null "$f" >> $PATCH_FILE + diff -u /dev/null "$f" >> $PATCH_FILE || true # we expect differences done # Remove poetry files again. diff --git a/poetry-conversion.patch b/poetry-conversion.patch index e1abfc8f4..5799fbb08 100644 --- a/poetry-conversion.patch +++ b/poetry-conversion.patch @@ -1,6 +1,6 @@ ---- /dev/null 2020-10-28 07:13:10.842256877 +0100 -+++ pyproject.toml 2020-10-28 15:19:24.040375941 +0100 -@@ -0,0 +1,71 @@ +--- /dev/null 2020-11-01 20:43:42.902469240 +0100 ++++ pyproject.toml 2020-11-01 22:30:24.882222098 +0100 +@@ -0,0 +1,72 @@ +[tool.poetry] +name = "vulnerablecode" +version = "20.10" @@ -31,6 +31,7 @@ +ipython = "==7.13.0" +ipython-genutils = "==0.2.0" +jedi = "==0.17.0" ++lxml = "==4.3.3" +more-itertools = "==8.0.2" +packageurl-python = "==0.9.1" +packaging = "==19.2" @@ -72,9 +73,9 @@ +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" ---- /dev/null 2020-10-28 07:13:10.842256877 +0100 -+++ poetry.lock 2020-10-28 15:19:25.232377410 +0100 -@@ -0,0 +1,1296 @@ +--- /dev/null 2020-11-01 20:43:42.902469240 +0100 ++++ poetry.lock 2020-11-01 22:30:26.074218883 +0100 +@@ -0,0 +1,1338 @@ +[[package]] +category = "main" +description = "Async http client/server framework (asyncio)" @@ -458,6 +459,20 @@ + +[[package]] +category = "main" ++description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." ++name = "lxml" ++optional = false ++python-versions = "*" ++version = "4.3.3" ++ ++[package.extras] ++cssselect = ["cssselect (>=0.7)"] ++html5 = ["html5lib"] ++htmlsoup = ["beautifulsoup4"] ++source = ["Cython (>=0.29.1)"] ++ ++[[package]] ++category = "main" +description = "Safely add untrusted strings to HTML/XML markup." +name = "markupsafe" +optional = false @@ -901,7 +916,7 @@ +testing = ["pathlib2", "contextlib2", "unittest2"] + +[metadata] -+content-hash = "8edf4138436bdf75e58012b29e8f0692b665848e878b7a7c054092f0f5f87201" ++content-hash = "d6430f8d0575b32e6aa42958783598b4ec4008e43da2c8e57694cdd2d40465ff" +lock-version = "1.0" +python-versions = "^3.8" + @@ -1075,6 +1090,34 @@ + {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, + {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, +] ++lxml = [ ++ {file = "lxml-4.3.3-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:3210da6f36cf4b835ff1be853962b22cc354d506f493b67a4303c88bbb40d57b"}, ++ {file = "lxml-4.3.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:fdcb57b906dbc1f80666e6290e794ab8fb959a2e17aa5aee1758a85d1da4533f"}, ++ {file = "lxml-4.3.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:a3080470559938a09a5d0ec558c005282e99ac77bf8211fb7b9a5c66390acd8d"}, ++ {file = "lxml-4.3.3-cp27-cp27m-win32.whl", hash = "sha256:bdb0593a42070b0a5f138b79b872289ee73c8e25b3f0bea6564e795b55b6bcdd"}, ++ {file = "lxml-4.3.3-cp27-cp27m-win_amd64.whl", hash = "sha256:b4fbf9b552faff54742bcd0791ab1da5863363fb19047e68f6592be1ac2dab33"}, ++ {file = "lxml-4.3.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:62f382cddf3d2e52cf266e161aa522d54fd624b8cc567bc18f573d9d50d40e8e"}, ++ {file = "lxml-4.3.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ad841b78a476623955da270ab8d207c3c694aa5eba71f4792f65926dc46c6ee8"}, ++ {file = "lxml-4.3.3-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:40f60819fbd5bad6e191ba1329bfafa09ab7f3f174b3d034d413ef5266963294"}, ++ {file = "lxml-4.3.3-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:f679d93dec7f7210575c85379a31322df4c46496f184ef650d3aba1484b38a2d"}, ++ {file = "lxml-4.3.3-cp34-cp34m-win32.whl", hash = "sha256:c4e4bca2bb68ce22320297dfa1a7bf070a5b20bcbaec4ee023f83d2f6e76496f"}, ++ {file = "lxml-4.3.3-cp34-cp34m-win_amd64.whl", hash = "sha256:846a0739e595871041385d86d12af4b6999f921359b38affb99cdd6b54219a8f"}, ++ {file = "lxml-4.3.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:ff424b01d090ffe1947ec7432b07f536912e0300458f9a7f48ea217dd8362b86"}, ++ {file = "lxml-4.3.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:43b26a865a61549919f8a42e094dfdb62847113cf776d84bd6b60e4e3fc20ea3"}, ++ {file = "lxml-4.3.3-cp35-cp35m-win32.whl", hash = "sha256:fd213bb5166e46974f113c8228daaef1732abc47cb561ce9c4c8eaed4bd3b09b"}, ++ {file = "lxml-4.3.3-cp35-cp35m-win_amd64.whl", hash = "sha256:e83b4b2bf029f5104bc1227dbb7bf5ace6fd8fabaebffcd4f8106fafc69fc45f"}, ++ {file = "lxml-4.3.3-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:175f3825f075cf02d15099eb52658457cf0ff103dcf11512b5d2583e1d40f58b"}, ++ {file = "lxml-4.3.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:afdd75d9735e44c639ffd6258ce04a2de3b208f148072c02478162d0944d9da3"}, ++ {file = "lxml-4.3.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b91cfe4438c741aeff662d413fd2808ac901cc6229c838236840d11de4586d63"}, ++ {file = "lxml-4.3.3-cp36-cp36m-win32.whl", hash = "sha256:30e14c62d88d1e01a26936ecd1c6e784d4afc9aa002bba4321c5897937112616"}, ++ {file = "lxml-4.3.3-cp36-cp36m-win_amd64.whl", hash = "sha256:0815b0c9f897468de6a386dc15917a0becf48cc92425613aa8bbfc7f0f82951f"}, ++ {file = "lxml-4.3.3-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:03984196d00670b2ab14ae0ea83d5cc0cfa4f5a42558afa9ab5fa745995328f5"}, ++ {file = "lxml-4.3.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cec4ab14af9eae8501be3266ff50c3c2aecc017ba1e86c160209bb4f0423df6a"}, ++ {file = "lxml-4.3.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e995b3734a46d41ae60b6097f7c51ba9958648c6d1e0935b7e0ee446ee4abe22"}, ++ {file = "lxml-4.3.3-cp37-cp37m-win32.whl", hash = "sha256:b90c4e32d6ec089d3fa3518436bdf5ce4d902a0787dbd9bb09f37afe8b994317"}, ++ {file = "lxml-4.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:7b98f0325be8450da70aa4a796c4f06852949fe031878b4aa1d6c417a412f314"}, ++ {file = "lxml-4.3.3.tar.gz", hash = "sha256:4a03dd682f8e35a10234904e0b9508d705ff98cf962c5851ed052e9340df3d90"}, ++] +markupsafe = [ + {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, From 908f6e3da573bbc0ff6da6370889f7ab2070fb0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Sun, 1 Nov 2020 22:41:09 +0100 Subject: [PATCH 08/21] Make make-poetry-conversion-patch.sh fast. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- make-poetry-conversion-patch.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/make-poetry-conversion-patch.sh b/make-poetry-conversion-patch.sh index cb926569e..9acd255c7 100755 --- a/make-poetry-conversion-patch.sh +++ b/make-poetry-conversion-patch.sh @@ -7,6 +7,8 @@ GENERATED_POETRY_FILES=(pyproject.toml poetry.lock) PATCH_FILE=poetry-conversion.patch +set -e + # Sanity check. for f in "${GENERATED_POETRY_FILES[@]}" ; do test -f "$f" && { echo "File $f exists! Aborting ..." ; exit 1; } @@ -47,8 +49,7 @@ EOF # Convert requirements.txt entries to pyproject.toml entries. # https://github.com/python-poetry/poetry/issues/663 -# This may take very long. -perl -pe 's/([<=>]+)/:$1/' requirements.txt | xargs -t -n 1 -I {} poetry add '{}' +perl -pe 's/([<=>]+)/:$1/' requirements.txt | tr '\n' ' ' | xargs -t -I {} bash -c "poetry add {}" # Generate the patch file. rm $PATCH_FILE From f5e429b67a4d11e93d78a5e3fa99f5f3c7db0c81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Wed, 2 Dec 2020 12:57:47 +0100 Subject: [PATCH 09/21] Move nix-related files to /etc/nix MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- flake.lock => etc/nix/flake.lock | 0 flake.nix => etc/nix/flake.nix | 2 +- .../nix/make-poetry-conversion-patch.sh | 0 poetry-conversion.patch => etc/nix/poetry-conversion.patch | 0 shell.nix => etc/nix/shell.nix | 0 test-import-using-nix.sh => etc/nix/test-import-using-nix.sh | 0 6 files changed, 1 insertion(+), 1 deletion(-) rename flake.lock => etc/nix/flake.lock (100%) rename flake.nix => etc/nix/flake.nix (99%) rename make-poetry-conversion-patch.sh => etc/nix/make-poetry-conversion-patch.sh (100%) rename poetry-conversion.patch => etc/nix/poetry-conversion.patch (100%) rename shell.nix => etc/nix/shell.nix (100%) rename test-import-using-nix.sh => etc/nix/test-import-using-nix.sh (100%) diff --git a/flake.lock b/etc/nix/flake.lock similarity index 100% rename from flake.lock rename to etc/nix/flake.lock diff --git a/flake.nix b/etc/nix/flake.nix similarity index 99% rename from flake.nix rename to etc/nix/flake.nix index 15b89c484..b7929026f 100644 --- a/flake.nix +++ b/etc/nix/flake.nix @@ -17,7 +17,7 @@ version = builtins.head (builtins.match ''.*version=["']?([^"',]+).*'' (builtins.readFile ./setup.py)); - vulnerablecode-src = ./.; + vulnerablecode-src = ./../..; # From commit cc7659f978b6ea17363511d25b7b30f52ccf45dd expectedRequirementstxtMd5sum = "b40c1c5c07315647fff28c220aafea10"; diff --git a/make-poetry-conversion-patch.sh b/etc/nix/make-poetry-conversion-patch.sh similarity index 100% rename from make-poetry-conversion-patch.sh rename to etc/nix/make-poetry-conversion-patch.sh diff --git a/poetry-conversion.patch b/etc/nix/poetry-conversion.patch similarity index 100% rename from poetry-conversion.patch rename to etc/nix/poetry-conversion.patch diff --git a/shell.nix b/etc/nix/shell.nix similarity index 100% rename from shell.nix rename to etc/nix/shell.nix diff --git a/test-import-using-nix.sh b/etc/nix/test-import-using-nix.sh similarity index 100% rename from test-import-using-nix.sh rename to etc/nix/test-import-using-nix.sh From 1160988342e9351b4099721bb691346a338c1caa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Wed, 2 Dec 2020 14:54:08 +0100 Subject: [PATCH 10/21] Adapt code to actually work when flake.nix is in etc/nix. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- etc/nix/flake.nix | 54 ++++++------ etc/nix/make-poetry-conversion-patch.sh | 29 +++++-- etc/nix/poetry-conversion.patch | 108 ++++++++++++------------ etc/nix/shell.nix | 2 +- 4 files changed, 109 insertions(+), 84 deletions(-) diff --git a/etc/nix/flake.nix b/etc/nix/flake.nix index b7929026f..eded57ba1 100644 --- a/etc/nix/flake.nix +++ b/etc/nix/flake.nix @@ -13,13 +13,14 @@ outputs = { self, nixpkgs }: let + vulnerablecode-src = ./../..; + # Extract version from setup.py. version = builtins.head (builtins.match ''.*version=["']?([^"',]+).*'' - (builtins.readFile ./setup.py)); + (builtins.readFile (vulnerablecode-src + "/setup.py"))); - vulnerablecode-src = ./../..; - # From commit cc7659f978b6ea17363511d25b7b30f52ccf45dd - expectedRequirementstxtMd5sum = "b40c1c5c07315647fff28c220aafea10"; + # From commit 7f8ae6399b02b1d508689b303f117e2f03f7854a + expectedRequirementstxtMd5sum = "7ea5fec4096b9c532450d68fad721017"; # System types to support. supportedSystems = [ "x86_64-linux" ]; @@ -41,26 +42,26 @@ overlay = final: prev: with final.pkgs; { - # Create a patched version of Vulnerablecode. - patcheVulnerablecodeSrc = runCommand "patcheVulnerablecodeSrc" { } '' - cp -r ${vulnerablecode-src} $out - chmod +w $out - cd $out - EXPECTED=${expectedRequirementstxtMd5sum} - ACTUAL=$(md5sum ${vulnerablecode-src}/requirements.txt | cut -d ' ' -f 1) - if [[ $EXPECTED != $ACTUAL ]] ; then - echo "" - echo "The requirements.txt has changed!" - echo "1) Run make-poetry-conversion-patch.sh." - echo "2) Update expectedRequirementstxtMd5sum in flake.nix." - exit 1 - fi - patch < ./poetry-conversion.patch - ''; + # Create a mock project. + mockPoetryProject = + runCommand "mockPoetryProject" { } '' + EXPECTED=${expectedRequirementstxtMd5sum} + ACTUAL=$(md5sum ${vulnerablecode-src}/requirements.txt | cut -d ' ' -f 1) + if [[ $EXPECTED != $ACTUAL ]] ; then + echo "" + echo "The requirements.txt has changed!" + echo "1) Run make-poetry-conversion-patch.sh." + echo "2) Update expectedRequirementstxtMd5sum in flake.nix." + exit 1 + fi + + mkdir $out + cd $out + patch < ${vulnerablecode-src}/etc/nix/poetry-conversion.patch + ''; - vulnerablecode = poetry2nix.mkPoetryApplication { - projectDir = - patcheVulnerablecodeSrc; # where to find {pyproject.toml,poetry.lock} + vulnerablecode = poetry2nix.mkPoetryApplication rec { + projectDir = mockPoetryProject; # where to find {pyproject.toml,poetry.lock} src = vulnerablecode-src; python = python38; overrides = poetry2nix.overrides.withDefaults (self: super: { @@ -68,13 +69,18 @@ (old: { buildInputs = old.buildInputs ++ [ libgit2-glib ]; }); }); + patchPhase = '' + # Make sure "our" pycodestyle binary is used. + sed -i 's/join(bin_dir, "pycodestyle")/"pycodestyle"/' vulnerabilities/tests/test_basics.py + ''; + propagatedBuildInputs = [ postgresql ]; dontConfigure = true; # do not use ./configure dontBuild = true; installPhase = '' - cp -r $src $out + cp -r . $out ''; meta = { diff --git a/etc/nix/make-poetry-conversion-patch.sh b/etc/nix/make-poetry-conversion-patch.sh index 9acd255c7..73a1459ce 100755 --- a/etc/nix/make-poetry-conversion-patch.sh +++ b/etc/nix/make-poetry-conversion-patch.sh @@ -4,12 +4,24 @@ # This script is used to update ./poetry-conversion.patch. Applying the patch # will to convert this folder into a Poetry project. -GENERATED_POETRY_FILES=(pyproject.toml poetry.lock) -PATCH_FILE=poetry-conversion.patch +THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" +SETUP_PY=$(realpath "$THIS_DIR/../../setup.py") +REQUIREMENTS_TXT=$(realpath "$THIS_DIR/../../requirements.txt") +OUR_PYPROJECT_TOML="$THIS_DIR/pyproject.toml" +OUR_POETRY_LOCK="$THIS_DIR/poetry.lock" +GENERATED_POETRY_FILES=("$OUR_PYPROJECT_TOML" "$OUR_POETRY_LOCK") +PATCH_FILE="$THIS_DIR/poetry-conversion.patch" + +# Prevent "ValueError: ZIP does not support timestamps before 1980" +# See nixpkgs manual. +unset SOURCE_DATE_EPOCH set -e -# Sanity check. +# Sanity checks. +for f in $SETUP_PY $REQUIREMENTS_TXT ; do + test -f "$f" || { echo "File $SETUP_PY doesn't exist! Aborting ..." ; exit 1; } +done for f in "${GENERATED_POETRY_FILES[@]}" ; do test -f "$f" && { echo "File $f exists! Aborting ..." ; exit 1; } done @@ -18,7 +30,7 @@ done # (hopefully) all surrounding characters). getFromSetupPy () { VARIABLE_NAME=$1 - grep -E "$VARIABLE_NAME\s?=" setup.py | sed -e 's/^.*= *//' -e 's/,.*$//' -e 's/"//g' -e "s/'//g" + grep -E "$VARIABLE_NAME\s?=" "$SETUP_PY" | sed -e 's/^.*= *//' -e 's/,.*$//' -e 's/"//g' -e "s/'//g" } NAME=$(getFromSetupPy name) @@ -33,6 +45,9 @@ DEFINE_MAIN_DEPS_INTERACTIVELY="no" DEFINE_DEV_DEPS_INTERACTIVELY="no" CONFIRM_GENERATION="yes" +# Make sure we run from here. +cd "$THIS_DIR" + # Create the pyproject.toml file using `poetry init` which runs interactively # and asks a couple of questions. Answer them using predefined values. poetry init <]+)/:$1/' requirements.txt | tr '\n' ' ' | xargs -t -I {} bash -c "poetry add {}" +perl -pe 's/([<=>]+)/:$1/' "$REQUIREMENTS_TXT" | tr '\n' ' ' | xargs -t -I {} bash -c "poetry add {}" # Generate the patch file. -rm $PATCH_FILE +rm "$PATCH_FILE" for f in "${GENERATED_POETRY_FILES[@]}" ; do - diff -u /dev/null "$f" >> $PATCH_FILE || true # we expect differences + diff -u /dev/null "$f" >> "$PATCH_FILE" || true # we expect differences done # Remove poetry files again. diff --git a/etc/nix/poetry-conversion.patch b/etc/nix/poetry-conversion.patch index 5799fbb08..bb074c2b9 100644 --- a/etc/nix/poetry-conversion.patch +++ b/etc/nix/poetry-conversion.patch @@ -1,5 +1,5 @@ ---- /dev/null 2020-11-01 20:43:42.902469240 +0100 -+++ pyproject.toml 2020-11-01 22:30:24.882222098 +0100 +--- /dev/null 2020-12-02 12:48:23.790419299 +0100 ++++ /home/rolfschr/src/vulnerablecode/etc/nix/pyproject.toml 2020-12-02 13:58:25.598945990 +0100 @@ -0,0 +1,72 @@ +[tool.poetry] +name = "vulnerablecode" @@ -33,7 +33,7 @@ +jedi = "==0.17.0" +lxml = "==4.3.3" +more-itertools = "==8.0.2" -+packageurl-python = "==0.9.1" ++packageurl-python = "==0.9.3" +packaging = "==19.2" +parso = "==0.7.0" +pexpect = "==4.8.0" @@ -73,9 +73,9 @@ +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" ---- /dev/null 2020-11-01 20:43:42.902469240 +0100 -+++ poetry.lock 2020-11-01 22:30:26.074218883 +0100 -@@ -0,0 +1,1338 @@ +--- /dev/null 2020-12-02 12:48:23.790419299 +0100 ++++ /home/rolfschr/src/vulnerablecode/etc/nix/poetry.lock 2020-12-02 13:58:26.570928584 +0100 +@@ -0,0 +1,1342 @@ +[[package]] +category = "main" +description = "Async http client/server framework (asyncio)" @@ -96,12 +96,12 @@ + +[[package]] +category = "main" -+description = "Disable App Nap on OS X 10.9" ++description = "Disable App Nap on macOS >= 10.9" +marker = "sys_platform == \"darwin\"" +name = "appnope" +optional = false +python-versions = "*" -+version = "0.1.0" ++version = "0.1.2" + +[[package]] +category = "main" @@ -182,7 +182,7 @@ +name = "certifi" +optional = false +python-versions = "*" -+version = "2020.6.20" ++version = "2020.11.8" + +[[package]] +category = "main" @@ -497,11 +497,11 @@ + +[[package]] +category = "main" -+description = "A \"purl\" aka. package URL parser and builder" ++description = "A \"purl\" aka. Package URL parser and builder" +name = "packageurl-python" +optional = false +python-versions = "*" -+version = "0.9.1" ++version = "0.9.3" + +[[package]] +category = "main" @@ -894,7 +894,7 @@ +name = "yarl" +optional = false +python-versions = ">=3.6" -+version = "1.6.2" ++version = "1.6.3" + +[package.dependencies] +idna = ">=2.0" @@ -916,7 +916,7 @@ +testing = ["pathlib2", "contextlib2", "unittest2"] + +[metadata] -+content-hash = "d6430f8d0575b32e6aa42958783598b4ec4008e43da2c8e57694cdd2d40465ff" ++content-hash = "00be403d6025da9c520d68b68d62235d203d77ac262ca6be4db74e5c5a75f505" +lock-version = "1.0" +python-versions = "^3.8" + @@ -936,8 +936,8 @@ + {file = "aiohttp-3.6.2.tar.gz", hash = "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326"}, +] +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"}, +] +asgiref = [ + {file = "asgiref-3.2.7-py2.py3-none-any.whl", hash = "sha256:9ca8b952a0a9afa61d30aa6d3d9b570bb3fd6bafcf7ec9e6bed43b936133db1c"}, @@ -969,8 +969,8 @@ + {file = "cached_property-1.5.1-py2.py3-none-any.whl", hash = "sha256:3a026f1a54135677e7da5ce819b0c690f156f37976f3e30c5430740725203d7f"}, +] +certifi = [ -+ {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, -+ {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, ++ {file = "certifi-2020.11.8-py2.py3-none-any.whl", hash = "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd"}, ++ {file = "certifi-2020.11.8.tar.gz", hash = "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4"}, +] +cffi = [ + {file = "cffi-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384"}, @@ -1177,8 +1177,8 @@ + {file = "multidict-4.7.6.tar.gz", hash = "sha256:fbb77a75e529021e7c4a8d4e823d88ef4d23674a202be4f5addffc72cbb91430"}, +] +packageurl-python = [ -+ {file = "packageurl-python-0.9.1.tar.gz", hash = "sha256:114ebcf4bf96f5619b5a9b8e9af453a8b1960600687525916d9063a9ffb5046e"}, -+ {file = "packageurl_python-0.9.1-py2.py3-none-any.whl", hash = "sha256:eb360b755444b98d2757c28b1356f48a11bf64f530a2b69a78ae0ca767f0bcfb"}, ++ {file = "packageurl-python-0.9.3.tar.gz", hash = "sha256:c54add03a464d4779ee50350231aabb971751bbf52389acbcd0149e2ea7122aa"}, ++ {file = "packageurl_python-0.9.3-py2.py3-none-any.whl", hash = "sha256:0682b2eddab16151da5bd4ef38081e9b27f8eb33cd29baf41f4996d4e88e6e70"}, +] +packaging = [ + {file = "packaging-19.2-py2.py3-none-any.whl", hash = "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108"}, @@ -1376,39 +1376,43 @@ + {file = "whitenoise-5.0.1.tar.gz", hash = "sha256:0f9137f74bd95fa54329ace88d8dc695fbe895369a632e35f7a136e003e41d73"}, +] +yarl = [ -+ {file = "yarl-1.6.2-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:d77f6c9133d2aabb290a7846aaa74ec14d7b5ab35b01591fac5a70c4a8c959a2"}, -+ {file = "yarl-1.6.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:311effab3b3828ab34f0e661bb57ff422f67d5c33056298bda4c12195251f8dd"}, -+ {file = "yarl-1.6.2-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:f835015a825980b65356e9520979a1564c56efea7da7d4b68a14d4a07a3a7336"}, -+ {file = "yarl-1.6.2-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:59f78b5da34ddcffb663b772f7619e296518712e022e57fc5d9f921818e2ab7c"}, -+ {file = "yarl-1.6.2-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:3526cb5905907f0e42bee7ef57ae4a5f02bc27dcac27859269e2bba0caa4c2b6"}, -+ {file = "yarl-1.6.2-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:e77bf79ad1ccae672eab22453838382fe9029fc27c8029e84913855512a587d8"}, -+ {file = "yarl-1.6.2-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:b3dd1052afd436ba737e61f5d3bed1f43a7f9a33fc58fbe4226eb919a7006019"}, -+ {file = "yarl-1.6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:6f29115b0c330da25a04f48612d75333bca04521181a666ca0b8761005a99150"}, -+ {file = "yarl-1.6.2-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:f3031c78edf10315abe232254e6a36b65afe65fded41ee54ed7976d0b2cdf0da"}, -+ {file = "yarl-1.6.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4bed5cd7c8e69551eb19df15295ba90e62b9a6a1149c76eb4a9bab194402a156"}, -+ {file = "yarl-1.6.2-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:39b1e586f34b1d2512c9b39aa3cf24c870c972d525e36edc9ee19065db4737bb"}, -+ {file = "yarl-1.6.2-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:03b7a44384ad60be1b7be93c2a24dc74895f8d767ea0bce15b2f6fc7695a3843"}, -+ {file = "yarl-1.6.2-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:a1fd575dd058e10ad4c35065e7c3007cc74d142f622b14e168d8a273a2fa8713"}, -+ {file = "yarl-1.6.2-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:9b48d31f8d881713fd461abfe7acbb4dcfeb47cec3056aa83f2fbcd2244577f7"}, -+ {file = "yarl-1.6.2-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:1c05ae3d5ea4287470046a2c2754f0a4c171b84ea72c8a691f776eb1753dfb91"}, -+ {file = "yarl-1.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:f4f27ff3dd80bc7c402def211a47291ea123d59a23f59fe18fc0e81e3e71f385"}, -+ {file = "yarl-1.6.2-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:73d4e1e1ef5e52d526c92f07d16329e1678612c6a81dd8101fdcae11a72de15c"}, -+ {file = "yarl-1.6.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:db643ce2b58a4bd11a82348225c53c76ecdd82bb37cf4c085e6df1b676f4038c"}, -+ {file = "yarl-1.6.2-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:d25d3311794e6c71b608d7c47651c8f65eea5ab15358a27f29330b3475e8f8e5"}, -+ {file = "yarl-1.6.2-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:51c6d3cf7a1f1fbe134bb92f33b7affd94d6de24cd64b466eb12de52120fb8c6"}, -+ {file = "yarl-1.6.2-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:cd623170c729a865037828e3f99f8ebdb22a467177a539680dfc5670b74c84e2"}, -+ {file = "yarl-1.6.2-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:c056e86bff5a0b566e0d9fab4f67e83b12ae9cbcd250d334cbe2005bbe8c96f2"}, -+ {file = "yarl-1.6.2-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:f4c007156732866aa4507d619fe6f8f2748caabed4f66b276ccd97c82572620c"}, -+ {file = "yarl-1.6.2-cp38-cp38-win_amd64.whl", hash = "sha256:2bb2e21cf062dfbe985c3cd4618bae9f25271efcad9e7be1277861247eee9839"}, -+ {file = "yarl-1.6.2-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b99c25ed5c355b35d1e6dae87ac7297a4844a57dc5766b173b88b6163a36eb0d"}, -+ {file = "yarl-1.6.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2467baf8233f7c64048df37e11879c553943ffe7f373e689711ec2807ea13805"}, -+ {file = "yarl-1.6.2-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:e3a0c43a26dfed955b2a06fdc4d51d2c51bc2200aff8ce8faf14e676ea8c8862"}, -+ {file = "yarl-1.6.2-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:f2f0174cb15435957d3b751093f89aede77df59a499ab7516bbb633b77ead13a"}, -+ {file = "yarl-1.6.2-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d695439c201ed340745250f9eb4dfe8d32bf1e680c16477107b8f3ce4bff4fdb"}, -+ {file = "yarl-1.6.2-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:f57744fc61e118b5d114ae8077d8eb9df4d2d2c11e2af194e21f0c11ed9dcf6c"}, -+ {file = "yarl-1.6.2-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:d894a2442d2cd20a3b0b0dce5a353d316c57d25a2b445e03f7eac90eee27b8af"}, -+ {file = "yarl-1.6.2-cp39-cp39-win_amd64.whl", hash = "sha256:076157404db9db4bb3fa9db22db319bbb36d075eeab19ba018ce20ae0cacf037"}, -+ {file = "yarl-1.6.2.tar.gz", hash = "sha256:c45b49b59a5724869899798e1bbd447ac486215269511d3b76b4c235a1b766b6"}, ++ {file = "yarl-1.6.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434"}, ++ {file = "yarl-1.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478"}, ++ {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6"}, ++ {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e"}, ++ {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406"}, ++ {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76"}, ++ {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366"}, ++ {file = "yarl-1.6.3-cp36-cp36m-win32.whl", hash = "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721"}, ++ {file = "yarl-1.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643"}, ++ {file = "yarl-1.6.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e"}, ++ {file = "yarl-1.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3"}, ++ {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8"}, ++ {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a"}, ++ {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c"}, ++ {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f"}, ++ {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970"}, ++ {file = "yarl-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e"}, ++ {file = "yarl-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50"}, ++ {file = "yarl-1.6.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2"}, ++ {file = "yarl-1.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec"}, ++ {file = "yarl-1.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71"}, ++ {file = "yarl-1.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc"}, ++ {file = "yarl-1.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959"}, ++ {file = "yarl-1.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2"}, ++ {file = "yarl-1.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2"}, ++ {file = "yarl-1.6.3-cp38-cp38-win32.whl", hash = "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896"}, ++ {file = "yarl-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a"}, ++ {file = "yarl-1.6.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e"}, ++ {file = "yarl-1.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724"}, ++ {file = "yarl-1.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c"}, ++ {file = "yarl-1.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25"}, ++ {file = "yarl-1.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96"}, ++ {file = "yarl-1.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0"}, ++ {file = "yarl-1.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4"}, ++ {file = "yarl-1.6.3-cp39-cp39-win32.whl", hash = "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424"}, ++ {file = "yarl-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6"}, ++ {file = "yarl-1.6.3.tar.gz", hash = "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10"}, +] +zipp = [ + {file = "zipp-0.6.0-py2.py3-none-any.whl", hash = "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335"}, diff --git a/etc/nix/shell.nix b/etc/nix/shell.nix index db84e3d07..330df0ab6 100644 --- a/etc/nix/shell.nix +++ b/etc/nix/shell.nix @@ -1,3 +1,3 @@ (import (fetchTarball https://github.com/edolstra/flake-compat/archive/master.tar.gz) { - src = builtins.fetchGit ./.; + src = ./.; }).shellNix From c0e5513c3656e037959f2012584e853fb970fd57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Wed, 2 Dec 2020 20:57:50 +0100 Subject: [PATCH 11/21] Do not create patch anymore but rather keep generated poetry files. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- etc/nix/flake.nix | 5 +- etc/nix/make-poetry-conversion-patch.sh | 33 +- etc/nix/poetry-conversion.patch | 1420 ----------------------- etc/nix/poetry.lock.autogenerated | 1342 +++++++++++++++++++++ etc/nix/pyproject.toml.autogenerated | 72 ++ 5 files changed, 1429 insertions(+), 1443 deletions(-) delete mode 100644 etc/nix/poetry-conversion.patch create mode 100644 etc/nix/poetry.lock.autogenerated create mode 100644 etc/nix/pyproject.toml.autogenerated diff --git a/etc/nix/flake.nix b/etc/nix/flake.nix index eded57ba1..7983cd23e 100644 --- a/etc/nix/flake.nix +++ b/etc/nix/flake.nix @@ -44,7 +44,7 @@ # Create a mock project. mockPoetryProject = - runCommand "mockPoetryProject" { } '' + runCommand "mockPoetryProject" { buildInputs = [ rename ]; } '' EXPECTED=${expectedRequirementstxtMd5sum} ACTUAL=$(md5sum ${vulnerablecode-src}/requirements.txt | cut -d ' ' -f 1) if [[ $EXPECTED != $ACTUAL ]] ; then @@ -57,7 +57,8 @@ mkdir $out cd $out - patch < ${vulnerablecode-src}/etc/nix/poetry-conversion.patch + cp ${vulnerablecode-src}/etc/nix/{pyproject.toml,poetry.lock}.autogenerated . + rename 's/.autogenerated$//' *.autogenerated ''; vulnerablecode = poetry2nix.mkPoetryApplication rec { diff --git a/etc/nix/make-poetry-conversion-patch.sh b/etc/nix/make-poetry-conversion-patch.sh index 73a1459ce..21132ada0 100755 --- a/etc/nix/make-poetry-conversion-patch.sh +++ b/etc/nix/make-poetry-conversion-patch.sh @@ -1,32 +1,26 @@ #!/usr/bin/env nix-shell -#!nix-shell -i bash -p diffutils libxml2 libxslt perl poetry +#!nix-shell --pure -i bash -p libxml2 libxslt perl poetry rename +#!nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/nixos-20.09.tar.gz -# This script is used to update ./poetry-conversion.patch. Applying the patch -# will to convert this folder into a Poetry project. +# This scripts generates the mock poetry project files. + +set -e THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" SETUP_PY=$(realpath "$THIS_DIR/../../setup.py") REQUIREMENTS_TXT=$(realpath "$THIS_DIR/../../requirements.txt") -OUR_PYPROJECT_TOML="$THIS_DIR/pyproject.toml" -OUR_POETRY_LOCK="$THIS_DIR/poetry.lock" -GENERATED_POETRY_FILES=("$OUR_PYPROJECT_TOML" "$OUR_POETRY_LOCK") -PATCH_FILE="$THIS_DIR/poetry-conversion.patch" +POETRY_FILES=(pyproject.toml poetry.lock) # Prevent "ValueError: ZIP does not support timestamps before 1980" # See nixpkgs manual. unset SOURCE_DATE_EPOCH -set -e - # Sanity checks. for f in $SETUP_PY $REQUIREMENTS_TXT ; do test -f "$f" || { echo "File $SETUP_PY doesn't exist! Aborting ..." ; exit 1; } done -for f in "${GENERATED_POETRY_FILES[@]}" ; do - test -f "$f" && { echo "File $f exists! Aborting ..." ; exit 1; } -done -# Extract some value from a variable/keyword argument in ./setup.py (removing +# Extract some value from a variable/keyword argument in setup.py (removing # (hopefully) all surrounding characters). getFromSetupPy () { VARIABLE_NAME=$1 @@ -48,6 +42,9 @@ CONFIRM_GENERATION="yes" # Make sure we run from here. cd "$THIS_DIR" +# Remove poetry files from (failed) previos runs. +rm -f "${POETRY_FILES[@]}" + # Create the pyproject.toml file using `poetry init` which runs interactively # and asks a couple of questions. Answer them using predefined values. poetry init <]+)/:$1/' "$REQUIREMENTS_TXT" | tr '\n' ' ' | xargs -t -I {} bash -c "poetry add {}" -# Generate the patch file. -rm "$PATCH_FILE" -for f in "${GENERATED_POETRY_FILES[@]}" ; do - diff -u /dev/null "$f" >> "$PATCH_FILE" || true # we expect differences -done - -# Remove poetry files again. -rm "${GENERATED_POETRY_FILES[@]}" +# Rename the mock project files. +rename -f 's/$/.autogenerated/' "${POETRY_FILES[@]}" diff --git a/etc/nix/poetry-conversion.patch b/etc/nix/poetry-conversion.patch deleted file mode 100644 index bb074c2b9..000000000 --- a/etc/nix/poetry-conversion.patch +++ /dev/null @@ -1,1420 +0,0 @@ ---- /dev/null 2020-12-02 12:48:23.790419299 +0100 -+++ /home/rolfschr/src/vulnerablecode/etc/nix/pyproject.toml 2020-12-02 13:58:25.598945990 +0100 -@@ -0,0 +1,72 @@ -+[tool.poetry] -+name = "vulnerablecode" -+version = "20.10" -+description = "Software package vulnerabilities database." -+authors = ["nexB Inc. and others "] -+license = "Apache-2.0" -+ -+[tool.poetry.dependencies] -+python = "^3.8" -+aiohttp = "==3.6.2" -+asgiref = "==3.2.7" -+attrs = "==19.3.0" -+backcall = "==0.1.0" -+beautifulsoup4 = "==4.7.1" -+cached-property = "==1.5.1" -+cffi = "==1.14.0" -+contextlib2 = "==0.5.5" -+decorator = "==4.4.2" -+dephell-specifier = "==0.2.1" -+dj-database-url = "==0.4.2" -+Django = "==3.0.7" -+django-filter = "==2.2.0" -+djangorestframework = "==3.11.0" -+django-widget-tweaks = "==1.4.8" -+drf-yasg = "==1.17.1" -+gunicorn = "==19.7.1" -+importlib-metadata = "==1.3.0" -+ipython = "==7.13.0" -+ipython-genutils = "==0.2.0" -+jedi = "==0.17.0" -+lxml = "==4.3.3" -+more-itertools = "==8.0.2" -+packageurl-python = "==0.9.3" -+packaging = "==19.2" -+parso = "==0.7.0" -+pexpect = "==4.8.0" -+pickleshare = "==0.7.5" -+pluggy = "==0.13.1" -+prompt-toolkit = "==3.0.5" -+psycopg2 = "==2.8.4" -+ptyprocess = "==0.6.0" -+py = "==1.8.0" -+pycodestyle = "==2.5.0" -+pycparser = "==2.20" -+pygit2 = "==1.2.0" -+Pygments = "==2.6.1" -+pyparsing = "==2.4.5" -+pytest = "==5.3.2" -+pytest-dependency = "==0.4.0" -+pytest-django = "==3.7.0" -+pytest-mock = "==1.13.0" -+python-dateutil = "==2.8.1" -+pytoml = "==0.1.21" -+pytz = "==2019.3" -+PyYAML = "==5.3.1" -+saneyaml = "==0.4" -+schema = "==0.7.1" -+six = "==1.13.0" -+soupsieve = "==1.9.5" -+sqlparse = "==0.3.0" -+tqdm = "==4.41.1" -+traitlets = "==4.3.3" -+wcwidth = "==0.1.7" -+whitenoise = "==5.0.1" -+zipp = "==0.6.0" -+requests = "==2.23.0" -+ -+[tool.poetry.dev-dependencies] -+ -+[build-system] -+requires = ["poetry>=0.12"] -+build-backend = "poetry.masonry.api" ---- /dev/null 2020-12-02 12:48:23.790419299 +0100 -+++ /home/rolfschr/src/vulnerablecode/etc/nix/poetry.lock 2020-12-02 13:58:26.570928584 +0100 -@@ -0,0 +1,1342 @@ -+[[package]] -+category = "main" -+description = "Async http client/server framework (asyncio)" -+name = "aiohttp" -+optional = false -+python-versions = ">=3.5.3" -+version = "3.6.2" -+ -+[package.dependencies] -+async-timeout = ">=3.0,<4.0" -+attrs = ">=17.3.0" -+chardet = ">=2.0,<4.0" -+multidict = ">=4.5,<5.0" -+yarl = ">=1.0,<2.0" -+ -+[package.extras] -+speedups = ["aiodns", "brotlipy", "cchardet"] -+ -+[[package]] -+category = "main" -+description = "Disable App Nap on macOS >= 10.9" -+marker = "sys_platform == \"darwin\"" -+name = "appnope" -+optional = false -+python-versions = "*" -+version = "0.1.2" -+ -+[[package]] -+category = "main" -+description = "ASGI specs, helper code, and adapters" -+name = "asgiref" -+optional = false -+python-versions = ">=3.5" -+version = "3.2.7" -+ -+[package.extras] -+tests = ["pytest (>=4.3.0,<4.4.0)", "pytest-asyncio (>=0.10.0,<0.11.0)"] -+ -+[[package]] -+category = "main" -+description = "Timeout context manager for asyncio programs" -+name = "async-timeout" -+optional = false -+python-versions = ">=3.5.3" -+version = "3.0.1" -+ -+[[package]] -+category = "main" -+description = "Atomic file writes." -+marker = "sys_platform == \"win32\"" -+name = "atomicwrites" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -+version = "1.4.0" -+ -+[[package]] -+category = "main" -+description = "Classes Without Boilerplate" -+name = "attrs" -+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"] -+ -+[[package]] -+category = "main" -+description = "Specifications for callback functions passed in to an API" -+name = "backcall" -+optional = false -+python-versions = "*" -+version = "0.1.0" -+ -+[[package]] -+category = "main" -+description = "Screen-scraping library" -+name = "beautifulsoup4" -+optional = false -+python-versions = "*" -+version = "4.7.1" -+ -+[package.dependencies] -+soupsieve = ">=1.2" -+ -+[package.extras] -+html5lib = ["html5lib"] -+lxml = ["lxml"] -+ -+[[package]] -+category = "main" -+description = "A decorator for caching properties in classes." -+name = "cached-property" -+optional = false -+python-versions = "*" -+version = "1.5.1" -+ -+[[package]] -+category = "main" -+description = "Python package for providing Mozilla's CA Bundle." -+name = "certifi" -+optional = false -+python-versions = "*" -+version = "2020.11.8" -+ -+[[package]] -+category = "main" -+description = "Foreign Function Interface for Python calling C code." -+name = "cffi" -+optional = false -+python-versions = "*" -+version = "1.14.0" -+ -+[package.dependencies] -+pycparser = "*" -+ -+[[package]] -+category = "main" -+description = "Universal encoding detector for Python 2 and 3" -+name = "chardet" -+optional = false -+python-versions = "*" -+version = "3.0.4" -+ -+[[package]] -+category = "main" -+description = "Cross-platform colored terminal text." -+marker = "sys_platform == \"win32\"" -+name = "colorama" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -+version = "0.4.4" -+ -+[[package]] -+category = "main" -+description = "Backports and enhancements for the contextlib module" -+name = "contextlib2" -+optional = false -+python-versions = "*" -+version = "0.5.5" -+ -+[[package]] -+category = "main" -+description = "Python client library for Core API." -+name = "coreapi" -+optional = false -+python-versions = "*" -+version = "2.3.3" -+ -+[package.dependencies] -+coreschema = "*" -+itypes = "*" -+requests = "*" -+uritemplate = "*" -+ -+[[package]] -+category = "main" -+description = "Core Schema." -+name = "coreschema" -+optional = false -+python-versions = "*" -+version = "0.0.4" -+ -+[package.dependencies] -+jinja2 = "*" -+ -+[[package]] -+category = "main" -+description = "Decorators for Humans" -+name = "decorator" -+optional = false -+python-versions = ">=2.6, !=3.0.*, !=3.1.*" -+version = "4.4.2" -+ -+[[package]] -+category = "main" -+description = "Work with version specifiers." -+name = "dephell-specifier" -+optional = false -+python-versions = ">=3.5" -+version = "0.2.1" -+ -+[package.dependencies] -+packaging = ">=17.1" -+ -+[[package]] -+category = "main" -+description = "Use Database URLs in your Django Application." -+name = "dj-database-url" -+optional = false -+python-versions = "*" -+version = "0.4.2" -+ -+[[package]] -+category = "main" -+description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." -+name = "django" -+optional = false -+python-versions = ">=3.6" -+version = "3.0.7" -+ -+[package.dependencies] -+asgiref = ">=3.2,<4.0" -+pytz = "*" -+sqlparse = ">=0.2.2" -+ -+[package.extras] -+argon2 = ["argon2-cffi (>=16.1.0)"] -+bcrypt = ["bcrypt"] -+ -+[[package]] -+category = "main" -+description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." -+name = "django-filter" -+optional = false -+python-versions = ">=3.4" -+version = "2.2.0" -+ -+[package.dependencies] -+Django = ">=1.11" -+ -+[[package]] -+category = "main" -+description = "Tweak the form field rendering in templates, not in python-level form definitions." -+name = "django-widget-tweaks" -+optional = false -+python-versions = "*" -+version = "1.4.8" -+ -+[[package]] -+category = "main" -+description = "Web APIs for Django, made easy." -+name = "djangorestframework" -+optional = false -+python-versions = ">=3.5" -+version = "3.11.0" -+ -+[package.dependencies] -+django = ">=1.11" -+ -+[[package]] -+category = "main" -+description = "Automated generation of real Swagger/OpenAPI 2.0 schemas from Django Rest Framework code." -+name = "drf-yasg" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -+version = "1.17.1" -+ -+[package.dependencies] -+Django = ">=1.11.7" -+coreapi = ">=2.3.3" -+coreschema = ">=0.0.4" -+djangorestframework = ">=3.8" -+inflection = ">=0.3.1" -+packaging = "*" -+"ruamel.yaml" = ">=0.15.34" -+six = ">=1.10.0" -+uritemplate = ">=3.0.0" -+ -+[package.extras] -+validation = ["swagger-spec-validator (>=2.1.0)"] -+ -+[[package]] -+category = "main" -+description = "WSGI HTTP Server for UNIX" -+name = "gunicorn" -+optional = false -+python-versions = "*" -+version = "19.7.1" -+ -+[[package]] -+category = "main" -+description = "Internationalized Domain Names in Applications (IDNA)" -+name = "idna" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -+version = "2.10" -+ -+[[package]] -+category = "main" -+description = "Read metadata from Python packages" -+name = "importlib-metadata" -+optional = false -+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -+version = "1.3.0" -+ -+[package.dependencies] -+zipp = ">=0.5" -+ -+[package.extras] -+docs = ["sphinx", "rst.linker"] -+testing = ["packaging", "importlib-resources"] -+ -+[[package]] -+category = "main" -+description = "A port of Ruby on Rails inflector to Python" -+name = "inflection" -+optional = false -+python-versions = ">=3.5" -+version = "0.5.1" -+ -+[[package]] -+category = "main" -+description = "IPython: Productive Interactive Computing" -+name = "ipython" -+optional = false -+python-versions = ">=3.6" -+version = "7.13.0" -+ -+[package.dependencies] -+appnope = "*" -+backcall = "*" -+colorama = "*" -+decorator = "*" -+jedi = ">=0.10" -+pexpect = "*" -+pickleshare = "*" -+prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" -+pygments = "*" -+setuptools = ">=18.5" -+traitlets = ">=4.2" -+ -+[package.extras] -+all = ["numpy (>=1.14)", "testpath", "notebook", "nose (>=0.10.1)", "nbconvert", "requests", "ipywidgets", "qtconsole", "ipyparallel", "Sphinx (>=1.3)", "pygments", "nbformat", "ipykernel"] -+doc = ["Sphinx (>=1.3)"] -+kernel = ["ipykernel"] -+nbconvert = ["nbconvert"] -+nbformat = ["nbformat"] -+notebook = ["notebook", "ipywidgets"] -+parallel = ["ipyparallel"] -+qtconsole = ["qtconsole"] -+test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.14)"] -+ -+[[package]] -+category = "main" -+description = "Vestigial utilities from IPython" -+name = "ipython-genutils" -+optional = false -+python-versions = "*" -+version = "0.2.0" -+ -+[[package]] -+category = "main" -+description = "Simple immutable types for python." -+name = "itypes" -+optional = false -+python-versions = "*" -+version = "1.2.0" -+ -+[[package]] -+category = "main" -+description = "An autocompletion tool for Python that can be used for text editors." -+name = "jedi" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -+version = "0.17.0" -+ -+[package.dependencies] -+parso = ">=0.7.0" -+ -+[package.extras] -+qa = ["flake8 (3.7.9)"] -+testing = ["colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] -+ -+[[package]] -+category = "main" -+description = "A very fast and expressive template engine." -+name = "jinja2" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -+version = "2.11.2" -+ -+[package.dependencies] -+MarkupSafe = ">=0.23" -+ -+[package.extras] -+i18n = ["Babel (>=0.8)"] -+ -+[[package]] -+category = "main" -+description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -+name = "lxml" -+optional = false -+python-versions = "*" -+version = "4.3.3" -+ -+[package.extras] -+cssselect = ["cssselect (>=0.7)"] -+html5 = ["html5lib"] -+htmlsoup = ["beautifulsoup4"] -+source = ["Cython (>=0.29.1)"] -+ -+[[package]] -+category = "main" -+description = "Safely add untrusted strings to HTML/XML markup." -+name = "markupsafe" -+optional = false -+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -+version = "1.1.1" -+ -+[[package]] -+category = "main" -+description = "More routines for operating on iterables, beyond itertools" -+name = "more-itertools" -+optional = false -+python-versions = ">=3.5" -+version = "8.0.2" -+ -+[[package]] -+category = "main" -+description = "multidict implementation" -+name = "multidict" -+optional = false -+python-versions = ">=3.5" -+version = "4.7.6" -+ -+[[package]] -+category = "main" -+description = "A \"purl\" aka. Package URL parser and builder" -+name = "packageurl-python" -+optional = false -+python-versions = "*" -+version = "0.9.3" -+ -+[[package]] -+category = "main" -+description = "Core utilities for Python packages" -+name = "packaging" -+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 = "main" -+description = "A Python Parser" -+name = "parso" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -+version = "0.7.0" -+ -+[package.extras] -+testing = ["docopt", "pytest (>=3.0.7)"] -+ -+[[package]] -+category = "main" -+description = "Pexpect allows easy control of interactive console applications." -+name = "pexpect" -+optional = false -+python-versions = "*" -+version = "4.8.0" -+ -+[package.dependencies] -+ptyprocess = ">=0.5" -+ -+[[package]] -+category = "main" -+description = "Tiny 'shelve'-like database with concurrency support" -+name = "pickleshare" -+optional = false -+python-versions = "*" -+version = "0.7.5" -+ -+[[package]] -+category = "main" -+description = "plugin and hook calling mechanisms for python" -+name = "pluggy" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -+version = "0.13.1" -+ -+[package.extras] -+dev = ["pre-commit", "tox"] -+ -+[[package]] -+category = "main" -+description = "Library for building powerful interactive command lines in Python" -+name = "prompt-toolkit" -+optional = false -+python-versions = ">=3.6.1" -+version = "3.0.5" -+ -+[package.dependencies] -+wcwidth = "*" -+ -+[[package]] -+category = "main" -+description = "psycopg2 - Python-PostgreSQL Database Adapter" -+name = "psycopg2" -+optional = false -+python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -+version = "2.8.4" -+ -+[[package]] -+category = "main" -+description = "Run a subprocess in a pseudo terminal" -+name = "ptyprocess" -+optional = false -+python-versions = "*" -+version = "0.6.0" -+ -+[[package]] -+category = "main" -+description = "library with cross-python path, ini-parsing, io, code, log facilities" -+name = "py" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -+version = "1.8.0" -+ -+[[package]] -+category = "main" -+description = "Python style guide checker" -+name = "pycodestyle" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -+version = "2.5.0" -+ -+[[package]] -+category = "main" -+description = "C parser in Python" -+name = "pycparser" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -+version = "2.20" -+ -+[[package]] -+category = "main" -+description = "Python bindings for libgit2." -+name = "pygit2" -+optional = false -+python-versions = "*" -+version = "1.2.0" -+ -+[package.dependencies] -+cached-property = "*" -+cffi = "*" -+ -+[[package]] -+category = "main" -+description = "Pygments is a syntax highlighting package written in Python." -+name = "pygments" -+optional = false -+python-versions = ">=3.5" -+version = "2.6.1" -+ -+[[package]] -+category = "main" -+description = "Python parsing module" -+name = "pyparsing" -+optional = false -+python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -+version = "2.4.5" -+ -+[[package]] -+category = "main" -+description = "pytest: simple powerful testing with Python" -+name = "pytest" -+optional = false -+python-versions = ">=3.5" -+version = "5.3.2" -+ -+[package.dependencies] -+atomicwrites = ">=1.0" -+attrs = ">=17.4.0" -+colorama = "*" -+more-itertools = ">=4.0.0" -+packaging = "*" -+pluggy = ">=0.12,<1.0" -+py = ">=1.5.0" -+wcwidth = "*" -+ -+[package.extras] -+testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] -+ -+[[package]] -+category = "main" -+description = "Manage dependencies of tests" -+name = "pytest-dependency" -+optional = false -+python-versions = "*" -+version = "0.4.0" -+ -+[package.dependencies] -+pytest = ">=3.6.0" -+ -+[[package]] -+category = "main" -+description = "A Django plugin for pytest." -+name = "pytest-django" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -+version = "3.7.0" -+ -+[package.dependencies] -+pytest = ">=3.6" -+ -+[package.extras] -+docs = ["sphinx", "sphinx-rtd-theme"] -+testing = ["django", "django-configurations (>=2.0)", "six"] -+ -+[[package]] -+category = "main" -+description = "Thin-wrapper around the mock package for easier use with py.test" -+name = "pytest-mock" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -+version = "1.13.0" -+ -+[package.dependencies] -+pytest = ">=2.7" -+ -+[package.extras] -+dev = ["pre-commit", "tox"] -+ -+[[package]] -+category = "main" -+description = "Extensions to the standard Python datetime module" -+name = "python-dateutil" -+optional = false -+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -+version = "2.8.1" -+ -+[package.dependencies] -+six = ">=1.5" -+ -+[[package]] -+category = "main" -+description = "A parser for TOML-0.4.0" -+name = "pytoml" -+optional = false -+python-versions = "*" -+version = "0.1.21" -+ -+[[package]] -+category = "main" -+description = "World timezone definitions, modern and historical" -+name = "pytz" -+optional = false -+python-versions = "*" -+version = "2019.3" -+ -+[[package]] -+category = "main" -+description = "YAML parser and emitter for Python" -+name = "pyyaml" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -+version = "5.3.1" -+ -+[[package]] -+category = "main" -+description = "Python HTTP for Humans." -+name = "requests" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -+version = "2.23.0" -+ -+[package.dependencies] -+certifi = ">=2017.4.17" -+chardet = ">=3.0.2,<4" -+idna = ">=2.5,<3" -+urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" -+ -+[package.extras] -+security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -+socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] -+ -+[[package]] -+category = "main" -+description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -+name = "ruamel.yaml" -+optional = false -+python-versions = "*" -+version = "0.16.12" -+ -+[package.dependencies] -+[package.dependencies."ruamel.yaml.clib"] -+python = "<3.9" -+version = ">=0.1.2" -+ -+[package.extras] -+docs = ["ryd"] -+jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] -+ -+[[package]] -+category = "main" -+description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -+marker = "platform_python_implementation == \"CPython\" and python_version < \"3.9\"" -+name = "ruamel.yaml.clib" -+optional = false -+python-versions = "*" -+version = "0.2.2" -+ -+[[package]] -+category = "main" -+description = "Dump readable YAML and load safely any YAML preserving ordering and avoiding surprises of type conversions. This library is a PyYaml wrapper with sane behaviour to read and write readable YAML safely, typically when used for configuration." -+name = "saneyaml" -+optional = false -+python-versions = "*" -+version = "0.4" -+ -+[package.dependencies] -+PyYAML = "*" -+ -+[[package]] -+category = "main" -+description = "Simple data validation library" -+name = "schema" -+optional = false -+python-versions = "*" -+version = "0.7.1" -+ -+[package.dependencies] -+contextlib2 = "0.5.5" -+ -+[[package]] -+category = "main" -+description = "Python 2 and 3 compatibility utilities" -+name = "six" -+optional = false -+python-versions = ">=2.6, !=3.0.*, !=3.1.*" -+version = "1.13.0" -+ -+[[package]] -+category = "main" -+description = "A modern CSS selector implementation for Beautiful Soup." -+name = "soupsieve" -+optional = false -+python-versions = "*" -+version = "1.9.5" -+ -+[[package]] -+category = "main" -+description = "Non-validating SQL parser" -+name = "sqlparse" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -+version = "0.3.0" -+ -+[[package]] -+category = "main" -+description = "Fast, Extensible Progress Meter" -+name = "tqdm" -+optional = false -+python-versions = ">=2.6, !=3.0.*, !=3.1.*" -+version = "4.41.1" -+ -+[package.extras] -+dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] -+ -+[[package]] -+category = "main" -+description = "Traitlets Python config system" -+name = "traitlets" -+optional = false -+python-versions = "*" -+version = "4.3.3" -+ -+[package.dependencies] -+decorator = "*" -+ipython-genutils = "*" -+six = "*" -+ -+[package.extras] -+test = ["pytest", "mock"] -+ -+[[package]] -+category = "main" -+description = "URI templates" -+name = "uritemplate" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -+version = "3.0.1" -+ -+[[package]] -+category = "main" -+description = "HTTP library with thread-safe connection pooling, file post, and more." -+name = "urllib3" -+optional = false -+python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -+version = "1.25.11" -+ -+[package.extras] -+brotli = ["brotlipy (>=0.6.0)"] -+secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -+socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] -+ -+[[package]] -+category = "main" -+description = "Measures number of Terminal column cells of wide-character codes" -+name = "wcwidth" -+optional = false -+python-versions = "*" -+version = "0.1.7" -+ -+[[package]] -+category = "main" -+description = "Radically simplified static file serving for WSGI applications" -+name = "whitenoise" -+optional = false -+python-versions = ">=3.5, <4" -+version = "5.0.1" -+ -+[package.extras] -+brotli = ["brotli"] -+ -+[[package]] -+category = "main" -+description = "Yet another URL library" -+name = "yarl" -+optional = false -+python-versions = ">=3.6" -+version = "1.6.3" -+ -+[package.dependencies] -+idna = ">=2.0" -+multidict = ">=4.0" -+ -+[[package]] -+category = "main" -+description = "Backport of pathlib-compatible object wrapper for zip files" -+name = "zipp" -+optional = false -+python-versions = ">=2.7" -+version = "0.6.0" -+ -+[package.dependencies] -+more-itertools = "*" -+ -+[package.extras] -+docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -+testing = ["pathlib2", "contextlib2", "unittest2"] -+ -+[metadata] -+content-hash = "00be403d6025da9c520d68b68d62235d203d77ac262ca6be4db74e5c5a75f505" -+lock-version = "1.0" -+python-versions = "^3.8" -+ -+[metadata.files] -+aiohttp = [ -+ {file = "aiohttp-3.6.2-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:1e984191d1ec186881ffaed4581092ba04f7c61582a177b187d3a2f07ed9719e"}, -+ {file = "aiohttp-3.6.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:50aaad128e6ac62e7bf7bd1f0c0a24bc968a0c0590a726d5a955af193544bcec"}, -+ {file = "aiohttp-3.6.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:65f31b622af739a802ca6fd1a3076fd0ae523f8485c52924a89561ba10c49b48"}, -+ {file = "aiohttp-3.6.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ae55bac364c405caa23a4f2d6cfecc6a0daada500274ffca4a9230e7129eac59"}, -+ {file = "aiohttp-3.6.2-cp36-cp36m-win32.whl", hash = "sha256:344c780466b73095a72c616fac5ea9c4665add7fc129f285fbdbca3cccf4612a"}, -+ {file = "aiohttp-3.6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:4c6efd824d44ae697814a2a85604d8e992b875462c6655da161ff18fd4f29f17"}, -+ {file = "aiohttp-3.6.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2f4d1a4fdce595c947162333353d4a44952a724fba9ca3205a3df99a33d1307a"}, -+ {file = "aiohttp-3.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6206a135d072f88da3e71cc501c59d5abffa9d0bb43269a6dcd28d66bfafdbdd"}, -+ {file = "aiohttp-3.6.2-cp37-cp37m-win32.whl", hash = "sha256:b778ce0c909a2653741cb4b1ac7015b5c130ab9c897611df43ae6a58523cb965"}, -+ {file = "aiohttp-3.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:32e5f3b7e511aa850829fbe5aa32eb455e5534eaa4b1ce93231d00e2f76e5654"}, -+ {file = "aiohttp-3.6.2-py3-none-any.whl", hash = "sha256:460bd4237d2dbecc3b5ed57e122992f60188afe46e7319116da5eb8a9dfedba4"}, -+ {file = "aiohttp-3.6.2.tar.gz", hash = "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326"}, -+] -+appnope = [ -+ {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, -+ {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, -+] -+asgiref = [ -+ {file = "asgiref-3.2.7-py2.py3-none-any.whl", hash = "sha256:9ca8b952a0a9afa61d30aa6d3d9b570bb3fd6bafcf7ec9e6bed43b936133db1c"}, -+ {file = "asgiref-3.2.7.tar.gz", hash = "sha256:8036f90603c54e93521e5777b2b9a39ba1bad05773fcf2d208f0299d1df58ce5"}, -+] -+async-timeout = [ -+ {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, -+ {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, -+] -+atomicwrites = [ -+ {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, -+ {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -+] -+attrs = [ -+ {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, -+ {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, -+] -+backcall = [ -+ {file = "backcall-0.1.0.tar.gz", hash = "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4"}, -+ {file = "backcall-0.1.0.zip", hash = "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"}, -+] -+beautifulsoup4 = [ -+ {file = "beautifulsoup4-4.7.1-py2-none-any.whl", hash = "sha256:ba6d5c59906a85ac23dadfe5c88deaf3e179ef565f4898671253e50a78680718"}, -+ {file = "beautifulsoup4-4.7.1-py3-none-any.whl", hash = "sha256:034740f6cb549b4e932ae1ab975581e6103ac8f942200a0e9759065984391858"}, -+ {file = "beautifulsoup4-4.7.1.tar.gz", hash = "sha256:945065979fb8529dd2f37dbb58f00b661bdbcbebf954f93b32fdf5263ef35348"}, -+] -+cached-property = [ -+ {file = "cached-property-1.5.1.tar.gz", hash = "sha256:9217a59f14a5682da7c4b8829deadbfc194ac22e9908ccf7c8820234e80a1504"}, -+ {file = "cached_property-1.5.1-py2.py3-none-any.whl", hash = "sha256:3a026f1a54135677e7da5ce819b0c690f156f37976f3e30c5430740725203d7f"}, -+] -+certifi = [ -+ {file = "certifi-2020.11.8-py2.py3-none-any.whl", hash = "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd"}, -+ {file = "certifi-2020.11.8.tar.gz", hash = "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4"}, -+] -+cffi = [ -+ {file = "cffi-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384"}, -+ {file = "cffi-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30"}, -+ {file = "cffi-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c"}, -+ {file = "cffi-1.14.0-cp27-cp27m-win32.whl", hash = "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78"}, -+ {file = "cffi-1.14.0-cp27-cp27m-win_amd64.whl", hash = "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793"}, -+ {file = "cffi-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e"}, -+ {file = "cffi-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a"}, -+ {file = "cffi-1.14.0-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff"}, -+ {file = "cffi-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f"}, -+ {file = "cffi-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa"}, -+ {file = "cffi-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5"}, -+ {file = "cffi-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4"}, -+ {file = "cffi-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d"}, -+ {file = "cffi-1.14.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc"}, -+ {file = "cffi-1.14.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac"}, -+ {file = "cffi-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f"}, -+ {file = "cffi-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b"}, -+ {file = "cffi-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3"}, -+ {file = "cffi-1.14.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66"}, -+ {file = "cffi-1.14.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0"}, -+ {file = "cffi-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f"}, -+ {file = "cffi-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26"}, -+ {file = "cffi-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd"}, -+ {file = "cffi-1.14.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55"}, -+ {file = "cffi-1.14.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2"}, -+ {file = "cffi-1.14.0-cp38-cp38-win32.whl", hash = "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8"}, -+ {file = "cffi-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b"}, -+ {file = "cffi-1.14.0.tar.gz", hash = "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6"}, -+] -+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.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, -+ {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -+] -+contextlib2 = [ -+ {file = "contextlib2-0.5.5-py2.py3-none-any.whl", hash = "sha256:f5260a6e679d2ff42ec91ec5252f4eeffdcf21053db9113bd0a8e4d953769c00"}, -+ {file = "contextlib2-0.5.5.tar.gz", hash = "sha256:509f9419ee91cdd00ba34443217d5ca51f5a364a404e1dce9e8979cea969ca48"}, -+] -+coreapi = [ -+ {file = "coreapi-2.3.3-py2.py3-none-any.whl", hash = "sha256:bf39d118d6d3e171f10df9ede5666f63ad80bba9a29a8ec17726a66cf52ee6f3"}, -+ {file = "coreapi-2.3.3.tar.gz", hash = "sha256:46145fcc1f7017c076a2ef684969b641d18a2991051fddec9458ad3f78ffc1cb"}, -+] -+coreschema = [ -+ {file = "coreschema-0.0.4-py2-none-any.whl", hash = "sha256:5e6ef7bf38c1525d5e55a895934ab4273548629f16aed5c0a6caa74ebf45551f"}, -+ {file = "coreschema-0.0.4.tar.gz", hash = "sha256:9503506007d482ab0867ba14724b93c18a33b22b6d19fb419ef2d239dd4a1607"}, -+] -+decorator = [ -+ {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, -+ {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, -+] -+dephell-specifier = [ -+ {file = "dephell_specifier-0.2.1-py3-none-any.whl", hash = "sha256:de46325cfd6adedf5f685a3c00242d8a16fe270a7a76948fd1957c99561eb89e"}, -+ {file = "dephell_specifier-0.2.1.tar.gz", hash = "sha256:c2ec7e62a2406960e19eb6db0f11918d82af64995ee1f26fe00d013791ae9758"}, -+] -+dj-database-url = [ -+ {file = "dj-database-url-0.4.2.tar.gz", hash = "sha256:a6832d8445ee9d788c5baa48aef8130bf61fdc442f7d9a548424d25cd85c9f08"}, -+ {file = "dj_database_url-0.4.2-py2.py3-none-any.whl", hash = "sha256:e16d94c382ea0564c48038fa7fe8d9c890ef1ab1a8ec4cb48e732c124b9482fd"}, -+] -+django = [ -+ {file = "Django-3.0.7-py3-none-any.whl", hash = "sha256:e1630333248c9b3d4e38f02093a26f1e07b271ca896d73097457996e0fae12e8"}, -+ {file = "Django-3.0.7.tar.gz", hash = "sha256:5052b34b34b3425233c682e0e11d658fd6efd587d11335a0203d827224ada8f2"}, -+] -+django-filter = [ -+ {file = "django-filter-2.2.0.tar.gz", hash = "sha256:c3deb57f0dd7ff94d7dce52a047516822013e2b441bed472b722a317658cfd14"}, -+ {file = "django_filter-2.2.0-py3-none-any.whl", hash = "sha256:558c727bce3ffa89c4a7a0b13bc8976745d63e5fd576b3a9a851650ef11c401b"}, -+] -+django-widget-tweaks = [ -+ {file = "django-widget-tweaks-1.4.8.tar.gz", hash = "sha256:9f91ca4217199b7671971d3c1f323a2bec71a0c27dec6260b3c006fa541bc489"}, -+ {file = "django_widget_tweaks-1.4.8-py2.py3-none-any.whl", hash = "sha256:f80bff4a8a59b278bb277a405a76a8b9a884e4bae7a6c70e78a39c626cd1c836"}, -+] -+djangorestframework = [ -+ {file = "djangorestframework-3.11.0-py3-none-any.whl", hash = "sha256:05809fc66e1c997fd9a32ea5730d9f4ba28b109b9da71fccfa5ff241201fd0a4"}, -+ {file = "djangorestframework-3.11.0.tar.gz", hash = "sha256:e782087823c47a26826ee5b6fa0c542968219263fb3976ec3c31edab23a4001f"}, -+] -+drf-yasg = [ -+ {file = "drf-yasg-1.17.1.tar.gz", hash = "sha256:5572e9d5baab9f6b49318169df9789f7399d0e3c7bdac8fdb8dfccf1d5d2b1ca"}, -+ {file = "drf_yasg-1.17.1-py2.py3-none-any.whl", hash = "sha256:7d7af27ad16e18507e9392b2afd6b218fbffc432ec8dbea053099a2241e184ff"}, -+] -+gunicorn = [ -+ {file = "gunicorn-19.7.1-py2.py3-none-any.whl", hash = "sha256:75af03c99389535f218cc596c7de74df4763803f7b63eb09d77e92b3956b36c6"}, -+ {file = "gunicorn-19.7.1.tar.gz", hash = "sha256:eee1169f0ca667be05db3351a0960765620dad53f53434262ff8901b68a1b622"}, -+] -+idna = [ -+ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, -+ {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, -+] -+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"}, -+] -+inflection = [ -+ {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, -+ {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, -+] -+ipython = [ -+ {file = "ipython-7.13.0-py3-none-any.whl", hash = "sha256:eb8d075de37f678424527b5ef6ea23f7b80240ca031c2dd6de5879d687a65333"}, -+ {file = "ipython-7.13.0.tar.gz", hash = "sha256:ca478e52ae1f88da0102360e57e528b92f3ae4316aabac80a2cd7f7ab2efb48a"}, -+] -+ipython-genutils = [ -+ {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, -+ {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, -+] -+itypes = [ -+ {file = "itypes-1.2.0-py2.py3-none-any.whl", hash = "sha256:03da6872ca89d29aef62773672b2d408f490f80db48b23079a4b194c86dd04c6"}, -+ {file = "itypes-1.2.0.tar.gz", hash = "sha256:af886f129dea4a2a1e3d36595a2d139589e4dd287f5cab0b40e799ee81570ff1"}, -+] -+jedi = [ -+ {file = "jedi-0.17.0-py2.py3-none-any.whl", hash = "sha256:cd60c93b71944d628ccac47df9a60fec53150de53d42dc10a7fc4b5ba6aae798"}, -+ {file = "jedi-0.17.0.tar.gz", hash = "sha256:df40c97641cb943661d2db4c33c2e1ff75d491189423249e989bcea4464f3030"}, -+] -+jinja2 = [ -+ {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, -+ {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, -+] -+lxml = [ -+ {file = "lxml-4.3.3-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:3210da6f36cf4b835ff1be853962b22cc354d506f493b67a4303c88bbb40d57b"}, -+ {file = "lxml-4.3.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:fdcb57b906dbc1f80666e6290e794ab8fb959a2e17aa5aee1758a85d1da4533f"}, -+ {file = "lxml-4.3.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:a3080470559938a09a5d0ec558c005282e99ac77bf8211fb7b9a5c66390acd8d"}, -+ {file = "lxml-4.3.3-cp27-cp27m-win32.whl", hash = "sha256:bdb0593a42070b0a5f138b79b872289ee73c8e25b3f0bea6564e795b55b6bcdd"}, -+ {file = "lxml-4.3.3-cp27-cp27m-win_amd64.whl", hash = "sha256:b4fbf9b552faff54742bcd0791ab1da5863363fb19047e68f6592be1ac2dab33"}, -+ {file = "lxml-4.3.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:62f382cddf3d2e52cf266e161aa522d54fd624b8cc567bc18f573d9d50d40e8e"}, -+ {file = "lxml-4.3.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ad841b78a476623955da270ab8d207c3c694aa5eba71f4792f65926dc46c6ee8"}, -+ {file = "lxml-4.3.3-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:40f60819fbd5bad6e191ba1329bfafa09ab7f3f174b3d034d413ef5266963294"}, -+ {file = "lxml-4.3.3-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:f679d93dec7f7210575c85379a31322df4c46496f184ef650d3aba1484b38a2d"}, -+ {file = "lxml-4.3.3-cp34-cp34m-win32.whl", hash = "sha256:c4e4bca2bb68ce22320297dfa1a7bf070a5b20bcbaec4ee023f83d2f6e76496f"}, -+ {file = "lxml-4.3.3-cp34-cp34m-win_amd64.whl", hash = "sha256:846a0739e595871041385d86d12af4b6999f921359b38affb99cdd6b54219a8f"}, -+ {file = "lxml-4.3.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:ff424b01d090ffe1947ec7432b07f536912e0300458f9a7f48ea217dd8362b86"}, -+ {file = "lxml-4.3.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:43b26a865a61549919f8a42e094dfdb62847113cf776d84bd6b60e4e3fc20ea3"}, -+ {file = "lxml-4.3.3-cp35-cp35m-win32.whl", hash = "sha256:fd213bb5166e46974f113c8228daaef1732abc47cb561ce9c4c8eaed4bd3b09b"}, -+ {file = "lxml-4.3.3-cp35-cp35m-win_amd64.whl", hash = "sha256:e83b4b2bf029f5104bc1227dbb7bf5ace6fd8fabaebffcd4f8106fafc69fc45f"}, -+ {file = "lxml-4.3.3-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:175f3825f075cf02d15099eb52658457cf0ff103dcf11512b5d2583e1d40f58b"}, -+ {file = "lxml-4.3.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:afdd75d9735e44c639ffd6258ce04a2de3b208f148072c02478162d0944d9da3"}, -+ {file = "lxml-4.3.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b91cfe4438c741aeff662d413fd2808ac901cc6229c838236840d11de4586d63"}, -+ {file = "lxml-4.3.3-cp36-cp36m-win32.whl", hash = "sha256:30e14c62d88d1e01a26936ecd1c6e784d4afc9aa002bba4321c5897937112616"}, -+ {file = "lxml-4.3.3-cp36-cp36m-win_amd64.whl", hash = "sha256:0815b0c9f897468de6a386dc15917a0becf48cc92425613aa8bbfc7f0f82951f"}, -+ {file = "lxml-4.3.3-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:03984196d00670b2ab14ae0ea83d5cc0cfa4f5a42558afa9ab5fa745995328f5"}, -+ {file = "lxml-4.3.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cec4ab14af9eae8501be3266ff50c3c2aecc017ba1e86c160209bb4f0423df6a"}, -+ {file = "lxml-4.3.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e995b3734a46d41ae60b6097f7c51ba9958648c6d1e0935b7e0ee446ee4abe22"}, -+ {file = "lxml-4.3.3-cp37-cp37m-win32.whl", hash = "sha256:b90c4e32d6ec089d3fa3518436bdf5ce4d902a0787dbd9bb09f37afe8b994317"}, -+ {file = "lxml-4.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:7b98f0325be8450da70aa4a796c4f06852949fe031878b4aa1d6c417a412f314"}, -+ {file = "lxml-4.3.3.tar.gz", hash = "sha256:4a03dd682f8e35a10234904e0b9508d705ff98cf962c5851ed052e9340df3d90"}, -+] -+markupsafe = [ -+ {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, -+ {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, -+ {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, -+ {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, -+ {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, -+ {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, -+ {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, -+ {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, -+ {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, -+ {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, -+ {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, -+ {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, -+ {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, -+ {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, -+ {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, -+ {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, -+ {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, -+ {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, -+ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, -+ {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, -+ {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, -+ {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, -+ {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, -+ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, -+ {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, -+ {file = "MarkupSafe-1.1.1-cp37-cp37m-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"}, -+] -+more-itertools = [ -+ {file = "more-itertools-8.0.2.tar.gz", hash = "sha256:b84b238cce0d9adad5ed87e745778d20a3f8487d0f0cb8b8a586816c7496458d"}, -+ {file = "more_itertools-8.0.2-py3-none-any.whl", hash = "sha256:c833ef592a0324bcc6a60e48440da07645063c453880c9477ceb22490aec1564"}, -+] -+multidict = [ -+ {file = "multidict-4.7.6-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:275ca32383bc5d1894b6975bb4ca6a7ff16ab76fa622967625baeebcf8079000"}, -+ {file = "multidict-4.7.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1ece5a3369835c20ed57adadc663400b5525904e53bae59ec854a5d36b39b21a"}, -+ {file = "multidict-4.7.6-cp35-cp35m-win32.whl", hash = "sha256:5141c13374e6b25fe6bf092052ab55c0c03d21bd66c94a0e3ae371d3e4d865a5"}, -+ {file = "multidict-4.7.6-cp35-cp35m-win_amd64.whl", hash = "sha256:9456e90649005ad40558f4cf51dbb842e32807df75146c6d940b6f5abb4a78f3"}, -+ {file = "multidict-4.7.6-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:e0d072ae0f2a179c375f67e3da300b47e1a83293c554450b29c900e50afaae87"}, -+ {file = "multidict-4.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3750f2205b800aac4bb03b5ae48025a64e474d2c6cc79547988ba1d4122a09e2"}, -+ {file = "multidict-4.7.6-cp36-cp36m-win32.whl", hash = "sha256:f07acae137b71af3bb548bd8da720956a3bc9f9a0b87733e0899226a2317aeb7"}, -+ {file = "multidict-4.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:6513728873f4326999429a8b00fc7ceddb2509b01d5fd3f3be7881a257b8d463"}, -+ {file = "multidict-4.7.6-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:feed85993dbdb1dbc29102f50bca65bdc68f2c0c8d352468c25b54874f23c39d"}, -+ {file = "multidict-4.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fcfbb44c59af3f8ea984de67ec7c306f618a3ec771c2843804069917a8f2e255"}, -+ {file = "multidict-4.7.6-cp37-cp37m-win32.whl", hash = "sha256:4538273208e7294b2659b1602490f4ed3ab1c8cf9dbdd817e0e9db8e64be2507"}, -+ {file = "multidict-4.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d14842362ed4cf63751648e7672f7174c9818459d169231d03c56e84daf90b7c"}, -+ {file = "multidict-4.7.6-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:c026fe9a05130e44157b98fea3ab12969e5b60691a276150db9eda71710cd10b"}, -+ {file = "multidict-4.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:51a4d210404ac61d32dada00a50ea7ba412e6ea945bbe992e4d7a595276d2ec7"}, -+ {file = "multidict-4.7.6-cp38-cp38-win32.whl", hash = "sha256:5cf311a0f5ef80fe73e4f4c0f0998ec08f954a6ec72b746f3c179e37de1d210d"}, -+ {file = "multidict-4.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:7388d2ef3c55a8ba80da62ecfafa06a1c097c18032a501ffd4cabbc52d7f2b19"}, -+ {file = "multidict-4.7.6.tar.gz", hash = "sha256:fbb77a75e529021e7c4a8d4e823d88ef4d23674a202be4f5addffc72cbb91430"}, -+] -+packageurl-python = [ -+ {file = "packageurl-python-0.9.3.tar.gz", hash = "sha256:c54add03a464d4779ee50350231aabb971751bbf52389acbcd0149e2ea7122aa"}, -+ {file = "packageurl_python-0.9.3-py2.py3-none-any.whl", hash = "sha256:0682b2eddab16151da5bd4ef38081e9b27f8eb33cd29baf41f4996d4e88e6e70"}, -+] -+packaging = [ -+ {file = "packaging-19.2-py2.py3-none-any.whl", hash = "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108"}, -+ {file = "packaging-19.2.tar.gz", hash = "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47"}, -+] -+parso = [ -+ {file = "parso-0.7.0-py2.py3-none-any.whl", hash = "sha256:158c140fc04112dc45bca311633ae5033c2c2a7b732fa33d0955bad8152a8dd0"}, -+ {file = "parso-0.7.0.tar.gz", hash = "sha256:908e9fae2144a076d72ae4e25539143d40b8e3eafbaeae03c1bfe226f4cdf12c"}, -+] -+pexpect = [ -+ {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"}, -+ {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -+] -+pluggy = [ -+ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, -+ {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -+] -+prompt-toolkit = [ -+ {file = "prompt_toolkit-3.0.5-py3-none-any.whl", hash = "sha256:df7e9e63aea609b1da3a65641ceaf5bc7d05e0a04de5bd45d05dbeffbabf9e04"}, -+ {file = "prompt_toolkit-3.0.5.tar.gz", hash = "sha256:563d1a4140b63ff9dd587bda9557cffb2fe73650205ab6f4383092fb882e7dc8"}, -+] -+psycopg2 = [ -+ {file = "psycopg2-2.8.4-cp27-cp27m-win32.whl", hash = "sha256:72772181d9bad1fa349792a1e7384dde56742c14af2b9986013eb94a240f005b"}, -+ {file = "psycopg2-2.8.4-cp27-cp27m-win_amd64.whl", hash = "sha256:893c11064b347b24ecdd277a094413e1954f8a4e8cdaf7ffbe7ca3db87c103f0"}, -+ {file = "psycopg2-2.8.4-cp34-cp34m-win32.whl", hash = "sha256:9ab75e0b2820880ae24b7136c4d230383e07db014456a476d096591172569c38"}, -+ {file = "psycopg2-2.8.4-cp34-cp34m-win_amd64.whl", hash = "sha256:b0845e3bdd4aa18dc2f9b6fb78fbd3d9d371ad167fd6d1b7ad01c0a6cdad4fc6"}, -+ {file = "psycopg2-2.8.4-cp35-cp35m-win32.whl", hash = "sha256:ef6df7e14698e79c59c7ee7cf94cd62e5b869db369ed4b1b8f7b729ea825712a"}, -+ {file = "psycopg2-2.8.4-cp35-cp35m-win_amd64.whl", hash = "sha256:965c4c93e33e6984d8031f74e51227bd755376a9df6993774fd5b6fb3288b1f4"}, -+ {file = "psycopg2-2.8.4-cp36-cp36m-win32.whl", hash = "sha256:ed686e5926929887e2c7ae0a700e32c6129abb798b4ad2b846e933de21508151"}, -+ {file = "psycopg2-2.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:dca2d7203f0dfce8ea4b3efd668f8ea65cd2b35112638e488a4c12594015f67b"}, -+ {file = "psycopg2-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:8396be6e5ff844282d4d49b81631772f80dabae5658d432202faf101f5283b7c"}, -+ {file = "psycopg2-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:47fc642bf6f427805daf52d6e52619fe0637648fe27017062d898f3bf891419d"}, -+ {file = "psycopg2-2.8.4-cp38-cp38-win32.whl", hash = "sha256:4212ca404c4445dc5746c0d68db27d2cbfb87b523fe233dc84ecd24062e35677"}, -+ {file = "psycopg2-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:92a07dfd4d7c325dd177548c4134052d4842222833576c8391aab6f74038fc3f"}, -+ {file = "psycopg2-2.8.4.tar.gz", hash = "sha256:f898e5cc0a662a9e12bde6f931263a1bbd350cfb18e1d5336a12927851825bb6"}, -+] -+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.0-py2.py3-none-any.whl", hash = "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa"}, -+ {file = "py-1.8.0.tar.gz", hash = "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53"}, -+] -+pycodestyle = [ -+ {file = "pycodestyle-2.5.0-py2.py3-none-any.whl", hash = "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56"}, -+ {file = "pycodestyle-2.5.0.tar.gz", hash = "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"}, -+] -+pycparser = [ -+ {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, -+ {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, -+] -+pygit2 = [ -+ {file = "pygit2-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:997430ffbf3a327c3608ae6b0c18c714b3334bfb6e88d850746f37ccd29c61ab"}, -+ {file = "pygit2-1.2.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:ed13fd6945b7508f1763d5d170dedbc7001601afed606f989d778019c2a198f6"}, -+ {file = "pygit2-1.2.0-cp36-cp36m-win32.whl", hash = "sha256:10c7b5ff733d75f198233012fe33570d8f9bec2dd73079edfd42a892a8322629"}, -+ {file = "pygit2-1.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:55965517b2775d34878d87ab2e66edbd3a3a9ff5fc9181e342e40511d5bea63f"}, -+ {file = "pygit2-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:32b210da98c7e37800db5b2d4b9217ba933e3f58b34a8894bea02ed12601bccf"}, -+ {file = "pygit2-1.2.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a65dbe2485f7d888d46a70f192e7e7ab0a0d4623c8c2974dbbf98da235338e48"}, -+ {file = "pygit2-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:c7484d277319a347aa44dd0363320d34059716a7b95b4609c40572188229405e"}, -+ {file = "pygit2-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1fc1afe2acd06811416adc67942259eaa903f86a2f631d92d7fa5b0e9ad36a0c"}, -+ {file = "pygit2-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8688eab31cdd773236dd594712072fa20f9f6e3766e2f016c9a580149c2cd82"}, -+ {file = "pygit2-1.2.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5916e8ce38cfc30fb1798c29ed8ffa87317a4125096e5008d78951e3a8f907ee"}, -+ {file = "pygit2-1.2.0-cp38-cp38-win32.whl", hash = "sha256:12cc53e7d812404e6121840216885e23dbcf4577c1f0929b5660b12b4f35312c"}, -+ {file = "pygit2-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:ab07a81b5411be041784ca6334fb4467a76c4c272d53abe33178651e5dbbc015"}, -+ {file = "pygit2-1.2.0.tar.gz", hash = "sha256:f991347f5b11589ac8dc5a3c8257a514cf802545b75c11133a43ae9f76388278"}, -+] -+pygments = [ -+ {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, -+ {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, -+] -+pyparsing = [ -+ {file = "pyparsing-2.4.5-py2.py3-none-any.whl", hash = "sha256:20f995ecd72f2a1f4bf6b072b63b22e2eb457836601e76d6e5dfcd75436acc1f"}, -+ {file = "pyparsing-2.4.5.tar.gz", hash = "sha256:4ca62001be367f01bd3e92ecbb79070272a9d4964dce6a48a82ff0b8bc7e683a"}, -+] -+pytest = [ -+ {file = "pytest-5.3.2-py3-none-any.whl", hash = "sha256:e41d489ff43948babd0fad7ad5e49b8735d5d55e26628a58673c39ff61d95de4"}, -+ {file = "pytest-5.3.2.tar.gz", hash = "sha256:6b571215b5a790f9b41f19f3531c53a45cf6bb8ef2988bc1ff9afb38270b25fa"}, -+] -+pytest-dependency = [ -+ {file = "pytest-dependency-0.4.0.tar.gz", hash = "sha256:bda0ef48e6a44c091399b12ab4a7e580d2dd8294c222b301f88d7d57f47ba142"}, -+] -+pytest-django = [ -+ {file = "pytest-django-3.7.0.tar.gz", hash = "sha256:17592f06d51c2ef4b7a0fb24aa32c8b6998506a03c8439606cb96db160106659"}, -+ {file = "pytest_django-3.7.0-py2.py3-none-any.whl", hash = "sha256:ef3d15b35ed7e46293475e6f282e71a53bcd8c6f87bdc5d5e7ad0f4d49352127"}, -+] -+pytest-mock = [ -+ {file = "pytest-mock-1.13.0.tar.gz", hash = "sha256:e24a911ec96773022ebcc7030059b57cd3480b56d4f5d19b7c370ec635e6aed5"}, -+ {file = "pytest_mock-1.13.0-py2.py3-none-any.whl", hash = "sha256:67e414b3caef7bff6fc6bd83b22b5bc39147e4493f483c2679bc9d4dc485a94d"}, -+] -+python-dateutil = [ -+ {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, -+ {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, -+] -+pytoml = [ -+ {file = "pytoml-0.1.21-py2.py3-none-any.whl", hash = "sha256:57a21e6347049f73bfb62011ff34cd72774c031b9828cb628a752225136dfc33"}, -+ {file = "pytoml-0.1.21.tar.gz", hash = "sha256:8eecf7c8d0adcff3b375b09fe403407aa9b645c499e5ab8cac670ac4a35f61e7"}, -+] -+pytz = [ -+ {file = "pytz-2019.3-py2.py3-none-any.whl", hash = "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d"}, -+ {file = "pytz-2019.3.tar.gz", hash = "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"}, -+] -+pyyaml = [ -+ {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, -+ {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, -+ {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, -+ {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, -+ {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, -+ {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, -+ {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, -+ {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, -+ {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, -+ {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, -+ {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, -+] -+requests = [ -+ {file = "requests-2.23.0-py2.7.egg", hash = "sha256:5d2d0ffbb515f39417009a46c14256291061ac01ba8f875b90cad137de83beb4"}, -+ {file = "requests-2.23.0-py2.py3-none-any.whl", hash = "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee"}, -+ {file = "requests-2.23.0.tar.gz", hash = "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"}, -+] -+"ruamel.yaml" = [ -+ {file = "ruamel.yaml-0.16.12-py2.py3-none-any.whl", hash = "sha256:012b9470a0ea06e4e44e99e7920277edf6b46eee0232a04487ea73a7386340a5"}, -+ {file = "ruamel.yaml-0.16.12.tar.gz", hash = "sha256:076cc0bc34f1966d920a49f18b52b6ad559fbe656a0748e3535cf7b3f29ebf9e"}, -+] -+"ruamel.yaml.clib" = [ -+ {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:28116f204103cb3a108dfd37668f20abe6e3cafd0d3fd40dba126c732457b3cc"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:daf21aa33ee9b351f66deed30a3d450ab55c14242cfdfcd377798e2c0d25c9f1"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win32.whl", hash = "sha256:30dca9bbcbb1cc858717438218d11eafb78666759e5094dd767468c0d577a7e7"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win_amd64.whl", hash = "sha256:f6061a31880c1ed6b6ce341215336e2f3d0c1deccd84957b6fa8ca474b41e89f"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:73b3d43e04cc4b228fa6fa5d796409ece6fcb53a6c270eb2048109cbcbc3b9c2"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:53b9dd1abd70e257a6e32f934ebc482dac5edb8c93e23deb663eac724c30b026"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:839dd72545ef7ba78fd2aa1a5dd07b33696adf3e68fae7f31327161c1093001b"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win32.whl", hash = "sha256:b1e981fe1aff1fd11627f531524826a4dcc1f26c726235a52fcb62ded27d150f"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4e52c96ca66de04be42ea2278012a2342d89f5e82b4512fb6fb7134e377e2e62"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a873e4d4954f865dcb60bdc4914af7eaae48fb56b60ed6daa1d6251c72f5337c"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ab845f1f51f7eb750a78937be9f79baea4a42c7960f5a94dde34e69f3cce1988"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win32.whl", hash = "sha256:e9f7d1d8c26a6a12c23421061f9022bb62704e38211fe375c645485f38df34a2"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2602e91bd5c1b874d6f93d3086f9830f3e907c543c7672cf293a97c3fabdcd91"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44c7b0498c39f27795224438f1a6be6c5352f82cb887bc33d962c3a3acc00df6"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8e8fd0a22c9d92af3a34f91e8a2594eeb35cba90ab643c5e0e643567dc8be43e"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win32.whl", hash = "sha256:464e66a04e740d754170be5e740657a3b3b6d2bcc567f0c3437879a6e6087ff6"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:52ae5739e4b5d6317b52f5b040b1b6639e8af68a5b8fd606a8b08658fbd0cab5"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df5019e7783d14b79217ad9c56edf1ba7485d614ad5a385d1b3c768635c81c0"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5254af7d8bdf4d5484c089f929cb7f5bafa59b4f01d4f48adda4be41e6d29f99"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win32.whl", hash = "sha256:74161d827407f4db9072011adcfb825b5258a5ccb3d2cd518dd6c9edea9e30f1"}, -+ {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:058a1cc3df2a8aecc12f983a48bda99315cebf55a3b3a5463e37bb599b05727b"}, -+ {file = "ruamel.yaml.clib-0.2.2.tar.gz", hash = "sha256:2d24bd98af676f4990c4d715bcdc2a60b19c56a3fb3a763164d2d8ca0e806ba7"}, -+] -+saneyaml = [ -+ {file = "saneyaml-0.4-py2.py3-none-any.whl", hash = "sha256:f0d5bdd51649f3253ca8c2d9e48c78540c39d9d035810a2cd4406dbeffd8da11"}, -+ {file = "saneyaml-0.4.tar.gz", hash = "sha256:9a1863a9d27586fd86c30b9736478a7d441bf1d118cdc71a2fec0d94cfc3cf5c"}, -+] -+schema = [ -+ {file = "schema-0.7.1-py2.py3-none-any.whl", hash = "sha256:10b550886f5ff402e1fdef85bd7be761b0e09a35a43633311807a57a5bc4db50"}, -+ {file = "schema-0.7.1.tar.gz", hash = "sha256:c9dc8f4624e287c7d1435f8fd758f6a0aabbb7eff442db9192cd46f0e2b6d959"}, -+] -+six = [ -+ {file = "six-1.13.0-py2.py3-none-any.whl", hash = "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd"}, -+ {file = "six-1.13.0.tar.gz", hash = "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"}, -+] -+soupsieve = [ -+ {file = "soupsieve-1.9.5-py2.py3-none-any.whl", hash = "sha256:bdb0d917b03a1369ce964056fc195cfdff8819c40de04695a80bc813c3cfa1f5"}, -+ {file = "soupsieve-1.9.5.tar.gz", hash = "sha256:e2c1c5dee4a1c36bcb790e0fabd5492d874b8ebd4617622c4f6a731701060dda"}, -+] -+sqlparse = [ -+ {file = "sqlparse-0.3.0-py2.py3-none-any.whl", hash = "sha256:40afe6b8d4b1117e7dff5504d7a8ce07d9a1b15aeeade8a2d10f130a834f8177"}, -+ {file = "sqlparse-0.3.0.tar.gz", hash = "sha256:7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873"}, -+] -+tqdm = [ -+ {file = "tqdm-4.41.1-py2.py3-none-any.whl", hash = "sha256:efab950cf7cc1e4d8ee50b2bb9c8e4a89f8307b49e0b2c9cfef3ec4ca26655eb"}, -+ {file = "tqdm-4.41.1.tar.gz", hash = "sha256:4789ccbb6fc122b5a6a85d512e4e41fc5acad77216533a6f2b8ce51e0f265c23"}, -+] -+traitlets = [ -+ {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, -+ {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, -+] -+uritemplate = [ -+ {file = "uritemplate-3.0.1-py2.py3-none-any.whl", hash = "sha256:07620c3f3f8eed1f12600845892b0e036a2420acf513c53f7de0abd911a5894f"}, -+ {file = "uritemplate-3.0.1.tar.gz", hash = "sha256:5af8ad10cec94f215e3f48112de2022e1d5a37ed427fbd88652fa908f2ab7cae"}, -+] -+urllib3 = [ -+ {file = "urllib3-1.25.11-py2.py3-none-any.whl", hash = "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e"}, -+ {file = "urllib3-1.25.11.tar.gz", hash = "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2"}, -+] -+wcwidth = [ -+ {file = "wcwidth-0.1.7-py2.py3-none-any.whl", hash = "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"}, -+ {file = "wcwidth-0.1.7.tar.gz", hash = "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e"}, -+] -+whitenoise = [ -+ {file = "whitenoise-5.0.1-py2.py3-none-any.whl", hash = "sha256:62556265ec1011bd87113fb81b7516f52688887b7a010ee899ff1fd18fd22700"}, -+ {file = "whitenoise-5.0.1.tar.gz", hash = "sha256:0f9137f74bd95fa54329ace88d8dc695fbe895369a632e35f7a136e003e41d73"}, -+] -+yarl = [ -+ {file = "yarl-1.6.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434"}, -+ {file = "yarl-1.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478"}, -+ {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6"}, -+ {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e"}, -+ {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406"}, -+ {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76"}, -+ {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366"}, -+ {file = "yarl-1.6.3-cp36-cp36m-win32.whl", hash = "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721"}, -+ {file = "yarl-1.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643"}, -+ {file = "yarl-1.6.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e"}, -+ {file = "yarl-1.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3"}, -+ {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8"}, -+ {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a"}, -+ {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c"}, -+ {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f"}, -+ {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970"}, -+ {file = "yarl-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e"}, -+ {file = "yarl-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50"}, -+ {file = "yarl-1.6.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2"}, -+ {file = "yarl-1.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec"}, -+ {file = "yarl-1.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71"}, -+ {file = "yarl-1.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc"}, -+ {file = "yarl-1.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959"}, -+ {file = "yarl-1.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2"}, -+ {file = "yarl-1.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2"}, -+ {file = "yarl-1.6.3-cp38-cp38-win32.whl", hash = "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896"}, -+ {file = "yarl-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a"}, -+ {file = "yarl-1.6.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e"}, -+ {file = "yarl-1.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724"}, -+ {file = "yarl-1.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c"}, -+ {file = "yarl-1.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25"}, -+ {file = "yarl-1.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96"}, -+ {file = "yarl-1.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0"}, -+ {file = "yarl-1.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4"}, -+ {file = "yarl-1.6.3-cp39-cp39-win32.whl", hash = "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424"}, -+ {file = "yarl-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6"}, -+ {file = "yarl-1.6.3.tar.gz", hash = "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10"}, -+] -+zipp = [ -+ {file = "zipp-0.6.0-py2.py3-none-any.whl", hash = "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335"}, -+ {file = "zipp-0.6.0.tar.gz", hash = "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e"}, -+] diff --git a/etc/nix/poetry.lock.autogenerated b/etc/nix/poetry.lock.autogenerated new file mode 100644 index 000000000..09f8b0a9e --- /dev/null +++ b/etc/nix/poetry.lock.autogenerated @@ -0,0 +1,1342 @@ +[[package]] +category = "main" +description = "Async http client/server framework (asyncio)" +name = "aiohttp" +optional = false +python-versions = ">=3.5.3" +version = "3.6.2" + +[package.dependencies] +async-timeout = ">=3.0,<4.0" +attrs = ">=17.3.0" +chardet = ">=2.0,<4.0" +multidict = ">=4.5,<5.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotlipy", "cchardet"] + +[[package]] +category = "main" +description = "Disable App Nap on macOS >= 10.9" +marker = "sys_platform == \"darwin\"" +name = "appnope" +optional = false +python-versions = "*" +version = "0.1.2" + +[[package]] +category = "main" +description = "ASGI specs, helper code, and adapters" +name = "asgiref" +optional = false +python-versions = ">=3.5" +version = "3.2.7" + +[package.extras] +tests = ["pytest (>=4.3.0,<4.4.0)", "pytest-asyncio (>=0.10.0,<0.11.0)"] + +[[package]] +category = "main" +description = "Timeout context manager for asyncio programs" +name = "async-timeout" +optional = false +python-versions = ">=3.5.3" +version = "3.0.1" + +[[package]] +category = "main" +description = "Atomic file writes." +marker = "sys_platform == \"win32\"" +name = "atomicwrites" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.4.0" + +[[package]] +category = "main" +description = "Classes Without Boilerplate" +name = "attrs" +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"] + +[[package]] +category = "main" +description = "Specifications for callback functions passed in to an API" +name = "backcall" +optional = false +python-versions = "*" +version = "0.1.0" + +[[package]] +category = "main" +description = "Screen-scraping library" +name = "beautifulsoup4" +optional = false +python-versions = "*" +version = "4.7.1" + +[package.dependencies] +soupsieve = ">=1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +category = "main" +description = "A decorator for caching properties in classes." +name = "cached-property" +optional = false +python-versions = "*" +version = "1.5.1" + +[[package]] +category = "main" +description = "Python package for providing Mozilla's CA Bundle." +name = "certifi" +optional = false +python-versions = "*" +version = "2020.11.8" + +[[package]] +category = "main" +description = "Foreign Function Interface for Python calling C code." +name = "cffi" +optional = false +python-versions = "*" +version = "1.14.0" + +[package.dependencies] +pycparser = "*" + +[[package]] +category = "main" +description = "Universal encoding detector for Python 2 and 3" +name = "chardet" +optional = false +python-versions = "*" +version = "3.0.4" + +[[package]] +category = "main" +description = "Cross-platform colored terminal text." +marker = "sys_platform == \"win32\"" +name = "colorama" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.4.4" + +[[package]] +category = "main" +description = "Backports and enhancements for the contextlib module" +name = "contextlib2" +optional = false +python-versions = "*" +version = "0.5.5" + +[[package]] +category = "main" +description = "Python client library for Core API." +name = "coreapi" +optional = false +python-versions = "*" +version = "2.3.3" + +[package.dependencies] +coreschema = "*" +itypes = "*" +requests = "*" +uritemplate = "*" + +[[package]] +category = "main" +description = "Core Schema." +name = "coreschema" +optional = false +python-versions = "*" +version = "0.0.4" + +[package.dependencies] +jinja2 = "*" + +[[package]] +category = "main" +description = "Decorators for Humans" +name = "decorator" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*" +version = "4.4.2" + +[[package]] +category = "main" +description = "Work with version specifiers." +name = "dephell-specifier" +optional = false +python-versions = ">=3.5" +version = "0.2.1" + +[package.dependencies] +packaging = ">=17.1" + +[[package]] +category = "main" +description = "Use Database URLs in your Django Application." +name = "dj-database-url" +optional = false +python-versions = "*" +version = "0.4.2" + +[[package]] +category = "main" +description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." +name = "django" +optional = false +python-versions = ">=3.6" +version = "3.0.7" + +[package.dependencies] +asgiref = ">=3.2,<4.0" +pytz = "*" +sqlparse = ">=0.2.2" + +[package.extras] +argon2 = ["argon2-cffi (>=16.1.0)"] +bcrypt = ["bcrypt"] + +[[package]] +category = "main" +description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." +name = "django-filter" +optional = false +python-versions = ">=3.4" +version = "2.2.0" + +[package.dependencies] +Django = ">=1.11" + +[[package]] +category = "main" +description = "Tweak the form field rendering in templates, not in python-level form definitions." +name = "django-widget-tweaks" +optional = false +python-versions = "*" +version = "1.4.8" + +[[package]] +category = "main" +description = "Web APIs for Django, made easy." +name = "djangorestframework" +optional = false +python-versions = ">=3.5" +version = "3.11.0" + +[package.dependencies] +django = ">=1.11" + +[[package]] +category = "main" +description = "Automated generation of real Swagger/OpenAPI 2.0 schemas from Django Rest Framework code." +name = "drf-yasg" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "1.17.1" + +[package.dependencies] +Django = ">=1.11.7" +coreapi = ">=2.3.3" +coreschema = ">=0.0.4" +djangorestframework = ">=3.8" +inflection = ">=0.3.1" +packaging = "*" +"ruamel.yaml" = ">=0.15.34" +six = ">=1.10.0" +uritemplate = ">=3.0.0" + +[package.extras] +validation = ["swagger-spec-validator (>=2.1.0)"] + +[[package]] +category = "main" +description = "WSGI HTTP Server for UNIX" +name = "gunicorn" +optional = false +python-versions = "*" +version = "19.7.1" + +[[package]] +category = "main" +description = "Internationalized Domain Names in Applications (IDNA)" +name = "idna" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.10" + +[[package]] +category = "main" +description = "Read metadata from Python packages" +name = "importlib-metadata" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +version = "1.3.0" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "rst.linker"] +testing = ["packaging", "importlib-resources"] + +[[package]] +category = "main" +description = "A port of Ruby on Rails inflector to Python" +name = "inflection" +optional = false +python-versions = ">=3.5" +version = "0.5.1" + +[[package]] +category = "main" +description = "IPython: Productive Interactive Computing" +name = "ipython" +optional = false +python-versions = ">=3.6" +version = "7.13.0" + +[package.dependencies] +appnope = "*" +backcall = "*" +colorama = "*" +decorator = "*" +jedi = ">=0.10" +pexpect = "*" +pickleshare = "*" +prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" +pygments = "*" +setuptools = ">=18.5" +traitlets = ">=4.2" + +[package.extras] +all = ["numpy (>=1.14)", "testpath", "notebook", "nose (>=0.10.1)", "nbconvert", "requests", "ipywidgets", "qtconsole", "ipyparallel", "Sphinx (>=1.3)", "pygments", "nbformat", "ipykernel"] +doc = ["Sphinx (>=1.3)"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["notebook", "ipywidgets"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.14)"] + +[[package]] +category = "main" +description = "Vestigial utilities from IPython" +name = "ipython-genutils" +optional = false +python-versions = "*" +version = "0.2.0" + +[[package]] +category = "main" +description = "Simple immutable types for python." +name = "itypes" +optional = false +python-versions = "*" +version = "1.2.0" + +[[package]] +category = "main" +description = "An autocompletion tool for Python that can be used for text editors." +name = "jedi" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.17.0" + +[package.dependencies] +parso = ">=0.7.0" + +[package.extras] +qa = ["flake8 (3.7.9)"] +testing = ["colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] + +[[package]] +category = "main" +description = "A very fast and expressive template engine." +name = "jinja2" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.11.2" + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +category = "main" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +name = "lxml" +optional = false +python-versions = "*" +version = "4.3.3" + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html5 = ["html5lib"] +htmlsoup = ["beautifulsoup4"] +source = ["Cython (>=0.29.1)"] + +[[package]] +category = "main" +description = "Safely add untrusted strings to HTML/XML markup." +name = "markupsafe" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +version = "1.1.1" + +[[package]] +category = "main" +description = "More routines for operating on iterables, beyond itertools" +name = "more-itertools" +optional = false +python-versions = ">=3.5" +version = "8.0.2" + +[[package]] +category = "main" +description = "multidict implementation" +name = "multidict" +optional = false +python-versions = ">=3.5" +version = "4.7.6" + +[[package]] +category = "main" +description = "A \"purl\" aka. Package URL parser and builder" +name = "packageurl-python" +optional = false +python-versions = "*" +version = "0.9.3" + +[[package]] +category = "main" +description = "Core utilities for Python packages" +name = "packaging" +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 = "main" +description = "A Python Parser" +name = "parso" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.7.0" + +[package.extras] +testing = ["docopt", "pytest (>=3.0.7)"] + +[[package]] +category = "main" +description = "Pexpect allows easy control of interactive console applications." +name = "pexpect" +optional = false +python-versions = "*" +version = "4.8.0" + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +category = "main" +description = "Tiny 'shelve'-like database with concurrency support" +name = "pickleshare" +optional = false +python-versions = "*" +version = "0.7.5" + +[[package]] +category = "main" +description = "plugin and hook calling mechanisms for python" +name = "pluggy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.13.1" + +[package.extras] +dev = ["pre-commit", "tox"] + +[[package]] +category = "main" +description = "Library for building powerful interactive command lines in Python" +name = "prompt-toolkit" +optional = false +python-versions = ">=3.6.1" +version = "3.0.5" + +[package.dependencies] +wcwidth = "*" + +[[package]] +category = "main" +description = "psycopg2 - Python-PostgreSQL Database Adapter" +name = "psycopg2" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +version = "2.8.4" + +[[package]] +category = "main" +description = "Run a subprocess in a pseudo terminal" +name = "ptyprocess" +optional = false +python-versions = "*" +version = "0.6.0" + +[[package]] +category = "main" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +name = "py" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.8.0" + +[[package]] +category = "main" +description = "Python style guide checker" +name = "pycodestyle" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.5.0" + +[[package]] +category = "main" +description = "C parser in Python" +name = "pycparser" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.20" + +[[package]] +category = "main" +description = "Python bindings for libgit2." +name = "pygit2" +optional = false +python-versions = "*" +version = "1.2.0" + +[package.dependencies] +cached-property = "*" +cffi = "*" + +[[package]] +category = "main" +description = "Pygments is a syntax highlighting package written in Python." +name = "pygments" +optional = false +python-versions = ">=3.5" +version = "2.6.1" + +[[package]] +category = "main" +description = "Python parsing module" +name = "pyparsing" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "2.4.5" + +[[package]] +category = "main" +description = "pytest: simple powerful testing with Python" +name = "pytest" +optional = false +python-versions = ">=3.5" +version = "5.3.2" + +[package.dependencies] +atomicwrites = ">=1.0" +attrs = ">=17.4.0" +colorama = "*" +more-itertools = ">=4.0.0" +packaging = "*" +pluggy = ">=0.12,<1.0" +py = ">=1.5.0" +wcwidth = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +category = "main" +description = "Manage dependencies of tests" +name = "pytest-dependency" +optional = false +python-versions = "*" +version = "0.4.0" + +[package.dependencies] +pytest = ">=3.6.0" + +[[package]] +category = "main" +description = "A Django plugin for pytest." +name = "pytest-django" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "3.7.0" + +[package.dependencies] +pytest = ">=3.6" + +[package.extras] +docs = ["sphinx", "sphinx-rtd-theme"] +testing = ["django", "django-configurations (>=2.0)", "six"] + +[[package]] +category = "main" +description = "Thin-wrapper around the mock package for easier use with py.test" +name = "pytest-mock" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.13.0" + +[package.dependencies] +pytest = ">=2.7" + +[package.extras] +dev = ["pre-commit", "tox"] + +[[package]] +category = "main" +description = "Extensions to the standard Python datetime module" +name = "python-dateutil" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +version = "2.8.1" + +[package.dependencies] +six = ">=1.5" + +[[package]] +category = "main" +description = "A parser for TOML-0.4.0" +name = "pytoml" +optional = false +python-versions = "*" +version = "0.1.21" + +[[package]] +category = "main" +description = "World timezone definitions, modern and historical" +name = "pytz" +optional = false +python-versions = "*" +version = "2019.3" + +[[package]] +category = "main" +description = "YAML parser and emitter for Python" +name = "pyyaml" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "5.3.1" + +[[package]] +category = "main" +description = "Python HTTP for Humans." +name = "requests" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.23.0" + +[package.dependencies] +certifi = ">=2017.4.17" +chardet = ">=3.0.2,<4" +idna = ">=2.5,<3" +urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" + +[package.extras] +security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] +socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] + +[[package]] +category = "main" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +name = "ruamel.yaml" +optional = false +python-versions = "*" +version = "0.16.12" + +[package.dependencies] +[package.dependencies."ruamel.yaml.clib"] +python = "<3.9" +version = ">=0.1.2" + +[package.extras] +docs = ["ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +category = "main" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +marker = "platform_python_implementation == \"CPython\" and python_version < \"3.9\"" +name = "ruamel.yaml.clib" +optional = false +python-versions = "*" +version = "0.2.2" + +[[package]] +category = "main" +description = "Dump readable YAML and load safely any YAML preserving ordering and avoiding surprises of type conversions. This library is a PyYaml wrapper with sane behaviour to read and write readable YAML safely, typically when used for configuration." +name = "saneyaml" +optional = false +python-versions = "*" +version = "0.4" + +[package.dependencies] +PyYAML = "*" + +[[package]] +category = "main" +description = "Simple data validation library" +name = "schema" +optional = false +python-versions = "*" +version = "0.7.1" + +[package.dependencies] +contextlib2 = "0.5.5" + +[[package]] +category = "main" +description = "Python 2 and 3 compatibility utilities" +name = "six" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*" +version = "1.13.0" + +[[package]] +category = "main" +description = "A modern CSS selector implementation for Beautiful Soup." +name = "soupsieve" +optional = false +python-versions = "*" +version = "1.9.5" + +[[package]] +category = "main" +description = "Non-validating SQL parser" +name = "sqlparse" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.3.0" + +[[package]] +category = "main" +description = "Fast, Extensible Progress Meter" +name = "tqdm" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*" +version = "4.41.1" + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] + +[[package]] +category = "main" +description = "Traitlets Python config system" +name = "traitlets" +optional = false +python-versions = "*" +version = "4.3.3" + +[package.dependencies] +decorator = "*" +ipython-genutils = "*" +six = "*" + +[package.extras] +test = ["pytest", "mock"] + +[[package]] +category = "main" +description = "URI templates" +name = "uritemplate" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "3.0.1" + +[[package]] +category = "main" +description = "HTTP library with thread-safe connection pooling, file post, and more." +name = "urllib3" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +version = "1.25.11" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] +socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] + +[[package]] +category = "main" +description = "Measures number of Terminal column cells of wide-character codes" +name = "wcwidth" +optional = false +python-versions = "*" +version = "0.1.7" + +[[package]] +category = "main" +description = "Radically simplified static file serving for WSGI applications" +name = "whitenoise" +optional = false +python-versions = ">=3.5, <4" +version = "5.0.1" + +[package.extras] +brotli = ["brotli"] + +[[package]] +category = "main" +description = "Yet another URL library" +name = "yarl" +optional = false +python-versions = ">=3.6" +version = "1.6.3" + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +category = "main" +description = "Backport of pathlib-compatible object wrapper for zip files" +name = "zipp" +optional = false +python-versions = ">=2.7" +version = "0.6.0" + +[package.dependencies] +more-itertools = "*" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["pathlib2", "contextlib2", "unittest2"] + +[metadata] +content-hash = "00be403d6025da9c520d68b68d62235d203d77ac262ca6be4db74e5c5a75f505" +lock-version = "1.0" +python-versions = "^3.8" + +[metadata.files] +aiohttp = [ + {file = "aiohttp-3.6.2-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:1e984191d1ec186881ffaed4581092ba04f7c61582a177b187d3a2f07ed9719e"}, + {file = "aiohttp-3.6.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:50aaad128e6ac62e7bf7bd1f0c0a24bc968a0c0590a726d5a955af193544bcec"}, + {file = "aiohttp-3.6.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:65f31b622af739a802ca6fd1a3076fd0ae523f8485c52924a89561ba10c49b48"}, + {file = "aiohttp-3.6.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ae55bac364c405caa23a4f2d6cfecc6a0daada500274ffca4a9230e7129eac59"}, + {file = "aiohttp-3.6.2-cp36-cp36m-win32.whl", hash = "sha256:344c780466b73095a72c616fac5ea9c4665add7fc129f285fbdbca3cccf4612a"}, + {file = "aiohttp-3.6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:4c6efd824d44ae697814a2a85604d8e992b875462c6655da161ff18fd4f29f17"}, + {file = "aiohttp-3.6.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2f4d1a4fdce595c947162333353d4a44952a724fba9ca3205a3df99a33d1307a"}, + {file = "aiohttp-3.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6206a135d072f88da3e71cc501c59d5abffa9d0bb43269a6dcd28d66bfafdbdd"}, + {file = "aiohttp-3.6.2-cp37-cp37m-win32.whl", hash = "sha256:b778ce0c909a2653741cb4b1ac7015b5c130ab9c897611df43ae6a58523cb965"}, + {file = "aiohttp-3.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:32e5f3b7e511aa850829fbe5aa32eb455e5534eaa4b1ce93231d00e2f76e5654"}, + {file = "aiohttp-3.6.2-py3-none-any.whl", hash = "sha256:460bd4237d2dbecc3b5ed57e122992f60188afe46e7319116da5eb8a9dfedba4"}, + {file = "aiohttp-3.6.2.tar.gz", hash = "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326"}, +] +appnope = [ + {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, + {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, +] +asgiref = [ + {file = "asgiref-3.2.7-py2.py3-none-any.whl", hash = "sha256:9ca8b952a0a9afa61d30aa6d3d9b570bb3fd6bafcf7ec9e6bed43b936133db1c"}, + {file = "asgiref-3.2.7.tar.gz", hash = "sha256:8036f90603c54e93521e5777b2b9a39ba1bad05773fcf2d208f0299d1df58ce5"}, +] +async-timeout = [ + {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, + {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, +] +atomicwrites = [ + {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, + {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, +] +attrs = [ + {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, + {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, +] +backcall = [ + {file = "backcall-0.1.0.tar.gz", hash = "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4"}, + {file = "backcall-0.1.0.zip", hash = "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"}, +] +beautifulsoup4 = [ + {file = "beautifulsoup4-4.7.1-py2-none-any.whl", hash = "sha256:ba6d5c59906a85ac23dadfe5c88deaf3e179ef565f4898671253e50a78680718"}, + {file = "beautifulsoup4-4.7.1-py3-none-any.whl", hash = "sha256:034740f6cb549b4e932ae1ab975581e6103ac8f942200a0e9759065984391858"}, + {file = "beautifulsoup4-4.7.1.tar.gz", hash = "sha256:945065979fb8529dd2f37dbb58f00b661bdbcbebf954f93b32fdf5263ef35348"}, +] +cached-property = [ + {file = "cached-property-1.5.1.tar.gz", hash = "sha256:9217a59f14a5682da7c4b8829deadbfc194ac22e9908ccf7c8820234e80a1504"}, + {file = "cached_property-1.5.1-py2.py3-none-any.whl", hash = "sha256:3a026f1a54135677e7da5ce819b0c690f156f37976f3e30c5430740725203d7f"}, +] +certifi = [ + {file = "certifi-2020.11.8-py2.py3-none-any.whl", hash = "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd"}, + {file = "certifi-2020.11.8.tar.gz", hash = "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4"}, +] +cffi = [ + {file = "cffi-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384"}, + {file = "cffi-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30"}, + {file = "cffi-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c"}, + {file = "cffi-1.14.0-cp27-cp27m-win32.whl", hash = "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78"}, + {file = "cffi-1.14.0-cp27-cp27m-win_amd64.whl", hash = "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793"}, + {file = "cffi-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e"}, + {file = "cffi-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a"}, + {file = "cffi-1.14.0-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff"}, + {file = "cffi-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f"}, + {file = "cffi-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa"}, + {file = "cffi-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5"}, + {file = "cffi-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4"}, + {file = "cffi-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d"}, + {file = "cffi-1.14.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc"}, + {file = "cffi-1.14.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac"}, + {file = "cffi-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f"}, + {file = "cffi-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b"}, + {file = "cffi-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3"}, + {file = "cffi-1.14.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66"}, + {file = "cffi-1.14.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0"}, + {file = "cffi-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f"}, + {file = "cffi-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26"}, + {file = "cffi-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd"}, + {file = "cffi-1.14.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55"}, + {file = "cffi-1.14.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2"}, + {file = "cffi-1.14.0-cp38-cp38-win32.whl", hash = "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8"}, + {file = "cffi-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b"}, + {file = "cffi-1.14.0.tar.gz", hash = "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6"}, +] +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.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +contextlib2 = [ + {file = "contextlib2-0.5.5-py2.py3-none-any.whl", hash = "sha256:f5260a6e679d2ff42ec91ec5252f4eeffdcf21053db9113bd0a8e4d953769c00"}, + {file = "contextlib2-0.5.5.tar.gz", hash = "sha256:509f9419ee91cdd00ba34443217d5ca51f5a364a404e1dce9e8979cea969ca48"}, +] +coreapi = [ + {file = "coreapi-2.3.3-py2.py3-none-any.whl", hash = "sha256:bf39d118d6d3e171f10df9ede5666f63ad80bba9a29a8ec17726a66cf52ee6f3"}, + {file = "coreapi-2.3.3.tar.gz", hash = "sha256:46145fcc1f7017c076a2ef684969b641d18a2991051fddec9458ad3f78ffc1cb"}, +] +coreschema = [ + {file = "coreschema-0.0.4-py2-none-any.whl", hash = "sha256:5e6ef7bf38c1525d5e55a895934ab4273548629f16aed5c0a6caa74ebf45551f"}, + {file = "coreschema-0.0.4.tar.gz", hash = "sha256:9503506007d482ab0867ba14724b93c18a33b22b6d19fb419ef2d239dd4a1607"}, +] +decorator = [ + {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, + {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, +] +dephell-specifier = [ + {file = "dephell_specifier-0.2.1-py3-none-any.whl", hash = "sha256:de46325cfd6adedf5f685a3c00242d8a16fe270a7a76948fd1957c99561eb89e"}, + {file = "dephell_specifier-0.2.1.tar.gz", hash = "sha256:c2ec7e62a2406960e19eb6db0f11918d82af64995ee1f26fe00d013791ae9758"}, +] +dj-database-url = [ + {file = "dj-database-url-0.4.2.tar.gz", hash = "sha256:a6832d8445ee9d788c5baa48aef8130bf61fdc442f7d9a548424d25cd85c9f08"}, + {file = "dj_database_url-0.4.2-py2.py3-none-any.whl", hash = "sha256:e16d94c382ea0564c48038fa7fe8d9c890ef1ab1a8ec4cb48e732c124b9482fd"}, +] +django = [ + {file = "Django-3.0.7-py3-none-any.whl", hash = "sha256:e1630333248c9b3d4e38f02093a26f1e07b271ca896d73097457996e0fae12e8"}, + {file = "Django-3.0.7.tar.gz", hash = "sha256:5052b34b34b3425233c682e0e11d658fd6efd587d11335a0203d827224ada8f2"}, +] +django-filter = [ + {file = "django-filter-2.2.0.tar.gz", hash = "sha256:c3deb57f0dd7ff94d7dce52a047516822013e2b441bed472b722a317658cfd14"}, + {file = "django_filter-2.2.0-py3-none-any.whl", hash = "sha256:558c727bce3ffa89c4a7a0b13bc8976745d63e5fd576b3a9a851650ef11c401b"}, +] +django-widget-tweaks = [ + {file = "django-widget-tweaks-1.4.8.tar.gz", hash = "sha256:9f91ca4217199b7671971d3c1f323a2bec71a0c27dec6260b3c006fa541bc489"}, + {file = "django_widget_tweaks-1.4.8-py2.py3-none-any.whl", hash = "sha256:f80bff4a8a59b278bb277a405a76a8b9a884e4bae7a6c70e78a39c626cd1c836"}, +] +djangorestframework = [ + {file = "djangorestframework-3.11.0-py3-none-any.whl", hash = "sha256:05809fc66e1c997fd9a32ea5730d9f4ba28b109b9da71fccfa5ff241201fd0a4"}, + {file = "djangorestframework-3.11.0.tar.gz", hash = "sha256:e782087823c47a26826ee5b6fa0c542968219263fb3976ec3c31edab23a4001f"}, +] +drf-yasg = [ + {file = "drf-yasg-1.17.1.tar.gz", hash = "sha256:5572e9d5baab9f6b49318169df9789f7399d0e3c7bdac8fdb8dfccf1d5d2b1ca"}, + {file = "drf_yasg-1.17.1-py2.py3-none-any.whl", hash = "sha256:7d7af27ad16e18507e9392b2afd6b218fbffc432ec8dbea053099a2241e184ff"}, +] +gunicorn = [ + {file = "gunicorn-19.7.1-py2.py3-none-any.whl", hash = "sha256:75af03c99389535f218cc596c7de74df4763803f7b63eb09d77e92b3956b36c6"}, + {file = "gunicorn-19.7.1.tar.gz", hash = "sha256:eee1169f0ca667be05db3351a0960765620dad53f53434262ff8901b68a1b622"}, +] +idna = [ + {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, + {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, +] +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"}, +] +inflection = [ + {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, + {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, +] +ipython = [ + {file = "ipython-7.13.0-py3-none-any.whl", hash = "sha256:eb8d075de37f678424527b5ef6ea23f7b80240ca031c2dd6de5879d687a65333"}, + {file = "ipython-7.13.0.tar.gz", hash = "sha256:ca478e52ae1f88da0102360e57e528b92f3ae4316aabac80a2cd7f7ab2efb48a"}, +] +ipython-genutils = [ + {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, + {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, +] +itypes = [ + {file = "itypes-1.2.0-py2.py3-none-any.whl", hash = "sha256:03da6872ca89d29aef62773672b2d408f490f80db48b23079a4b194c86dd04c6"}, + {file = "itypes-1.2.0.tar.gz", hash = "sha256:af886f129dea4a2a1e3d36595a2d139589e4dd287f5cab0b40e799ee81570ff1"}, +] +jedi = [ + {file = "jedi-0.17.0-py2.py3-none-any.whl", hash = "sha256:cd60c93b71944d628ccac47df9a60fec53150de53d42dc10a7fc4b5ba6aae798"}, + {file = "jedi-0.17.0.tar.gz", hash = "sha256:df40c97641cb943661d2db4c33c2e1ff75d491189423249e989bcea4464f3030"}, +] +jinja2 = [ + {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, + {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, +] +lxml = [ + {file = "lxml-4.3.3-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:3210da6f36cf4b835ff1be853962b22cc354d506f493b67a4303c88bbb40d57b"}, + {file = "lxml-4.3.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:fdcb57b906dbc1f80666e6290e794ab8fb959a2e17aa5aee1758a85d1da4533f"}, + {file = "lxml-4.3.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:a3080470559938a09a5d0ec558c005282e99ac77bf8211fb7b9a5c66390acd8d"}, + {file = "lxml-4.3.3-cp27-cp27m-win32.whl", hash = "sha256:bdb0593a42070b0a5f138b79b872289ee73c8e25b3f0bea6564e795b55b6bcdd"}, + {file = "lxml-4.3.3-cp27-cp27m-win_amd64.whl", hash = "sha256:b4fbf9b552faff54742bcd0791ab1da5863363fb19047e68f6592be1ac2dab33"}, + {file = "lxml-4.3.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:62f382cddf3d2e52cf266e161aa522d54fd624b8cc567bc18f573d9d50d40e8e"}, + {file = "lxml-4.3.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ad841b78a476623955da270ab8d207c3c694aa5eba71f4792f65926dc46c6ee8"}, + {file = "lxml-4.3.3-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:40f60819fbd5bad6e191ba1329bfafa09ab7f3f174b3d034d413ef5266963294"}, + {file = "lxml-4.3.3-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:f679d93dec7f7210575c85379a31322df4c46496f184ef650d3aba1484b38a2d"}, + {file = "lxml-4.3.3-cp34-cp34m-win32.whl", hash = "sha256:c4e4bca2bb68ce22320297dfa1a7bf070a5b20bcbaec4ee023f83d2f6e76496f"}, + {file = "lxml-4.3.3-cp34-cp34m-win_amd64.whl", hash = "sha256:846a0739e595871041385d86d12af4b6999f921359b38affb99cdd6b54219a8f"}, + {file = "lxml-4.3.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:ff424b01d090ffe1947ec7432b07f536912e0300458f9a7f48ea217dd8362b86"}, + {file = "lxml-4.3.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:43b26a865a61549919f8a42e094dfdb62847113cf776d84bd6b60e4e3fc20ea3"}, + {file = "lxml-4.3.3-cp35-cp35m-win32.whl", hash = "sha256:fd213bb5166e46974f113c8228daaef1732abc47cb561ce9c4c8eaed4bd3b09b"}, + {file = "lxml-4.3.3-cp35-cp35m-win_amd64.whl", hash = "sha256:e83b4b2bf029f5104bc1227dbb7bf5ace6fd8fabaebffcd4f8106fafc69fc45f"}, + {file = "lxml-4.3.3-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:175f3825f075cf02d15099eb52658457cf0ff103dcf11512b5d2583e1d40f58b"}, + {file = "lxml-4.3.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:afdd75d9735e44c639ffd6258ce04a2de3b208f148072c02478162d0944d9da3"}, + {file = "lxml-4.3.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b91cfe4438c741aeff662d413fd2808ac901cc6229c838236840d11de4586d63"}, + {file = "lxml-4.3.3-cp36-cp36m-win32.whl", hash = "sha256:30e14c62d88d1e01a26936ecd1c6e784d4afc9aa002bba4321c5897937112616"}, + {file = "lxml-4.3.3-cp36-cp36m-win_amd64.whl", hash = "sha256:0815b0c9f897468de6a386dc15917a0becf48cc92425613aa8bbfc7f0f82951f"}, + {file = "lxml-4.3.3-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:03984196d00670b2ab14ae0ea83d5cc0cfa4f5a42558afa9ab5fa745995328f5"}, + {file = "lxml-4.3.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cec4ab14af9eae8501be3266ff50c3c2aecc017ba1e86c160209bb4f0423df6a"}, + {file = "lxml-4.3.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e995b3734a46d41ae60b6097f7c51ba9958648c6d1e0935b7e0ee446ee4abe22"}, + {file = "lxml-4.3.3-cp37-cp37m-win32.whl", hash = "sha256:b90c4e32d6ec089d3fa3518436bdf5ce4d902a0787dbd9bb09f37afe8b994317"}, + {file = "lxml-4.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:7b98f0325be8450da70aa4a796c4f06852949fe031878b4aa1d6c417a412f314"}, + {file = "lxml-4.3.3.tar.gz", hash = "sha256:4a03dd682f8e35a10234904e0b9508d705ff98cf962c5851ed052e9340df3d90"}, +] +markupsafe = [ + {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, + {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, + {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, + {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, + {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, + {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, + {file = "MarkupSafe-1.1.1-cp37-cp37m-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"}, +] +more-itertools = [ + {file = "more-itertools-8.0.2.tar.gz", hash = "sha256:b84b238cce0d9adad5ed87e745778d20a3f8487d0f0cb8b8a586816c7496458d"}, + {file = "more_itertools-8.0.2-py3-none-any.whl", hash = "sha256:c833ef592a0324bcc6a60e48440da07645063c453880c9477ceb22490aec1564"}, +] +multidict = [ + {file = "multidict-4.7.6-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:275ca32383bc5d1894b6975bb4ca6a7ff16ab76fa622967625baeebcf8079000"}, + {file = "multidict-4.7.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1ece5a3369835c20ed57adadc663400b5525904e53bae59ec854a5d36b39b21a"}, + {file = "multidict-4.7.6-cp35-cp35m-win32.whl", hash = "sha256:5141c13374e6b25fe6bf092052ab55c0c03d21bd66c94a0e3ae371d3e4d865a5"}, + {file = "multidict-4.7.6-cp35-cp35m-win_amd64.whl", hash = "sha256:9456e90649005ad40558f4cf51dbb842e32807df75146c6d940b6f5abb4a78f3"}, + {file = "multidict-4.7.6-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:e0d072ae0f2a179c375f67e3da300b47e1a83293c554450b29c900e50afaae87"}, + {file = "multidict-4.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3750f2205b800aac4bb03b5ae48025a64e474d2c6cc79547988ba1d4122a09e2"}, + {file = "multidict-4.7.6-cp36-cp36m-win32.whl", hash = "sha256:f07acae137b71af3bb548bd8da720956a3bc9f9a0b87733e0899226a2317aeb7"}, + {file = "multidict-4.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:6513728873f4326999429a8b00fc7ceddb2509b01d5fd3f3be7881a257b8d463"}, + {file = "multidict-4.7.6-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:feed85993dbdb1dbc29102f50bca65bdc68f2c0c8d352468c25b54874f23c39d"}, + {file = "multidict-4.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fcfbb44c59af3f8ea984de67ec7c306f618a3ec771c2843804069917a8f2e255"}, + {file = "multidict-4.7.6-cp37-cp37m-win32.whl", hash = "sha256:4538273208e7294b2659b1602490f4ed3ab1c8cf9dbdd817e0e9db8e64be2507"}, + {file = "multidict-4.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d14842362ed4cf63751648e7672f7174c9818459d169231d03c56e84daf90b7c"}, + {file = "multidict-4.7.6-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:c026fe9a05130e44157b98fea3ab12969e5b60691a276150db9eda71710cd10b"}, + {file = "multidict-4.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:51a4d210404ac61d32dada00a50ea7ba412e6ea945bbe992e4d7a595276d2ec7"}, + {file = "multidict-4.7.6-cp38-cp38-win32.whl", hash = "sha256:5cf311a0f5ef80fe73e4f4c0f0998ec08f954a6ec72b746f3c179e37de1d210d"}, + {file = "multidict-4.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:7388d2ef3c55a8ba80da62ecfafa06a1c097c18032a501ffd4cabbc52d7f2b19"}, + {file = "multidict-4.7.6.tar.gz", hash = "sha256:fbb77a75e529021e7c4a8d4e823d88ef4d23674a202be4f5addffc72cbb91430"}, +] +packageurl-python = [ + {file = "packageurl-python-0.9.3.tar.gz", hash = "sha256:c54add03a464d4779ee50350231aabb971751bbf52389acbcd0149e2ea7122aa"}, + {file = "packageurl_python-0.9.3-py2.py3-none-any.whl", hash = "sha256:0682b2eddab16151da5bd4ef38081e9b27f8eb33cd29baf41f4996d4e88e6e70"}, +] +packaging = [ + {file = "packaging-19.2-py2.py3-none-any.whl", hash = "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108"}, + {file = "packaging-19.2.tar.gz", hash = "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47"}, +] +parso = [ + {file = "parso-0.7.0-py2.py3-none-any.whl", hash = "sha256:158c140fc04112dc45bca311633ae5033c2c2a7b732fa33d0955bad8152a8dd0"}, + {file = "parso-0.7.0.tar.gz", hash = "sha256:908e9fae2144a076d72ae4e25539143d40b8e3eafbaeae03c1bfe226f4cdf12c"}, +] +pexpect = [ + {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"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] +pluggy = [ + {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, + {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, +] +prompt-toolkit = [ + {file = "prompt_toolkit-3.0.5-py3-none-any.whl", hash = "sha256:df7e9e63aea609b1da3a65641ceaf5bc7d05e0a04de5bd45d05dbeffbabf9e04"}, + {file = "prompt_toolkit-3.0.5.tar.gz", hash = "sha256:563d1a4140b63ff9dd587bda9557cffb2fe73650205ab6f4383092fb882e7dc8"}, +] +psycopg2 = [ + {file = "psycopg2-2.8.4-cp27-cp27m-win32.whl", hash = "sha256:72772181d9bad1fa349792a1e7384dde56742c14af2b9986013eb94a240f005b"}, + {file = "psycopg2-2.8.4-cp27-cp27m-win_amd64.whl", hash = "sha256:893c11064b347b24ecdd277a094413e1954f8a4e8cdaf7ffbe7ca3db87c103f0"}, + {file = "psycopg2-2.8.4-cp34-cp34m-win32.whl", hash = "sha256:9ab75e0b2820880ae24b7136c4d230383e07db014456a476d096591172569c38"}, + {file = "psycopg2-2.8.4-cp34-cp34m-win_amd64.whl", hash = "sha256:b0845e3bdd4aa18dc2f9b6fb78fbd3d9d371ad167fd6d1b7ad01c0a6cdad4fc6"}, + {file = "psycopg2-2.8.4-cp35-cp35m-win32.whl", hash = "sha256:ef6df7e14698e79c59c7ee7cf94cd62e5b869db369ed4b1b8f7b729ea825712a"}, + {file = "psycopg2-2.8.4-cp35-cp35m-win_amd64.whl", hash = "sha256:965c4c93e33e6984d8031f74e51227bd755376a9df6993774fd5b6fb3288b1f4"}, + {file = "psycopg2-2.8.4-cp36-cp36m-win32.whl", hash = "sha256:ed686e5926929887e2c7ae0a700e32c6129abb798b4ad2b846e933de21508151"}, + {file = "psycopg2-2.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:dca2d7203f0dfce8ea4b3efd668f8ea65cd2b35112638e488a4c12594015f67b"}, + {file = "psycopg2-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:8396be6e5ff844282d4d49b81631772f80dabae5658d432202faf101f5283b7c"}, + {file = "psycopg2-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:47fc642bf6f427805daf52d6e52619fe0637648fe27017062d898f3bf891419d"}, + {file = "psycopg2-2.8.4-cp38-cp38-win32.whl", hash = "sha256:4212ca404c4445dc5746c0d68db27d2cbfb87b523fe233dc84ecd24062e35677"}, + {file = "psycopg2-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:92a07dfd4d7c325dd177548c4134052d4842222833576c8391aab6f74038fc3f"}, + {file = "psycopg2-2.8.4.tar.gz", hash = "sha256:f898e5cc0a662a9e12bde6f931263a1bbd350cfb18e1d5336a12927851825bb6"}, +] +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.0-py2.py3-none-any.whl", hash = "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa"}, + {file = "py-1.8.0.tar.gz", hash = "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53"}, +] +pycodestyle = [ + {file = "pycodestyle-2.5.0-py2.py3-none-any.whl", hash = "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56"}, + {file = "pycodestyle-2.5.0.tar.gz", hash = "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"}, +] +pycparser = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] +pygit2 = [ + {file = "pygit2-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:997430ffbf3a327c3608ae6b0c18c714b3334bfb6e88d850746f37ccd29c61ab"}, + {file = "pygit2-1.2.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:ed13fd6945b7508f1763d5d170dedbc7001601afed606f989d778019c2a198f6"}, + {file = "pygit2-1.2.0-cp36-cp36m-win32.whl", hash = "sha256:10c7b5ff733d75f198233012fe33570d8f9bec2dd73079edfd42a892a8322629"}, + {file = "pygit2-1.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:55965517b2775d34878d87ab2e66edbd3a3a9ff5fc9181e342e40511d5bea63f"}, + {file = "pygit2-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:32b210da98c7e37800db5b2d4b9217ba933e3f58b34a8894bea02ed12601bccf"}, + {file = "pygit2-1.2.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a65dbe2485f7d888d46a70f192e7e7ab0a0d4623c8c2974dbbf98da235338e48"}, + {file = "pygit2-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:c7484d277319a347aa44dd0363320d34059716a7b95b4609c40572188229405e"}, + {file = "pygit2-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1fc1afe2acd06811416adc67942259eaa903f86a2f631d92d7fa5b0e9ad36a0c"}, + {file = "pygit2-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8688eab31cdd773236dd594712072fa20f9f6e3766e2f016c9a580149c2cd82"}, + {file = "pygit2-1.2.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5916e8ce38cfc30fb1798c29ed8ffa87317a4125096e5008d78951e3a8f907ee"}, + {file = "pygit2-1.2.0-cp38-cp38-win32.whl", hash = "sha256:12cc53e7d812404e6121840216885e23dbcf4577c1f0929b5660b12b4f35312c"}, + {file = "pygit2-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:ab07a81b5411be041784ca6334fb4467a76c4c272d53abe33178651e5dbbc015"}, + {file = "pygit2-1.2.0.tar.gz", hash = "sha256:f991347f5b11589ac8dc5a3c8257a514cf802545b75c11133a43ae9f76388278"}, +] +pygments = [ + {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, + {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, +] +pyparsing = [ + {file = "pyparsing-2.4.5-py2.py3-none-any.whl", hash = "sha256:20f995ecd72f2a1f4bf6b072b63b22e2eb457836601e76d6e5dfcd75436acc1f"}, + {file = "pyparsing-2.4.5.tar.gz", hash = "sha256:4ca62001be367f01bd3e92ecbb79070272a9d4964dce6a48a82ff0b8bc7e683a"}, +] +pytest = [ + {file = "pytest-5.3.2-py3-none-any.whl", hash = "sha256:e41d489ff43948babd0fad7ad5e49b8735d5d55e26628a58673c39ff61d95de4"}, + {file = "pytest-5.3.2.tar.gz", hash = "sha256:6b571215b5a790f9b41f19f3531c53a45cf6bb8ef2988bc1ff9afb38270b25fa"}, +] +pytest-dependency = [ + {file = "pytest-dependency-0.4.0.tar.gz", hash = "sha256:bda0ef48e6a44c091399b12ab4a7e580d2dd8294c222b301f88d7d57f47ba142"}, +] +pytest-django = [ + {file = "pytest-django-3.7.0.tar.gz", hash = "sha256:17592f06d51c2ef4b7a0fb24aa32c8b6998506a03c8439606cb96db160106659"}, + {file = "pytest_django-3.7.0-py2.py3-none-any.whl", hash = "sha256:ef3d15b35ed7e46293475e6f282e71a53bcd8c6f87bdc5d5e7ad0f4d49352127"}, +] +pytest-mock = [ + {file = "pytest-mock-1.13.0.tar.gz", hash = "sha256:e24a911ec96773022ebcc7030059b57cd3480b56d4f5d19b7c370ec635e6aed5"}, + {file = "pytest_mock-1.13.0-py2.py3-none-any.whl", hash = "sha256:67e414b3caef7bff6fc6bd83b22b5bc39147e4493f483c2679bc9d4dc485a94d"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, + {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, +] +pytoml = [ + {file = "pytoml-0.1.21-py2.py3-none-any.whl", hash = "sha256:57a21e6347049f73bfb62011ff34cd72774c031b9828cb628a752225136dfc33"}, + {file = "pytoml-0.1.21.tar.gz", hash = "sha256:8eecf7c8d0adcff3b375b09fe403407aa9b645c499e5ab8cac670ac4a35f61e7"}, +] +pytz = [ + {file = "pytz-2019.3-py2.py3-none-any.whl", hash = "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d"}, + {file = "pytz-2019.3.tar.gz", hash = "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"}, +] +pyyaml = [ + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, + {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, +] +requests = [ + {file = "requests-2.23.0-py2.7.egg", hash = "sha256:5d2d0ffbb515f39417009a46c14256291061ac01ba8f875b90cad137de83beb4"}, + {file = "requests-2.23.0-py2.py3-none-any.whl", hash = "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee"}, + {file = "requests-2.23.0.tar.gz", hash = "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"}, +] +"ruamel.yaml" = [ + {file = "ruamel.yaml-0.16.12-py2.py3-none-any.whl", hash = "sha256:012b9470a0ea06e4e44e99e7920277edf6b46eee0232a04487ea73a7386340a5"}, + {file = "ruamel.yaml-0.16.12.tar.gz", hash = "sha256:076cc0bc34f1966d920a49f18b52b6ad559fbe656a0748e3535cf7b3f29ebf9e"}, +] +"ruamel.yaml.clib" = [ + {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:28116f204103cb3a108dfd37668f20abe6e3cafd0d3fd40dba126c732457b3cc"}, + {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:daf21aa33ee9b351f66deed30a3d450ab55c14242cfdfcd377798e2c0d25c9f1"}, + {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win32.whl", hash = "sha256:30dca9bbcbb1cc858717438218d11eafb78666759e5094dd767468c0d577a7e7"}, + {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win_amd64.whl", hash = "sha256:f6061a31880c1ed6b6ce341215336e2f3d0c1deccd84957b6fa8ca474b41e89f"}, + {file = "ruamel.yaml.clib-0.2.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:73b3d43e04cc4b228fa6fa5d796409ece6fcb53a6c270eb2048109cbcbc3b9c2"}, + {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:53b9dd1abd70e257a6e32f934ebc482dac5edb8c93e23deb663eac724c30b026"}, + {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:839dd72545ef7ba78fd2aa1a5dd07b33696adf3e68fae7f31327161c1093001b"}, + {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win32.whl", hash = "sha256:b1e981fe1aff1fd11627f531524826a4dcc1f26c726235a52fcb62ded27d150f"}, + {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4e52c96ca66de04be42ea2278012a2342d89f5e82b4512fb6fb7134e377e2e62"}, + {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a873e4d4954f865dcb60bdc4914af7eaae48fb56b60ed6daa1d6251c72f5337c"}, + {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ab845f1f51f7eb750a78937be9f79baea4a42c7960f5a94dde34e69f3cce1988"}, + {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win32.whl", hash = "sha256:e9f7d1d8c26a6a12c23421061f9022bb62704e38211fe375c645485f38df34a2"}, + {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2602e91bd5c1b874d6f93d3086f9830f3e907c543c7672cf293a97c3fabdcd91"}, + {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44c7b0498c39f27795224438f1a6be6c5352f82cb887bc33d962c3a3acc00df6"}, + {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8e8fd0a22c9d92af3a34f91e8a2594eeb35cba90ab643c5e0e643567dc8be43e"}, + {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win32.whl", hash = "sha256:464e66a04e740d754170be5e740657a3b3b6d2bcc567f0c3437879a6e6087ff6"}, + {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:52ae5739e4b5d6317b52f5b040b1b6639e8af68a5b8fd606a8b08658fbd0cab5"}, + {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df5019e7783d14b79217ad9c56edf1ba7485d614ad5a385d1b3c768635c81c0"}, + {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5254af7d8bdf4d5484c089f929cb7f5bafa59b4f01d4f48adda4be41e6d29f99"}, + {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win32.whl", hash = "sha256:74161d827407f4db9072011adcfb825b5258a5ccb3d2cd518dd6c9edea9e30f1"}, + {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:058a1cc3df2a8aecc12f983a48bda99315cebf55a3b3a5463e37bb599b05727b"}, + {file = "ruamel.yaml.clib-0.2.2.tar.gz", hash = "sha256:2d24bd98af676f4990c4d715bcdc2a60b19c56a3fb3a763164d2d8ca0e806ba7"}, +] +saneyaml = [ + {file = "saneyaml-0.4-py2.py3-none-any.whl", hash = "sha256:f0d5bdd51649f3253ca8c2d9e48c78540c39d9d035810a2cd4406dbeffd8da11"}, + {file = "saneyaml-0.4.tar.gz", hash = "sha256:9a1863a9d27586fd86c30b9736478a7d441bf1d118cdc71a2fec0d94cfc3cf5c"}, +] +schema = [ + {file = "schema-0.7.1-py2.py3-none-any.whl", hash = "sha256:10b550886f5ff402e1fdef85bd7be761b0e09a35a43633311807a57a5bc4db50"}, + {file = "schema-0.7.1.tar.gz", hash = "sha256:c9dc8f4624e287c7d1435f8fd758f6a0aabbb7eff442db9192cd46f0e2b6d959"}, +] +six = [ + {file = "six-1.13.0-py2.py3-none-any.whl", hash = "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd"}, + {file = "six-1.13.0.tar.gz", hash = "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"}, +] +soupsieve = [ + {file = "soupsieve-1.9.5-py2.py3-none-any.whl", hash = "sha256:bdb0d917b03a1369ce964056fc195cfdff8819c40de04695a80bc813c3cfa1f5"}, + {file = "soupsieve-1.9.5.tar.gz", hash = "sha256:e2c1c5dee4a1c36bcb790e0fabd5492d874b8ebd4617622c4f6a731701060dda"}, +] +sqlparse = [ + {file = "sqlparse-0.3.0-py2.py3-none-any.whl", hash = "sha256:40afe6b8d4b1117e7dff5504d7a8ce07d9a1b15aeeade8a2d10f130a834f8177"}, + {file = "sqlparse-0.3.0.tar.gz", hash = "sha256:7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873"}, +] +tqdm = [ + {file = "tqdm-4.41.1-py2.py3-none-any.whl", hash = "sha256:efab950cf7cc1e4d8ee50b2bb9c8e4a89f8307b49e0b2c9cfef3ec4ca26655eb"}, + {file = "tqdm-4.41.1.tar.gz", hash = "sha256:4789ccbb6fc122b5a6a85d512e4e41fc5acad77216533a6f2b8ce51e0f265c23"}, +] +traitlets = [ + {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, + {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, +] +uritemplate = [ + {file = "uritemplate-3.0.1-py2.py3-none-any.whl", hash = "sha256:07620c3f3f8eed1f12600845892b0e036a2420acf513c53f7de0abd911a5894f"}, + {file = "uritemplate-3.0.1.tar.gz", hash = "sha256:5af8ad10cec94f215e3f48112de2022e1d5a37ed427fbd88652fa908f2ab7cae"}, +] +urllib3 = [ + {file = "urllib3-1.25.11-py2.py3-none-any.whl", hash = "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e"}, + {file = "urllib3-1.25.11.tar.gz", hash = "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2"}, +] +wcwidth = [ + {file = "wcwidth-0.1.7-py2.py3-none-any.whl", hash = "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"}, + {file = "wcwidth-0.1.7.tar.gz", hash = "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e"}, +] +whitenoise = [ + {file = "whitenoise-5.0.1-py2.py3-none-any.whl", hash = "sha256:62556265ec1011bd87113fb81b7516f52688887b7a010ee899ff1fd18fd22700"}, + {file = "whitenoise-5.0.1.tar.gz", hash = "sha256:0f9137f74bd95fa54329ace88d8dc695fbe895369a632e35f7a136e003e41d73"}, +] +yarl = [ + {file = "yarl-1.6.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76"}, + {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366"}, + {file = "yarl-1.6.3-cp36-cp36m-win32.whl", hash = "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721"}, + {file = "yarl-1.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643"}, + {file = "yarl-1.6.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f"}, + {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970"}, + {file = "yarl-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e"}, + {file = "yarl-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50"}, + {file = "yarl-1.6.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2"}, + {file = "yarl-1.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2"}, + {file = "yarl-1.6.3-cp38-cp38-win32.whl", hash = "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896"}, + {file = "yarl-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a"}, + {file = "yarl-1.6.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0"}, + {file = "yarl-1.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4"}, + {file = "yarl-1.6.3-cp39-cp39-win32.whl", hash = "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424"}, + {file = "yarl-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6"}, + {file = "yarl-1.6.3.tar.gz", hash = "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10"}, +] +zipp = [ + {file = "zipp-0.6.0-py2.py3-none-any.whl", hash = "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335"}, + {file = "zipp-0.6.0.tar.gz", hash = "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e"}, +] diff --git a/etc/nix/pyproject.toml.autogenerated b/etc/nix/pyproject.toml.autogenerated new file mode 100644 index 000000000..770f3888b --- /dev/null +++ b/etc/nix/pyproject.toml.autogenerated @@ -0,0 +1,72 @@ +[tool.poetry] +name = "vulnerablecode" +version = "20.10" +description = "Software package vulnerabilities database." +authors = ["nexB Inc. and others "] +license = "Apache-2.0" + +[tool.poetry.dependencies] +python = "^3.8" +aiohttp = "==3.6.2" +asgiref = "==3.2.7" +attrs = "==19.3.0" +backcall = "==0.1.0" +beautifulsoup4 = "==4.7.1" +cached-property = "==1.5.1" +cffi = "==1.14.0" +contextlib2 = "==0.5.5" +decorator = "==4.4.2" +dephell-specifier = "==0.2.1" +dj-database-url = "==0.4.2" +Django = "==3.0.7" +django-filter = "==2.2.0" +djangorestframework = "==3.11.0" +django-widget-tweaks = "==1.4.8" +drf-yasg = "==1.17.1" +gunicorn = "==19.7.1" +importlib-metadata = "==1.3.0" +ipython = "==7.13.0" +ipython-genutils = "==0.2.0" +jedi = "==0.17.0" +lxml = "==4.3.3" +more-itertools = "==8.0.2" +packageurl-python = "==0.9.3" +packaging = "==19.2" +parso = "==0.7.0" +pexpect = "==4.8.0" +pickleshare = "==0.7.5" +pluggy = "==0.13.1" +prompt-toolkit = "==3.0.5" +psycopg2 = "==2.8.4" +ptyprocess = "==0.6.0" +py = "==1.8.0" +pycodestyle = "==2.5.0" +pycparser = "==2.20" +pygit2 = "==1.2.0" +Pygments = "==2.6.1" +pyparsing = "==2.4.5" +pytest = "==5.3.2" +pytest-dependency = "==0.4.0" +pytest-django = "==3.7.0" +pytest-mock = "==1.13.0" +python-dateutil = "==2.8.1" +pytoml = "==0.1.21" +pytz = "==2019.3" +PyYAML = "==5.3.1" +saneyaml = "==0.4" +schema = "==0.7.1" +six = "==1.13.0" +soupsieve = "==1.9.5" +sqlparse = "==0.3.0" +tqdm = "==4.41.1" +traitlets = "==4.3.3" +wcwidth = "==0.1.7" +whitenoise = "==5.0.1" +zipp = "==0.6.0" +requests = "==2.23.0" + +[tool.poetry.dev-dependencies] + +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" From beecbf48ecc865095f053dbf0179acf5d20ac560 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Wed, 2 Dec 2020 21:03:15 +0100 Subject: [PATCH 12/21] s/autogenerated/generated/g MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- etc/nix/flake.nix | 4 ++-- ...ke-poetry-conversion-patch.sh => generate-poetry-files.sh} | 2 +- etc/nix/{poetry.lock.autogenerated => poetry.lock.generated} | 0 ...{pyproject.toml.autogenerated => pyproject.toml.generated} | 0 4 files changed, 3 insertions(+), 3 deletions(-) rename etc/nix/{make-poetry-conversion-patch.sh => generate-poetry-files.sh} (97%) rename etc/nix/{poetry.lock.autogenerated => poetry.lock.generated} (100%) rename etc/nix/{pyproject.toml.autogenerated => pyproject.toml.generated} (100%) diff --git a/etc/nix/flake.nix b/etc/nix/flake.nix index 7983cd23e..0e122db99 100644 --- a/etc/nix/flake.nix +++ b/etc/nix/flake.nix @@ -57,8 +57,8 @@ mkdir $out cd $out - cp ${vulnerablecode-src}/etc/nix/{pyproject.toml,poetry.lock}.autogenerated . - rename 's/.autogenerated$//' *.autogenerated + cp ${vulnerablecode-src}/etc/nix/{pyproject.toml,poetry.lock}.generated . + rename 's/.generated$//' *.generated ''; vulnerablecode = poetry2nix.mkPoetryApplication rec { diff --git a/etc/nix/make-poetry-conversion-patch.sh b/etc/nix/generate-poetry-files.sh similarity index 97% rename from etc/nix/make-poetry-conversion-patch.sh rename to etc/nix/generate-poetry-files.sh index 21132ada0..87bac16e6 100755 --- a/etc/nix/make-poetry-conversion-patch.sh +++ b/etc/nix/generate-poetry-files.sh @@ -64,4 +64,4 @@ EOF perl -pe 's/([<=>]+)/:$1/' "$REQUIREMENTS_TXT" | tr '\n' ' ' | xargs -t -I {} bash -c "poetry add {}" # Rename the mock project files. -rename -f 's/$/.autogenerated/' "${POETRY_FILES[@]}" +rename -f 's/$/.generated/' "${POETRY_FILES[@]}" diff --git a/etc/nix/poetry.lock.autogenerated b/etc/nix/poetry.lock.generated similarity index 100% rename from etc/nix/poetry.lock.autogenerated rename to etc/nix/poetry.lock.generated diff --git a/etc/nix/pyproject.toml.autogenerated b/etc/nix/pyproject.toml.generated similarity index 100% rename from etc/nix/pyproject.toml.autogenerated rename to etc/nix/pyproject.toml.generated From a3d833e65a716f3496a86b44ad48fe4fbc521f17 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Wed, 2 Dec 2020 21:12:36 +0100 Subject: [PATCH 13/21] Add .github/workflows/test-import-using-nix.yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- .github/workflows/test-import-using-nix.yml | 27 +++++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 .github/workflows/test-import-using-nix.yml diff --git a/.github/workflows/test-import-using-nix.yml b/.github/workflows/test-import-using-nix.yml new file mode 100644 index 000000000..59945dafa --- /dev/null +++ b/.github/workflows/test-import-using-nix.yml @@ -0,0 +1,27 @@ +on: + workflow_dispatch: # allow manual execution + push: + pull_request: + schedule: + # run on the 3rd each month at 10:00am + - cron: '0 10 3 * *' + +jobs: + nix-check-and-import: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - uses: cachix/install-nix-action@v11 + with: + nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/20.09.tar.gz + install_url: https://github.com/numtide/nix-flakes-installer/releases/download/nix-3.0pre20201007_5257a25/install + extra_nix_config: | + experimental-features = nix-command flakes + - name: run checks + run: | + cd etc/nix + nix --print-build-logs flake check + ./test-import-using-nix.sh --all From 39430e7f6e2dca3e642ce0f3ef24b24f315b845e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Wed, 2 Dec 2020 21:18:22 +0100 Subject: [PATCH 14/21] Fix workflow. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- .github/workflows/test-import-using-nix.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-import-using-nix.yml b/.github/workflows/test-import-using-nix.yml index 59945dafa..3066281f3 100644 --- a/.github/workflows/test-import-using-nix.yml +++ b/.github/workflows/test-import-using-nix.yml @@ -15,12 +15,14 @@ jobs: with: fetch-depth: 0 - uses: cachix/install-nix-action@v11 + env: + ACTIONS_ALLOW_UNSECURE_COMMANDS: true with: nix_path: nixpkgs=https://github.com/NixOS/nixpkgs/archive/20.09.tar.gz install_url: https://github.com/numtide/nix-flakes-installer/releases/download/nix-3.0pre20201007_5257a25/install extra_nix_config: | experimental-features = nix-command flakes - - name: run checks + - name: run checks & test import run: | cd etc/nix nix --print-build-logs flake check From 1ff3dfd067b5089d84355bd17ed3f1bbd47628f1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Wed, 2 Dec 2020 21:47:28 +0100 Subject: [PATCH 15/21] Update docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- README.rst | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.rst b/README.rst index b496d9950..e8af56027 100644 --- a/README.rst +++ b/README.rst @@ -139,6 +139,7 @@ You can install VulnerableCode with `Nix `__ (` :: + cd etc/nix nix --print-build-logs flake check # build & run tests There are several options to use the Nix version @@ -146,6 +147,7 @@ There are several options to use the Nix version :: # Enter an interactive environment with all dependencies setup. + cd etc/nix nix develop > ./manage.py ... # invoke the local checkout > vulnerablecode-manage.py ... # invoke manage.py as installed in the nix store @@ -159,16 +161,15 @@ There are several options to use the Nix version **Keeping the Nix setup in sync** The Nix installation uses `poetry2nix `__ to handle Python dependencies because some dependencies are currently not available as Nix packages. -The file ``./poetry-conversion.patch`` allows to convert VulnerableCode into a `Poetry `__ project. -This is done on the fly during the Nix installation. -The patch file itself is created by ``./make-poetry-conversion-patch.sh``. -It needs to be recreated whenever ``./requirements.txt`` changes (this is not done automatically). -The ``expectedRequirementstxtMd5sum`` in ``flake.nix`` also needs to be updated in that case. +The are some ``*.generated`` files in ``etc/nix`` that are created/updated using ``etc/nix/generate-poetry-files.sh``. +These files need to be recreated whenever ``./requirements.txt`` changes. +The ``expectedRequirementstxtMd5sum`` in ``etc/nix/flake.nix`` also needs to be updated in that case. +The Nix installation uses the files to convert VulnerableCode into a `Poetry `__ project on the fly. :: # Update poetry-conversion.patch. - nix-shell -p poetry --run ./make-poetry-conversion-patch.sh + etc/nix/generate-poetry-files.sh # Get new hash. See flake.nix. md5sum requirements.txt From a584ac47f1f581aabf7fa35a435236a945ee3e50 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Thu, 3 Dec 2020 22:48:45 +0100 Subject: [PATCH 16/21] Do not import --all but only alpine for github workflow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- .github/workflows/test-import-using-nix.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test-import-using-nix.yml b/.github/workflows/test-import-using-nix.yml index 3066281f3..09e57dc05 100644 --- a/.github/workflows/test-import-using-nix.yml +++ b/.github/workflows/test-import-using-nix.yml @@ -26,4 +26,4 @@ jobs: run: | cd etc/nix nix --print-build-logs flake check - ./test-import-using-nix.sh --all + ./test-import-using-nix.sh alpine From ae96dcc44cceb9401545289a4d819fda3ca5c8e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Sat, 12 Dec 2020 07:13:40 +0100 Subject: [PATCH 17/21] Use mach-nix instead of poetry2nix. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- README.rst | 21 +- etc/nix/default.nix | 4 + etc/nix/flake.lock | 71 +- etc/nix/flake.nix | 135 ++- etc/nix/generate-poetry-files.sh | 67 -- etc/nix/lib.sh | 18 + etc/nix/poetry.lock.generated | 1342 ------------------------------ etc/nix/pyproject.toml.generated | 72 -- etc/nix/test-import-using-nix.sh | 16 +- 9 files changed, 163 insertions(+), 1583 deletions(-) create mode 100644 etc/nix/default.nix delete mode 100755 etc/nix/generate-poetry-files.sh create mode 100644 etc/nix/lib.sh delete mode 100644 etc/nix/poetry.lock.generated delete mode 100644 etc/nix/pyproject.toml.generated diff --git a/README.rst b/README.rst index e8af56027..ca8c00c02 100644 --- a/README.rst +++ b/README.rst @@ -149,29 +149,20 @@ There are several options to use the Nix version # Enter an interactive environment with all dependencies setup. cd etc/nix nix develop - > ./manage.py ... # invoke the local checkout + > ../../manage.py ... # invoke the local checkout > vulnerablecode-manage.py ... # invoke manage.py as installed in the nix store # Test the import prodecure using the Nix version. - ./test-import-using-nix.sh --all # import everything + etc/nix/test-import-using-nix.sh --all # import everything # Test the import using the local checkout. - INSTALL_DIR=. ./test-import-using-nix.sh ruby # import ruby only + INSTALL_DIR=. etc/nix/test-import-using-nix.sh ruby # import ruby only **Keeping the Nix setup in sync** -The Nix installation uses `poetry2nix `__ to handle Python dependencies because some dependencies are currently not available as Nix packages. -The are some ``*.generated`` files in ``etc/nix`` that are created/updated using ``etc/nix/generate-poetry-files.sh``. -These files need to be recreated whenever ``./requirements.txt`` changes. -The ``expectedRequirementstxtMd5sum`` in ``etc/nix/flake.nix`` also needs to be updated in that case. -The Nix installation uses the files to convert VulnerableCode into a `Poetry `__ project on the fly. - -:: - - # Update poetry-conversion.patch. - etc/nix/generate-poetry-files.sh - # Get new hash. See flake.nix. - md5sum requirements.txt +The Nix installation uses `mach-nix `__ to handle Python dependencies because some dependencies are currently not available as Nix packages. +All Python dependencies are automatically fetched from ``./requirements.txt``. +Non-Python dependencies are curated in ``etc/nix/flake.nix:Vulnerablecode.propagatedBuildInputs``. Tests diff --git a/etc/nix/default.nix b/etc/nix/default.nix new file mode 100644 index 000000000..b3f68195c --- /dev/null +++ b/etc/nix/default.nix @@ -0,0 +1,4 @@ +(import (fetchTarball + "https://github.com/edolstra/flake-compat/archive/master.tar.gz") { + src = ./.; + }).defaultNix diff --git a/etc/nix/flake.lock b/etc/nix/flake.lock index 27a4cf9cd..a91de1df5 100644 --- a/etc/nix/flake.lock +++ b/etc/nix/flake.lock @@ -1,6 +1,58 @@ { "nodes": { + "flake-utils": { + "locked": { + "lastModified": 1601282935, + "narHash": "sha256-WQAFV6sGGQxrRs3a+/Yj9xUYvhTpukQJIcMbIi7LCJ4=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "588973065fce51f4763287f0fda87a174d78bf48", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, + "machnix": { + "inputs": { + "flake-utils": "flake-utils", + "nixpkgs": "nixpkgs", + "pypi-deps-db": "pypi-deps-db" + }, + "locked": { + "lastModified": 1606460537, + "narHash": "sha256-gcKjBA1fpCzh0nGoaxurIjIJanPDrAea6NK60M+vfRk=", + "owner": "DavHau", + "repo": "mach-nix", + "rev": "1ec92303acd142aa1a3b60bb97745544cf049312", + "type": "github" + }, + "original": { + "owner": "DavHau", + "ref": "3.1.1", + "repo": "mach-nix", + "type": "github" + } + }, "nixpkgs": { + "locked": { + "lastModified": 1605988311, + "narHash": "sha256-PA+kgq46NApOAJlmBNJHs5DwsIrY+jodM0e4g7VtXyY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "2247d824fe07f16325596acc7faa286502faffd1", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs_2": { "locked": { "lastModified": 1603791972, "narHash": "sha256-nj2SvACFH+NERpye1kudcuygCcvnsZYv26M2+wgM5vE=", @@ -16,9 +68,26 @@ "type": "github" } }, + "pypi-deps-db": { + "flake": false, + "locked": { + "lastModified": 1606280641, + "narHash": "sha256-sVYIBMtvZgxQQkbxZg/45xw4e7vVh+5SU1kkvUvtnrc=", + "owner": "DavHau", + "repo": "pypi-deps-db", + "rev": "63bb8887c8de8e056f5ed77ac6a35c771c0c5d57", + "type": "github" + }, + "original": { + "owner": "DavHau", + "repo": "pypi-deps-db", + "type": "github" + } + }, "root": { "inputs": { - "nixpkgs": "nixpkgs" + "machnix": "machnix", + "nixpkgs": "nixpkgs_2" } } }, diff --git a/etc/nix/flake.nix b/etc/nix/flake.nix index 0e122db99..6ef76f405 100644 --- a/etc/nix/flake.nix +++ b/etc/nix/flake.nix @@ -2,7 +2,6 @@ description = "Vulnerablecode - A free and open vulnerabilities database and the packages they impact."; - # Nixpkgs / NixOS version to use. inputs.nixpkgs = { type = "github"; owner = "NixOS"; @@ -10,7 +9,14 @@ ref = "20.09"; }; - outputs = { self, nixpkgs }: + inputs.machnix = { + type = "github"; + owner = "DavHau"; + repo = "mach-nix"; + ref = "3.1.1"; + }; + + outputs = { self, nixpkgs, machnix }: let vulnerablecode-src = ./../..; @@ -19,8 +25,7 @@ version = builtins.head (builtins.match ''.*version=["']?([^"',]+).*'' (builtins.readFile (vulnerablecode-src + "/setup.py"))); - # From commit 7f8ae6399b02b1d508689b303f117e2f03f7854a - expectedRequirementstxtMd5sum = "7ea5fec4096b9c532450d68fad721017"; + libSh = ./lib.sh; # System types to support. supportedSystems = [ "x86_64-linux" ]; @@ -36,72 +41,55 @@ overlays = [ self.overlay ]; }); + # mach-nix instantiated for supported system types. + machnixFor = forAllSystems (system: + import machnix { + pkgs = (nixpkgsFor.${system}).pkgs; + python = "python38"; + }); + in { # A Nixpkgs overlay. overlay = final: prev: with final.pkgs; { - # Create a mock project. - mockPoetryProject = - runCommand "mockPoetryProject" { buildInputs = [ rename ]; } '' - EXPECTED=${expectedRequirementstxtMd5sum} - ACTUAL=$(md5sum ${vulnerablecode-src}/requirements.txt | cut -d ' ' -f 1) - if [[ $EXPECTED != $ACTUAL ]] ; then - echo "" - echo "The requirements.txt has changed!" - echo "1) Run make-poetry-conversion-patch.sh." - echo "2) Update expectedRequirementstxtMd5sum in flake.nix." - exit 1 - fi - - mkdir $out - cd $out - cp ${vulnerablecode-src}/etc/nix/{pyproject.toml,poetry.lock}.generated . - rename 's/.generated$//' *.generated - ''; + pythonEnv = with machnixFor.${system}; + mkPython { + requirements = + builtins.readFile (vulnerablecode-src + "/requirements.txt"); + }; - vulnerablecode = poetry2nix.mkPoetryApplication rec { - projectDir = mockPoetryProject; # where to find {pyproject.toml,poetry.lock} + vulnerablecode = stdenv.mkDerivation { + inherit version; + name = "vulnerablecode-${version}"; src = vulnerablecode-src; - python = python38; - overrides = poetry2nix.overrides.withDefaults (self: super: { - pygit2 = super.pygit2.overridePythonAttrs - (old: { buildInputs = old.buildInputs ++ [ libgit2-glib ]; }); - }); - - patchPhase = '' - # Make sure "our" pycodestyle binary is used. - sed -i 's/join(bin_dir, "pycodestyle")/"pycodestyle"/' vulnerabilities/tests/test_basics.py - ''; - - propagatedBuildInputs = [ postgresql ]; - dontConfigure = true; # do not use ./configure - dontBuild = true; + propagatedBuildInputs = [ pythonEnv postgresql ]; + + postPatch = '' + # Make sure the pycodestyle binary in $PATH is used. + substituteInPlace vulnerabilities/tests/test_basics.py \ + --replace 'join(bin_dir, "pycodestyle")' '"pycodestyle"' + ''; installPhase = '' cp -r . $out ''; - - meta = { - homepage = "https://github.com/nexB/vulnerablecode"; - license = lib.licenses.asl20; - }; }; + }; # Provide a nix-shell env to work with vulnerablecode. devShell = forAllSystems (system: with nixpkgsFor.${system}; - mkShell rec { - # will be available as env var in `nix develop` + mkShell { + # will be available as env var in `nix develop` / `nix-shell`. VULNERABLECODE_INSTALL_DIR = vulnerablecode; buildInputs = [ vulnerablecode ]; shellHook = '' - alias vulnerablecode-manage.py=${VULNERABLECODE_INSTALL_DIR}/manage.py - ''; - + alias vulnerablecode-manage.py=${vulnerablecode}/manage.py + ''; }); # Provide some packages for selected system types. @@ -114,12 +102,12 @@ # Tests run by 'nix flake check' and by Hydra. checks = forAllSystems (system: { - inherit (self.packages.${system}) vulnerablecode; + inherit (self.packages.${system}) + ; - # Additional tests, if applicable. - vulnerablecode-pytest = with nixpkgsFor.${system}; + vulnerablecode-test = with nixpkgsFor.${system}; stdenv.mkDerivation { - name = "vulnerablecode-test-${version}"; + name = "${vulnerablecode.name}-test"; buildInputs = [ wget vulnerablecode ]; @@ -129,33 +117,28 @@ unpackPhase = "true"; - # Setup postgres, run migrations, run pytset and test-run the webserver. - # See ${vulnerablecode}/README.md for the original instructions. - # Notes: - # - $RUNDIR is used to prevent postgres from accessings its default run dir at /run/postgresql. - # See also https://github.com/NixOS/nixpkgs/issues/83770#issuecomment-607992517. - # - pytest can only be run with an running postgres database server. buildPhase = '' - DATADIR=$(pwd)/pgdata - RUNDIR=$(pwd)/run - ENCODING="UTF-8" - mkdir -p $RUNDIR - initdb -D $DATADIR -E $ENCODING - pg_ctl -D $DATADIR -o "-k $RUNDIR" -l $DATADIR/logfile start - createuser --host $RUNDIR --no-createrole --no-superuser --login --inherit --createdb vulnerablecode - createdb --host $RUNDIR -E $ENCODING --owner=vulnerablecode --user=vulnerablecode --port=5432 vulnerablecode - ( - export DJANGO_DEV=1 - ${vulnerablecode}/manage.py migrate - (cd ${vulnerablecode} && pytest) - ${vulnerablecode}/manage.py runserver & - sleep 5 - ${wget}/bin/wget http://127.0.0.1:8000/api/ - kill %1 # kill webserver - ) + source ${libSh} + initPostgres $(pwd) + export DJANGO_DEV=1 + ${vulnerablecode}/manage.py migrate + ''; + + doCheck = true; + checkPhase = '' + # Run pytest on the installed version. A running postgres + # database server is needed. + (cd ${vulnerablecode} && pytest) + + # Launch the webserver and call the API. + ${vulnerablecode}/manage.py runserver & + sleep 2 + wget http://127.0.0.1:8000/api/ + kill %1 # kill background task (i.e. webserver) ''; - installPhase = "mkdir -p $out"; + installPhase = + "mkdir -p $out"; # make this derivation return success }; }); }; diff --git a/etc/nix/generate-poetry-files.sh b/etc/nix/generate-poetry-files.sh deleted file mode 100755 index 87bac16e6..000000000 --- a/etc/nix/generate-poetry-files.sh +++ /dev/null @@ -1,67 +0,0 @@ -#!/usr/bin/env nix-shell -#!nix-shell --pure -i bash -p libxml2 libxslt perl poetry rename -#!nix-shell -I nixpkgs=https://github.com/NixOS/nixpkgs/archive/nixos-20.09.tar.gz - -# This scripts generates the mock poetry project files. - -set -e - -THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" -SETUP_PY=$(realpath "$THIS_DIR/../../setup.py") -REQUIREMENTS_TXT=$(realpath "$THIS_DIR/../../requirements.txt") -POETRY_FILES=(pyproject.toml poetry.lock) - -# Prevent "ValueError: ZIP does not support timestamps before 1980" -# See nixpkgs manual. -unset SOURCE_DATE_EPOCH - -# Sanity checks. -for f in $SETUP_PY $REQUIREMENTS_TXT ; do - test -f "$f" || { echo "File $SETUP_PY doesn't exist! Aborting ..." ; exit 1; } -done - -# Extract some value from a variable/keyword argument in setup.py (removing -# (hopefully) all surrounding characters). -getFromSetupPy () { - VARIABLE_NAME=$1 - grep -E "$VARIABLE_NAME\s?=" "$SETUP_PY" | sed -e 's/^.*= *//' -e 's/,.*$//' -e 's/"//g' -e "s/'//g" -} - -NAME=$(getFromSetupPy name) -VERSION=$(getFromSetupPy version) -DESC=$(getFromSetupPy desc) -AUTHOR=$(getFromSetupPy author) -AUTHOR_EMAIL=$(getFromSetupPy author_email) -AUTHORS="$AUTHOR <$AUTHOR_EMAIL>" -LICENSE=$(getFromSetupPy license) -PYTHON="^3.8" -DEFINE_MAIN_DEPS_INTERACTIVELY="no" -DEFINE_DEV_DEPS_INTERACTIVELY="no" -CONFIRM_GENERATION="yes" - -# Make sure we run from here. -cd "$THIS_DIR" - -# Remove poetry files from (failed) previos runs. -rm -f "${POETRY_FILES[@]}" - -# Create the pyproject.toml file using `poetry init` which runs interactively -# and asks a couple of questions. Answer them using predefined values. -poetry init <]+)/:$1/' "$REQUIREMENTS_TXT" | tr '\n' ' ' | xargs -t -I {} bash -c "poetry add {}" - -# Rename the mock project files. -rename -f 's/$/.generated/' "${POETRY_FILES[@]}" diff --git a/etc/nix/lib.sh b/etc/nix/lib.sh new file mode 100644 index 000000000..ebd84ab3a --- /dev/null +++ b/etc/nix/lib.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +# Setup postgres; see the README.md for the the latest instructions. +# +# $RUNDIR is used to prevent postgres from accessings its default run dir at +# /run/postgresql. See +# https://github.com/NixOS/nixpkgs/issues/83770#issuecomment-607992517 +function initPostgres() { + ROOTDIR=$1 + DATADIR=$ROOTDIR/pgdata + RUNDIR=$ROOTDIR/run + ENCODING="UTF-8" + mkdir -p "$RUNDIR" + initdb -D "$DATADIR" -E $ENCODING + pg_ctl -D "$DATADIR" -o "-k $RUNDIR" -l "$DATADIR/logfile" start + createuser --host "$RUNDIR" --no-createrole --no-superuser --login --inherit --createdb vulnerablecode + createdb --host "$RUNDIR" -E $ENCODING --owner=vulnerablecode --user=vulnerablecode --port=5432 vulnerablecode +} diff --git a/etc/nix/poetry.lock.generated b/etc/nix/poetry.lock.generated deleted file mode 100644 index 09f8b0a9e..000000000 --- a/etc/nix/poetry.lock.generated +++ /dev/null @@ -1,1342 +0,0 @@ -[[package]] -category = "main" -description = "Async http client/server framework (asyncio)" -name = "aiohttp" -optional = false -python-versions = ">=3.5.3" -version = "3.6.2" - -[package.dependencies] -async-timeout = ">=3.0,<4.0" -attrs = ">=17.3.0" -chardet = ">=2.0,<4.0" -multidict = ">=4.5,<5.0" -yarl = ">=1.0,<2.0" - -[package.extras] -speedups = ["aiodns", "brotlipy", "cchardet"] - -[[package]] -category = "main" -description = "Disable App Nap on macOS >= 10.9" -marker = "sys_platform == \"darwin\"" -name = "appnope" -optional = false -python-versions = "*" -version = "0.1.2" - -[[package]] -category = "main" -description = "ASGI specs, helper code, and adapters" -name = "asgiref" -optional = false -python-versions = ">=3.5" -version = "3.2.7" - -[package.extras] -tests = ["pytest (>=4.3.0,<4.4.0)", "pytest-asyncio (>=0.10.0,<0.11.0)"] - -[[package]] -category = "main" -description = "Timeout context manager for asyncio programs" -name = "async-timeout" -optional = false -python-versions = ">=3.5.3" -version = "3.0.1" - -[[package]] -category = "main" -description = "Atomic file writes." -marker = "sys_platform == \"win32\"" -name = "atomicwrites" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.4.0" - -[[package]] -category = "main" -description = "Classes Without Boilerplate" -name = "attrs" -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"] - -[[package]] -category = "main" -description = "Specifications for callback functions passed in to an API" -name = "backcall" -optional = false -python-versions = "*" -version = "0.1.0" - -[[package]] -category = "main" -description = "Screen-scraping library" -name = "beautifulsoup4" -optional = false -python-versions = "*" -version = "4.7.1" - -[package.dependencies] -soupsieve = ">=1.2" - -[package.extras] -html5lib = ["html5lib"] -lxml = ["lxml"] - -[[package]] -category = "main" -description = "A decorator for caching properties in classes." -name = "cached-property" -optional = false -python-versions = "*" -version = "1.5.1" - -[[package]] -category = "main" -description = "Python package for providing Mozilla's CA Bundle." -name = "certifi" -optional = false -python-versions = "*" -version = "2020.11.8" - -[[package]] -category = "main" -description = "Foreign Function Interface for Python calling C code." -name = "cffi" -optional = false -python-versions = "*" -version = "1.14.0" - -[package.dependencies] -pycparser = "*" - -[[package]] -category = "main" -description = "Universal encoding detector for Python 2 and 3" -name = "chardet" -optional = false -python-versions = "*" -version = "3.0.4" - -[[package]] -category = "main" -description = "Cross-platform colored terminal text." -marker = "sys_platform == \"win32\"" -name = "colorama" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.4.4" - -[[package]] -category = "main" -description = "Backports and enhancements for the contextlib module" -name = "contextlib2" -optional = false -python-versions = "*" -version = "0.5.5" - -[[package]] -category = "main" -description = "Python client library for Core API." -name = "coreapi" -optional = false -python-versions = "*" -version = "2.3.3" - -[package.dependencies] -coreschema = "*" -itypes = "*" -requests = "*" -uritemplate = "*" - -[[package]] -category = "main" -description = "Core Schema." -name = "coreschema" -optional = false -python-versions = "*" -version = "0.0.4" - -[package.dependencies] -jinja2 = "*" - -[[package]] -category = "main" -description = "Decorators for Humans" -name = "decorator" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.4.2" - -[[package]] -category = "main" -description = "Work with version specifiers." -name = "dephell-specifier" -optional = false -python-versions = ">=3.5" -version = "0.2.1" - -[package.dependencies] -packaging = ">=17.1" - -[[package]] -category = "main" -description = "Use Database URLs in your Django Application." -name = "dj-database-url" -optional = false -python-versions = "*" -version = "0.4.2" - -[[package]] -category = "main" -description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." -name = "django" -optional = false -python-versions = ">=3.6" -version = "3.0.7" - -[package.dependencies] -asgiref = ">=3.2,<4.0" -pytz = "*" -sqlparse = ">=0.2.2" - -[package.extras] -argon2 = ["argon2-cffi (>=16.1.0)"] -bcrypt = ["bcrypt"] - -[[package]] -category = "main" -description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." -name = "django-filter" -optional = false -python-versions = ">=3.4" -version = "2.2.0" - -[package.dependencies] -Django = ">=1.11" - -[[package]] -category = "main" -description = "Tweak the form field rendering in templates, not in python-level form definitions." -name = "django-widget-tweaks" -optional = false -python-versions = "*" -version = "1.4.8" - -[[package]] -category = "main" -description = "Web APIs for Django, made easy." -name = "djangorestframework" -optional = false -python-versions = ">=3.5" -version = "3.11.0" - -[package.dependencies] -django = ">=1.11" - -[[package]] -category = "main" -description = "Automated generation of real Swagger/OpenAPI 2.0 schemas from Django Rest Framework code." -name = "drf-yasg" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "1.17.1" - -[package.dependencies] -Django = ">=1.11.7" -coreapi = ">=2.3.3" -coreschema = ">=0.0.4" -djangorestframework = ">=3.8" -inflection = ">=0.3.1" -packaging = "*" -"ruamel.yaml" = ">=0.15.34" -six = ">=1.10.0" -uritemplate = ">=3.0.0" - -[package.extras] -validation = ["swagger-spec-validator (>=2.1.0)"] - -[[package]] -category = "main" -description = "WSGI HTTP Server for UNIX" -name = "gunicorn" -optional = false -python-versions = "*" -version = "19.7.1" - -[[package]] -category = "main" -description = "Internationalized Domain Names in Applications (IDNA)" -name = "idna" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.10" - -[[package]] -category = "main" -description = "Read metadata from Python packages" -name = "importlib-metadata" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "1.3.0" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["sphinx", "rst.linker"] -testing = ["packaging", "importlib-resources"] - -[[package]] -category = "main" -description = "A port of Ruby on Rails inflector to Python" -name = "inflection" -optional = false -python-versions = ">=3.5" -version = "0.5.1" - -[[package]] -category = "main" -description = "IPython: Productive Interactive Computing" -name = "ipython" -optional = false -python-versions = ">=3.6" -version = "7.13.0" - -[package.dependencies] -appnope = "*" -backcall = "*" -colorama = "*" -decorator = "*" -jedi = ">=0.10" -pexpect = "*" -pickleshare = "*" -prompt-toolkit = ">=2.0.0,<3.0.0 || >3.0.0,<3.0.1 || >3.0.1,<3.1.0" -pygments = "*" -setuptools = ">=18.5" -traitlets = ">=4.2" - -[package.extras] -all = ["numpy (>=1.14)", "testpath", "notebook", "nose (>=0.10.1)", "nbconvert", "requests", "ipywidgets", "qtconsole", "ipyparallel", "Sphinx (>=1.3)", "pygments", "nbformat", "ipykernel"] -doc = ["Sphinx (>=1.3)"] -kernel = ["ipykernel"] -nbconvert = ["nbconvert"] -nbformat = ["nbformat"] -notebook = ["notebook", "ipywidgets"] -parallel = ["ipyparallel"] -qtconsole = ["qtconsole"] -test = ["nose (>=0.10.1)", "requests", "testpath", "pygments", "nbformat", "ipykernel", "numpy (>=1.14)"] - -[[package]] -category = "main" -description = "Vestigial utilities from IPython" -name = "ipython-genutils" -optional = false -python-versions = "*" -version = "0.2.0" - -[[package]] -category = "main" -description = "Simple immutable types for python." -name = "itypes" -optional = false -python-versions = "*" -version = "1.2.0" - -[[package]] -category = "main" -description = "An autocompletion tool for Python that can be used for text editors." -name = "jedi" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.17.0" - -[package.dependencies] -parso = ">=0.7.0" - -[package.extras] -qa = ["flake8 (3.7.9)"] -testing = ["colorama", "docopt", "pytest (>=3.9.0,<5.0.0)"] - -[[package]] -category = "main" -description = "A very fast and expressive template engine." -name = "jinja2" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.11.2" - -[package.dependencies] -MarkupSafe = ">=0.23" - -[package.extras] -i18n = ["Babel (>=0.8)"] - -[[package]] -category = "main" -description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." -name = "lxml" -optional = false -python-versions = "*" -version = "4.3.3" - -[package.extras] -cssselect = ["cssselect (>=0.7)"] -html5 = ["html5lib"] -htmlsoup = ["beautifulsoup4"] -source = ["Cython (>=0.29.1)"] - -[[package]] -category = "main" -description = "Safely add untrusted strings to HTML/XML markup." -name = "markupsafe" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -version = "1.1.1" - -[[package]] -category = "main" -description = "More routines for operating on iterables, beyond itertools" -name = "more-itertools" -optional = false -python-versions = ">=3.5" -version = "8.0.2" - -[[package]] -category = "main" -description = "multidict implementation" -name = "multidict" -optional = false -python-versions = ">=3.5" -version = "4.7.6" - -[[package]] -category = "main" -description = "A \"purl\" aka. Package URL parser and builder" -name = "packageurl-python" -optional = false -python-versions = "*" -version = "0.9.3" - -[[package]] -category = "main" -description = "Core utilities for Python packages" -name = "packaging" -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 = "main" -description = "A Python Parser" -name = "parso" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.7.0" - -[package.extras] -testing = ["docopt", "pytest (>=3.0.7)"] - -[[package]] -category = "main" -description = "Pexpect allows easy control of interactive console applications." -name = "pexpect" -optional = false -python-versions = "*" -version = "4.8.0" - -[package.dependencies] -ptyprocess = ">=0.5" - -[[package]] -category = "main" -description = "Tiny 'shelve'-like database with concurrency support" -name = "pickleshare" -optional = false -python-versions = "*" -version = "0.7.5" - -[[package]] -category = "main" -description = "plugin and hook calling mechanisms for python" -name = "pluggy" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.13.1" - -[package.extras] -dev = ["pre-commit", "tox"] - -[[package]] -category = "main" -description = "Library for building powerful interactive command lines in Python" -name = "prompt-toolkit" -optional = false -python-versions = ">=3.6.1" -version = "3.0.5" - -[package.dependencies] -wcwidth = "*" - -[[package]] -category = "main" -description = "psycopg2 - Python-PostgreSQL Database Adapter" -name = "psycopg2" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -version = "2.8.4" - -[[package]] -category = "main" -description = "Run a subprocess in a pseudo terminal" -name = "ptyprocess" -optional = false -python-versions = "*" -version = "0.6.0" - -[[package]] -category = "main" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -name = "py" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.8.0" - -[[package]] -category = "main" -description = "Python style guide checker" -name = "pycodestyle" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.5.0" - -[[package]] -category = "main" -description = "C parser in Python" -name = "pycparser" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.20" - -[[package]] -category = "main" -description = "Python bindings for libgit2." -name = "pygit2" -optional = false -python-versions = "*" -version = "1.2.0" - -[package.dependencies] -cached-property = "*" -cffi = "*" - -[[package]] -category = "main" -description = "Pygments is a syntax highlighting package written in Python." -name = "pygments" -optional = false -python-versions = ">=3.5" -version = "2.6.1" - -[[package]] -category = "main" -description = "Python parsing module" -name = "pyparsing" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.4.5" - -[[package]] -category = "main" -description = "pytest: simple powerful testing with Python" -name = "pytest" -optional = false -python-versions = ">=3.5" -version = "5.3.2" - -[package.dependencies] -atomicwrites = ">=1.0" -attrs = ">=17.4.0" -colorama = "*" -more-itertools = ">=4.0.0" -packaging = "*" -pluggy = ">=0.12,<1.0" -py = ">=1.5.0" -wcwidth = "*" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -category = "main" -description = "Manage dependencies of tests" -name = "pytest-dependency" -optional = false -python-versions = "*" -version = "0.4.0" - -[package.dependencies] -pytest = ">=3.6.0" - -[[package]] -category = "main" -description = "A Django plugin for pytest." -name = "pytest-django" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.7.0" - -[package.dependencies] -pytest = ">=3.6" - -[package.extras] -docs = ["sphinx", "sphinx-rtd-theme"] -testing = ["django", "django-configurations (>=2.0)", "six"] - -[[package]] -category = "main" -description = "Thin-wrapper around the mock package for easier use with py.test" -name = "pytest-mock" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.13.0" - -[package.dependencies] -pytest = ">=2.7" - -[package.extras] -dev = ["pre-commit", "tox"] - -[[package]] -category = "main" -description = "Extensions to the standard Python datetime module" -name = "python-dateutil" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -version = "2.8.1" - -[package.dependencies] -six = ">=1.5" - -[[package]] -category = "main" -description = "A parser for TOML-0.4.0" -name = "pytoml" -optional = false -python-versions = "*" -version = "0.1.21" - -[[package]] -category = "main" -description = "World timezone definitions, modern and historical" -name = "pytz" -optional = false -python-versions = "*" -version = "2019.3" - -[[package]] -category = "main" -description = "YAML parser and emitter for Python" -name = "pyyaml" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "5.3.1" - -[[package]] -category = "main" -description = "Python HTTP for Humans." -name = "requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.23.0" - -[package.dependencies] -certifi = ">=2017.4.17" -chardet = ">=3.0.2,<4" -idna = ">=2.5,<3" -urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" - -[package.extras] -security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] - -[[package]] -category = "main" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -name = "ruamel.yaml" -optional = false -python-versions = "*" -version = "0.16.12" - -[package.dependencies] -[package.dependencies."ruamel.yaml.clib"] -python = "<3.9" -version = ">=0.1.2" - -[package.extras] -docs = ["ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -category = "main" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -marker = "platform_python_implementation == \"CPython\" and python_version < \"3.9\"" -name = "ruamel.yaml.clib" -optional = false -python-versions = "*" -version = "0.2.2" - -[[package]] -category = "main" -description = "Dump readable YAML and load safely any YAML preserving ordering and avoiding surprises of type conversions. This library is a PyYaml wrapper with sane behaviour to read and write readable YAML safely, typically when used for configuration." -name = "saneyaml" -optional = false -python-versions = "*" -version = "0.4" - -[package.dependencies] -PyYAML = "*" - -[[package]] -category = "main" -description = "Simple data validation library" -name = "schema" -optional = false -python-versions = "*" -version = "0.7.1" - -[package.dependencies] -contextlib2 = "0.5.5" - -[[package]] -category = "main" -description = "Python 2 and 3 compatibility utilities" -name = "six" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "1.13.0" - -[[package]] -category = "main" -description = "A modern CSS selector implementation for Beautiful Soup." -name = "soupsieve" -optional = false -python-versions = "*" -version = "1.9.5" - -[[package]] -category = "main" -description = "Non-validating SQL parser" -name = "sqlparse" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.3.0" - -[[package]] -category = "main" -description = "Fast, Extensible Progress Meter" -name = "tqdm" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" -version = "4.41.1" - -[package.extras] -dev = ["py-make (>=0.1.0)", "twine", "argopt", "pydoc-markdown"] - -[[package]] -category = "main" -description = "Traitlets Python config system" -name = "traitlets" -optional = false -python-versions = "*" -version = "4.3.3" - -[package.dependencies] -decorator = "*" -ipython-genutils = "*" -six = "*" - -[package.extras] -test = ["pytest", "mock"] - -[[package]] -category = "main" -description = "URI templates" -name = "uritemplate" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.0.1" - -[[package]] -category = "main" -description = "HTTP library with thread-safe connection pooling, file post, and more." -name = "urllib3" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" -version = "1.25.11" - -[package.extras] -brotli = ["brotlipy (>=0.6.0)"] -secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] - -[[package]] -category = "main" -description = "Measures number of Terminal column cells of wide-character codes" -name = "wcwidth" -optional = false -python-versions = "*" -version = "0.1.7" - -[[package]] -category = "main" -description = "Radically simplified static file serving for WSGI applications" -name = "whitenoise" -optional = false -python-versions = ">=3.5, <4" -version = "5.0.1" - -[package.extras] -brotli = ["brotli"] - -[[package]] -category = "main" -description = "Yet another URL library" -name = "yarl" -optional = false -python-versions = ">=3.6" -version = "1.6.3" - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" - -[[package]] -category = "main" -description = "Backport of pathlib-compatible object wrapper for zip files" -name = "zipp" -optional = false -python-versions = ">=2.7" -version = "0.6.0" - -[package.dependencies] -more-itertools = "*" - -[package.extras] -docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] -testing = ["pathlib2", "contextlib2", "unittest2"] - -[metadata] -content-hash = "00be403d6025da9c520d68b68d62235d203d77ac262ca6be4db74e5c5a75f505" -lock-version = "1.0" -python-versions = "^3.8" - -[metadata.files] -aiohttp = [ - {file = "aiohttp-3.6.2-cp35-cp35m-macosx_10_13_x86_64.whl", hash = "sha256:1e984191d1ec186881ffaed4581092ba04f7c61582a177b187d3a2f07ed9719e"}, - {file = "aiohttp-3.6.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:50aaad128e6ac62e7bf7bd1f0c0a24bc968a0c0590a726d5a955af193544bcec"}, - {file = "aiohttp-3.6.2-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:65f31b622af739a802ca6fd1a3076fd0ae523f8485c52924a89561ba10c49b48"}, - {file = "aiohttp-3.6.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ae55bac364c405caa23a4f2d6cfecc6a0daada500274ffca4a9230e7129eac59"}, - {file = "aiohttp-3.6.2-cp36-cp36m-win32.whl", hash = "sha256:344c780466b73095a72c616fac5ea9c4665add7fc129f285fbdbca3cccf4612a"}, - {file = "aiohttp-3.6.2-cp36-cp36m-win_amd64.whl", hash = "sha256:4c6efd824d44ae697814a2a85604d8e992b875462c6655da161ff18fd4f29f17"}, - {file = "aiohttp-3.6.2-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:2f4d1a4fdce595c947162333353d4a44952a724fba9ca3205a3df99a33d1307a"}, - {file = "aiohttp-3.6.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6206a135d072f88da3e71cc501c59d5abffa9d0bb43269a6dcd28d66bfafdbdd"}, - {file = "aiohttp-3.6.2-cp37-cp37m-win32.whl", hash = "sha256:b778ce0c909a2653741cb4b1ac7015b5c130ab9c897611df43ae6a58523cb965"}, - {file = "aiohttp-3.6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:32e5f3b7e511aa850829fbe5aa32eb455e5534eaa4b1ce93231d00e2f76e5654"}, - {file = "aiohttp-3.6.2-py3-none-any.whl", hash = "sha256:460bd4237d2dbecc3b5ed57e122992f60188afe46e7319116da5eb8a9dfedba4"}, - {file = "aiohttp-3.6.2.tar.gz", hash = "sha256:259ab809ff0727d0e834ac5e8a283dc5e3e0ecc30c4d80b3cd17a4139ce1f326"}, -] -appnope = [ - {file = "appnope-0.1.2-py2.py3-none-any.whl", hash = "sha256:93aa393e9d6c54c5cd570ccadd8edad61ea0c4b9ea7a01409020c9aa019eb442"}, - {file = "appnope-0.1.2.tar.gz", hash = "sha256:dd83cd4b5b460958838f6eb3000c660b1f9caf2a5b1de4264e941512f603258a"}, -] -asgiref = [ - {file = "asgiref-3.2.7-py2.py3-none-any.whl", hash = "sha256:9ca8b952a0a9afa61d30aa6d3d9b570bb3fd6bafcf7ec9e6bed43b936133db1c"}, - {file = "asgiref-3.2.7.tar.gz", hash = "sha256:8036f90603c54e93521e5777b2b9a39ba1bad05773fcf2d208f0299d1df58ce5"}, -] -async-timeout = [ - {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, - {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, - {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, -] -attrs = [ - {file = "attrs-19.3.0-py2.py3-none-any.whl", hash = "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c"}, - {file = "attrs-19.3.0.tar.gz", hash = "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72"}, -] -backcall = [ - {file = "backcall-0.1.0.tar.gz", hash = "sha256:38ecd85be2c1e78f77fd91700c76e14667dc21e2713b63876c0eb901196e01e4"}, - {file = "backcall-0.1.0.zip", hash = "sha256:bbbf4b1e5cd2bdb08f915895b51081c041bac22394fdfcfdfbe9f14b77c08bf2"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.7.1-py2-none-any.whl", hash = "sha256:ba6d5c59906a85ac23dadfe5c88deaf3e179ef565f4898671253e50a78680718"}, - {file = "beautifulsoup4-4.7.1-py3-none-any.whl", hash = "sha256:034740f6cb549b4e932ae1ab975581e6103ac8f942200a0e9759065984391858"}, - {file = "beautifulsoup4-4.7.1.tar.gz", hash = "sha256:945065979fb8529dd2f37dbb58f00b661bdbcbebf954f93b32fdf5263ef35348"}, -] -cached-property = [ - {file = "cached-property-1.5.1.tar.gz", hash = "sha256:9217a59f14a5682da7c4b8829deadbfc194ac22e9908ccf7c8820234e80a1504"}, - {file = "cached_property-1.5.1-py2.py3-none-any.whl", hash = "sha256:3a026f1a54135677e7da5ce819b0c690f156f37976f3e30c5430740725203d7f"}, -] -certifi = [ - {file = "certifi-2020.11.8-py2.py3-none-any.whl", hash = "sha256:1f422849db327d534e3d0c5f02a263458c3955ec0aae4ff09b95f195c59f4edd"}, - {file = "certifi-2020.11.8.tar.gz", hash = "sha256:f05def092c44fbf25834a51509ef6e631dc19765ab8a57b4e7ab85531f0a9cf4"}, -] -cffi = [ - {file = "cffi-1.14.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1cae98a7054b5c9391eb3249b86e0e99ab1e02bb0cc0575da191aedadbdf4384"}, - {file = "cffi-1.14.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:cf16e3cf6c0a5fdd9bc10c21687e19d29ad1fe863372b5543deaec1039581a30"}, - {file = "cffi-1.14.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f2b0fa0c01d8a0c7483afd9f31d7ecf2d71760ca24499c8697aeb5ca37dc090c"}, - {file = "cffi-1.14.0-cp27-cp27m-win32.whl", hash = "sha256:99f748a7e71ff382613b4e1acc0ac83bf7ad167fb3802e35e90d9763daba4d78"}, - {file = "cffi-1.14.0-cp27-cp27m-win_amd64.whl", hash = "sha256:c420917b188a5582a56d8b93bdd8e0f6eca08c84ff623a4c16e809152cd35793"}, - {file = "cffi-1.14.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:399aed636c7d3749bbed55bc907c3288cb43c65c4389964ad5ff849b6370603e"}, - {file = "cffi-1.14.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:cab50b8c2250b46fe738c77dbd25ce017d5e6fb35d3407606e7a4180656a5a6a"}, - {file = "cffi-1.14.0-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:001bf3242a1bb04d985d63e138230802c6c8d4db3668fb545fb5005ddf5bb5ff"}, - {file = "cffi-1.14.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:e56c744aa6ff427a607763346e4170629caf7e48ead6921745986db3692f987f"}, - {file = "cffi-1.14.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b8c78301cefcf5fd914aad35d3c04c2b21ce8629b5e4f4e45ae6812e461910fa"}, - {file = "cffi-1.14.0-cp35-cp35m-win32.whl", hash = "sha256:8c0ffc886aea5df6a1762d0019e9cb05f825d0eec1f520c51be9d198701daee5"}, - {file = "cffi-1.14.0-cp35-cp35m-win_amd64.whl", hash = "sha256:8a6c688fefb4e1cd56feb6c511984a6c4f7ec7d2a1ff31a10254f3c817054ae4"}, - {file = "cffi-1.14.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:95cd16d3dee553f882540c1ffe331d085c9e629499ceadfbda4d4fde635f4b7d"}, - {file = "cffi-1.14.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66e41db66b47d0d8672d8ed2708ba91b2f2524ece3dee48b5dfb36be8c2f21dc"}, - {file = "cffi-1.14.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:028a579fc9aed3af38f4892bdcc7390508adabc30c6af4a6e4f611b0c680e6ac"}, - {file = "cffi-1.14.0-cp36-cp36m-win32.whl", hash = "sha256:cef128cb4d5e0b3493f058f10ce32365972c554572ff821e175dbc6f8ff6924f"}, - {file = "cffi-1.14.0-cp36-cp36m-win_amd64.whl", hash = "sha256:337d448e5a725bba2d8293c48d9353fc68d0e9e4088d62a9571def317797522b"}, - {file = "cffi-1.14.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e577934fc5f8779c554639376beeaa5657d54349096ef24abe8c74c5d9c117c3"}, - {file = "cffi-1.14.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:62ae9af2d069ea2698bf536dcfe1e4eed9090211dbaafeeedf5cb6c41b352f66"}, - {file = "cffi-1.14.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:14491a910663bf9f13ddf2bc8f60562d6bc5315c1f09c704937ef17293fb85b0"}, - {file = "cffi-1.14.0-cp37-cp37m-win32.whl", hash = "sha256:c43866529f2f06fe0edc6246eb4faa34f03fe88b64a0a9a942561c8e22f4b71f"}, - {file = "cffi-1.14.0-cp37-cp37m-win_amd64.whl", hash = "sha256:2089ed025da3919d2e75a4d963d008330c96751127dd6f73c8dc0c65041b4c26"}, - {file = "cffi-1.14.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3b911c2dbd4f423b4c4fcca138cadde747abdb20d196c4a48708b8a2d32b16dd"}, - {file = "cffi-1.14.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:7e63cbcf2429a8dbfe48dcc2322d5f2220b77b2e17b7ba023d6166d84655da55"}, - {file = "cffi-1.14.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:3d311bcc4a41408cf5854f06ef2c5cab88f9fded37a3b95936c9879c1640d4c2"}, - {file = "cffi-1.14.0-cp38-cp38-win32.whl", hash = "sha256:675686925a9fb403edba0114db74e741d8181683dcf216be697d208857e04ca8"}, - {file = "cffi-1.14.0-cp38-cp38-win_amd64.whl", hash = "sha256:00789914be39dffba161cfc5be31b55775de5ba2235fe49aa28c148236c4e06b"}, - {file = "cffi-1.14.0.tar.gz", hash = "sha256:2d384f4a127a15ba701207f7639d94106693b6cd64173d6c8988e2c25f3ac2b6"}, -] -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.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, - {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, -] -contextlib2 = [ - {file = "contextlib2-0.5.5-py2.py3-none-any.whl", hash = "sha256:f5260a6e679d2ff42ec91ec5252f4eeffdcf21053db9113bd0a8e4d953769c00"}, - {file = "contextlib2-0.5.5.tar.gz", hash = "sha256:509f9419ee91cdd00ba34443217d5ca51f5a364a404e1dce9e8979cea969ca48"}, -] -coreapi = [ - {file = "coreapi-2.3.3-py2.py3-none-any.whl", hash = "sha256:bf39d118d6d3e171f10df9ede5666f63ad80bba9a29a8ec17726a66cf52ee6f3"}, - {file = "coreapi-2.3.3.tar.gz", hash = "sha256:46145fcc1f7017c076a2ef684969b641d18a2991051fddec9458ad3f78ffc1cb"}, -] -coreschema = [ - {file = "coreschema-0.0.4-py2-none-any.whl", hash = "sha256:5e6ef7bf38c1525d5e55a895934ab4273548629f16aed5c0a6caa74ebf45551f"}, - {file = "coreschema-0.0.4.tar.gz", hash = "sha256:9503506007d482ab0867ba14724b93c18a33b22b6d19fb419ef2d239dd4a1607"}, -] -decorator = [ - {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, - {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, -] -dephell-specifier = [ - {file = "dephell_specifier-0.2.1-py3-none-any.whl", hash = "sha256:de46325cfd6adedf5f685a3c00242d8a16fe270a7a76948fd1957c99561eb89e"}, - {file = "dephell_specifier-0.2.1.tar.gz", hash = "sha256:c2ec7e62a2406960e19eb6db0f11918d82af64995ee1f26fe00d013791ae9758"}, -] -dj-database-url = [ - {file = "dj-database-url-0.4.2.tar.gz", hash = "sha256:a6832d8445ee9d788c5baa48aef8130bf61fdc442f7d9a548424d25cd85c9f08"}, - {file = "dj_database_url-0.4.2-py2.py3-none-any.whl", hash = "sha256:e16d94c382ea0564c48038fa7fe8d9c890ef1ab1a8ec4cb48e732c124b9482fd"}, -] -django = [ - {file = "Django-3.0.7-py3-none-any.whl", hash = "sha256:e1630333248c9b3d4e38f02093a26f1e07b271ca896d73097457996e0fae12e8"}, - {file = "Django-3.0.7.tar.gz", hash = "sha256:5052b34b34b3425233c682e0e11d658fd6efd587d11335a0203d827224ada8f2"}, -] -django-filter = [ - {file = "django-filter-2.2.0.tar.gz", hash = "sha256:c3deb57f0dd7ff94d7dce52a047516822013e2b441bed472b722a317658cfd14"}, - {file = "django_filter-2.2.0-py3-none-any.whl", hash = "sha256:558c727bce3ffa89c4a7a0b13bc8976745d63e5fd576b3a9a851650ef11c401b"}, -] -django-widget-tweaks = [ - {file = "django-widget-tweaks-1.4.8.tar.gz", hash = "sha256:9f91ca4217199b7671971d3c1f323a2bec71a0c27dec6260b3c006fa541bc489"}, - {file = "django_widget_tweaks-1.4.8-py2.py3-none-any.whl", hash = "sha256:f80bff4a8a59b278bb277a405a76a8b9a884e4bae7a6c70e78a39c626cd1c836"}, -] -djangorestframework = [ - {file = "djangorestframework-3.11.0-py3-none-any.whl", hash = "sha256:05809fc66e1c997fd9a32ea5730d9f4ba28b109b9da71fccfa5ff241201fd0a4"}, - {file = "djangorestframework-3.11.0.tar.gz", hash = "sha256:e782087823c47a26826ee5b6fa0c542968219263fb3976ec3c31edab23a4001f"}, -] -drf-yasg = [ - {file = "drf-yasg-1.17.1.tar.gz", hash = "sha256:5572e9d5baab9f6b49318169df9789f7399d0e3c7bdac8fdb8dfccf1d5d2b1ca"}, - {file = "drf_yasg-1.17.1-py2.py3-none-any.whl", hash = "sha256:7d7af27ad16e18507e9392b2afd6b218fbffc432ec8dbea053099a2241e184ff"}, -] -gunicorn = [ - {file = "gunicorn-19.7.1-py2.py3-none-any.whl", hash = "sha256:75af03c99389535f218cc596c7de74df4763803f7b63eb09d77e92b3956b36c6"}, - {file = "gunicorn-19.7.1.tar.gz", hash = "sha256:eee1169f0ca667be05db3351a0960765620dad53f53434262ff8901b68a1b622"}, -] -idna = [ - {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, - {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, -] -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"}, -] -inflection = [ - {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, - {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, -] -ipython = [ - {file = "ipython-7.13.0-py3-none-any.whl", hash = "sha256:eb8d075de37f678424527b5ef6ea23f7b80240ca031c2dd6de5879d687a65333"}, - {file = "ipython-7.13.0.tar.gz", hash = "sha256:ca478e52ae1f88da0102360e57e528b92f3ae4316aabac80a2cd7f7ab2efb48a"}, -] -ipython-genutils = [ - {file = "ipython_genutils-0.2.0-py2.py3-none-any.whl", hash = "sha256:72dd37233799e619666c9f639a9da83c34013a73e8bbc79a7a6348d93c61fab8"}, - {file = "ipython_genutils-0.2.0.tar.gz", hash = "sha256:eb2e116e75ecef9d4d228fdc66af54269afa26ab4463042e33785b887c628ba8"}, -] -itypes = [ - {file = "itypes-1.2.0-py2.py3-none-any.whl", hash = "sha256:03da6872ca89d29aef62773672b2d408f490f80db48b23079a4b194c86dd04c6"}, - {file = "itypes-1.2.0.tar.gz", hash = "sha256:af886f129dea4a2a1e3d36595a2d139589e4dd287f5cab0b40e799ee81570ff1"}, -] -jedi = [ - {file = "jedi-0.17.0-py2.py3-none-any.whl", hash = "sha256:cd60c93b71944d628ccac47df9a60fec53150de53d42dc10a7fc4b5ba6aae798"}, - {file = "jedi-0.17.0.tar.gz", hash = "sha256:df40c97641cb943661d2db4c33c2e1ff75d491189423249e989bcea4464f3030"}, -] -jinja2 = [ - {file = "Jinja2-2.11.2-py2.py3-none-any.whl", hash = "sha256:f0a4641d3cf955324a89c04f3d94663aa4d638abe8f733ecd3582848e1c37035"}, - {file = "Jinja2-2.11.2.tar.gz", hash = "sha256:89aab215427ef59c34ad58735269eb58b1a5808103067f7bb9d5836c651b3bb0"}, -] -lxml = [ - {file = "lxml-4.3.3-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:3210da6f36cf4b835ff1be853962b22cc354d506f493b67a4303c88bbb40d57b"}, - {file = "lxml-4.3.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:fdcb57b906dbc1f80666e6290e794ab8fb959a2e17aa5aee1758a85d1da4533f"}, - {file = "lxml-4.3.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:a3080470559938a09a5d0ec558c005282e99ac77bf8211fb7b9a5c66390acd8d"}, - {file = "lxml-4.3.3-cp27-cp27m-win32.whl", hash = "sha256:bdb0593a42070b0a5f138b79b872289ee73c8e25b3f0bea6564e795b55b6bcdd"}, - {file = "lxml-4.3.3-cp27-cp27m-win_amd64.whl", hash = "sha256:b4fbf9b552faff54742bcd0791ab1da5863363fb19047e68f6592be1ac2dab33"}, - {file = "lxml-4.3.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:62f382cddf3d2e52cf266e161aa522d54fd624b8cc567bc18f573d9d50d40e8e"}, - {file = "lxml-4.3.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ad841b78a476623955da270ab8d207c3c694aa5eba71f4792f65926dc46c6ee8"}, - {file = "lxml-4.3.3-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:40f60819fbd5bad6e191ba1329bfafa09ab7f3f174b3d034d413ef5266963294"}, - {file = "lxml-4.3.3-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:f679d93dec7f7210575c85379a31322df4c46496f184ef650d3aba1484b38a2d"}, - {file = "lxml-4.3.3-cp34-cp34m-win32.whl", hash = "sha256:c4e4bca2bb68ce22320297dfa1a7bf070a5b20bcbaec4ee023f83d2f6e76496f"}, - {file = "lxml-4.3.3-cp34-cp34m-win_amd64.whl", hash = "sha256:846a0739e595871041385d86d12af4b6999f921359b38affb99cdd6b54219a8f"}, - {file = "lxml-4.3.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:ff424b01d090ffe1947ec7432b07f536912e0300458f9a7f48ea217dd8362b86"}, - {file = "lxml-4.3.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:43b26a865a61549919f8a42e094dfdb62847113cf776d84bd6b60e4e3fc20ea3"}, - {file = "lxml-4.3.3-cp35-cp35m-win32.whl", hash = "sha256:fd213bb5166e46974f113c8228daaef1732abc47cb561ce9c4c8eaed4bd3b09b"}, - {file = "lxml-4.3.3-cp35-cp35m-win_amd64.whl", hash = "sha256:e83b4b2bf029f5104bc1227dbb7bf5ace6fd8fabaebffcd4f8106fafc69fc45f"}, - {file = "lxml-4.3.3-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:175f3825f075cf02d15099eb52658457cf0ff103dcf11512b5d2583e1d40f58b"}, - {file = "lxml-4.3.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:afdd75d9735e44c639ffd6258ce04a2de3b208f148072c02478162d0944d9da3"}, - {file = "lxml-4.3.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b91cfe4438c741aeff662d413fd2808ac901cc6229c838236840d11de4586d63"}, - {file = "lxml-4.3.3-cp36-cp36m-win32.whl", hash = "sha256:30e14c62d88d1e01a26936ecd1c6e784d4afc9aa002bba4321c5897937112616"}, - {file = "lxml-4.3.3-cp36-cp36m-win_amd64.whl", hash = "sha256:0815b0c9f897468de6a386dc15917a0becf48cc92425613aa8bbfc7f0f82951f"}, - {file = "lxml-4.3.3-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:03984196d00670b2ab14ae0ea83d5cc0cfa4f5a42558afa9ab5fa745995328f5"}, - {file = "lxml-4.3.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cec4ab14af9eae8501be3266ff50c3c2aecc017ba1e86c160209bb4f0423df6a"}, - {file = "lxml-4.3.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e995b3734a46d41ae60b6097f7c51ba9958648c6d1e0935b7e0ee446ee4abe22"}, - {file = "lxml-4.3.3-cp37-cp37m-win32.whl", hash = "sha256:b90c4e32d6ec089d3fa3518436bdf5ce4d902a0787dbd9bb09f37afe8b994317"}, - {file = "lxml-4.3.3-cp37-cp37m-win_amd64.whl", hash = "sha256:7b98f0325be8450da70aa4a796c4f06852949fe031878b4aa1d6c417a412f314"}, - {file = "lxml-4.3.3.tar.gz", hash = "sha256:4a03dd682f8e35a10234904e0b9508d705ff98cf962c5851ed052e9340df3d90"}, -] -markupsafe = [ - {file = "MarkupSafe-1.1.1-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:09027a7803a62ca78792ad89403b1b7a73a01c8cb65909cd876f7fcebd79b161"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e249096428b3ae81b08327a63a485ad0878de3fb939049038579ac0ef61e17e7"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:500d4957e52ddc3351cabf489e79c91c17f6e0899158447047588650b5e69183"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win32.whl", hash = "sha256:b2051432115498d3562c084a49bba65d97cf251f5a331c64a12ee7e04dacc51b"}, - {file = "MarkupSafe-1.1.1-cp27-cp27m-win_amd64.whl", hash = "sha256:98c7086708b163d425c67c7a91bad6e466bb99d797aa64f965e9d25c12111a5e"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:cd5df75523866410809ca100dc9681e301e3c27567cf498077e8551b6d20e42f"}, - {file = "MarkupSafe-1.1.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:43a55c2930bbc139570ac2452adf3d70cdbb3cfe5912c71cdce1c2c6bbd9c5d1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:1027c282dad077d0bae18be6794e6b6b8c91d58ed8a8d89a89d59693b9131db5"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:62fe6c95e3ec8a7fad637b7f3d372c15ec1caa01ab47926cfdf7a75b40e0eac1"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:88e5fcfb52ee7b911e8bb6d6aa2fd21fbecc674eadd44118a9cc3863f938e735"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win32.whl", hash = "sha256:ade5e387d2ad0d7ebf59146cc00c8044acbd863725f887353a10df825fc8ae21"}, - {file = "MarkupSafe-1.1.1-cp34-cp34m-win_amd64.whl", hash = "sha256:09c4b7f37d6c648cb13f9230d847adf22f8171b1ccc4d5682398e77f40309235"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:79855e1c5b8da654cf486b830bd42c06e8780cea587384cf6545b7d9ac013a0b"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:c8716a48d94b06bb3b2524c2b77e055fb313aeb4ea620c8dd03a105574ba704f"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c1699dfe0cf8ff607dbdcc1e9b9af1755371f92a68f706051cc8c37d447c905"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win32.whl", hash = "sha256:6dd73240d2af64df90aa7c4e7481e23825ea70af4b4922f8ede5b9e35f78a3b1"}, - {file = "MarkupSafe-1.1.1-cp35-cp35m-win_amd64.whl", hash = "sha256:9add70b36c5666a2ed02b43b335fe19002ee5235efd4b8a89bfcf9005bebac0d"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:24982cc2533820871eba85ba648cd53d8623687ff11cbb805be4ff7b4c971aff"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:00bc623926325b26bb9605ae9eae8a215691f33cae5df11ca5424f06f2d1f473"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:717ba8fe3ae9cc0006d7c451f0bb265ee07739daf76355d06366154ee68d221e"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win32.whl", hash = "sha256:535f6fc4d397c1563d08b88e485c3496cf5784e927af890fb3c3aac7f933ec66"}, - {file = "MarkupSafe-1.1.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b1282f8c00509d99fef04d8ba936b156d419be841854fe901d8ae224c59f0be5"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:8defac2f2ccd6805ebf65f5eeb132adcf2ab57aa11fdf4c0dd5169a004710e7d"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:46c99d2de99945ec5cb54f23c8cd5689f6d7177305ebff350a58ce5f8de1669e"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:ba59edeaa2fc6114428f1637ffff42da1e311e29382d81b339c1817d37ec93c6"}, - {file = "MarkupSafe-1.1.1-cp37-cp37m-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"}, -] -more-itertools = [ - {file = "more-itertools-8.0.2.tar.gz", hash = "sha256:b84b238cce0d9adad5ed87e745778d20a3f8487d0f0cb8b8a586816c7496458d"}, - {file = "more_itertools-8.0.2-py3-none-any.whl", hash = "sha256:c833ef592a0324bcc6a60e48440da07645063c453880c9477ceb22490aec1564"}, -] -multidict = [ - {file = "multidict-4.7.6-cp35-cp35m-macosx_10_14_x86_64.whl", hash = "sha256:275ca32383bc5d1894b6975bb4ca6a7ff16ab76fa622967625baeebcf8079000"}, - {file = "multidict-4.7.6-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1ece5a3369835c20ed57adadc663400b5525904e53bae59ec854a5d36b39b21a"}, - {file = "multidict-4.7.6-cp35-cp35m-win32.whl", hash = "sha256:5141c13374e6b25fe6bf092052ab55c0c03d21bd66c94a0e3ae371d3e4d865a5"}, - {file = "multidict-4.7.6-cp35-cp35m-win_amd64.whl", hash = "sha256:9456e90649005ad40558f4cf51dbb842e32807df75146c6d940b6f5abb4a78f3"}, - {file = "multidict-4.7.6-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:e0d072ae0f2a179c375f67e3da300b47e1a83293c554450b29c900e50afaae87"}, - {file = "multidict-4.7.6-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3750f2205b800aac4bb03b5ae48025a64e474d2c6cc79547988ba1d4122a09e2"}, - {file = "multidict-4.7.6-cp36-cp36m-win32.whl", hash = "sha256:f07acae137b71af3bb548bd8da720956a3bc9f9a0b87733e0899226a2317aeb7"}, - {file = "multidict-4.7.6-cp36-cp36m-win_amd64.whl", hash = "sha256:6513728873f4326999429a8b00fc7ceddb2509b01d5fd3f3be7881a257b8d463"}, - {file = "multidict-4.7.6-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:feed85993dbdb1dbc29102f50bca65bdc68f2c0c8d352468c25b54874f23c39d"}, - {file = "multidict-4.7.6-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:fcfbb44c59af3f8ea984de67ec7c306f618a3ec771c2843804069917a8f2e255"}, - {file = "multidict-4.7.6-cp37-cp37m-win32.whl", hash = "sha256:4538273208e7294b2659b1602490f4ed3ab1c8cf9dbdd817e0e9db8e64be2507"}, - {file = "multidict-4.7.6-cp37-cp37m-win_amd64.whl", hash = "sha256:d14842362ed4cf63751648e7672f7174c9818459d169231d03c56e84daf90b7c"}, - {file = "multidict-4.7.6-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:c026fe9a05130e44157b98fea3ab12969e5b60691a276150db9eda71710cd10b"}, - {file = "multidict-4.7.6-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:51a4d210404ac61d32dada00a50ea7ba412e6ea945bbe992e4d7a595276d2ec7"}, - {file = "multidict-4.7.6-cp38-cp38-win32.whl", hash = "sha256:5cf311a0f5ef80fe73e4f4c0f0998ec08f954a6ec72b746f3c179e37de1d210d"}, - {file = "multidict-4.7.6-cp38-cp38-win_amd64.whl", hash = "sha256:7388d2ef3c55a8ba80da62ecfafa06a1c097c18032a501ffd4cabbc52d7f2b19"}, - {file = "multidict-4.7.6.tar.gz", hash = "sha256:fbb77a75e529021e7c4a8d4e823d88ef4d23674a202be4f5addffc72cbb91430"}, -] -packageurl-python = [ - {file = "packageurl-python-0.9.3.tar.gz", hash = "sha256:c54add03a464d4779ee50350231aabb971751bbf52389acbcd0149e2ea7122aa"}, - {file = "packageurl_python-0.9.3-py2.py3-none-any.whl", hash = "sha256:0682b2eddab16151da5bd4ef38081e9b27f8eb33cd29baf41f4996d4e88e6e70"}, -] -packaging = [ - {file = "packaging-19.2-py2.py3-none-any.whl", hash = "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108"}, - {file = "packaging-19.2.tar.gz", hash = "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47"}, -] -parso = [ - {file = "parso-0.7.0-py2.py3-none-any.whl", hash = "sha256:158c140fc04112dc45bca311633ae5033c2c2a7b732fa33d0955bad8152a8dd0"}, - {file = "parso-0.7.0.tar.gz", hash = "sha256:908e9fae2144a076d72ae4e25539143d40b8e3eafbaeae03c1bfe226f4cdf12c"}, -] -pexpect = [ - {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"}, - {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, -] -pluggy = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, -] -prompt-toolkit = [ - {file = "prompt_toolkit-3.0.5-py3-none-any.whl", hash = "sha256:df7e9e63aea609b1da3a65641ceaf5bc7d05e0a04de5bd45d05dbeffbabf9e04"}, - {file = "prompt_toolkit-3.0.5.tar.gz", hash = "sha256:563d1a4140b63ff9dd587bda9557cffb2fe73650205ab6f4383092fb882e7dc8"}, -] -psycopg2 = [ - {file = "psycopg2-2.8.4-cp27-cp27m-win32.whl", hash = "sha256:72772181d9bad1fa349792a1e7384dde56742c14af2b9986013eb94a240f005b"}, - {file = "psycopg2-2.8.4-cp27-cp27m-win_amd64.whl", hash = "sha256:893c11064b347b24ecdd277a094413e1954f8a4e8cdaf7ffbe7ca3db87c103f0"}, - {file = "psycopg2-2.8.4-cp34-cp34m-win32.whl", hash = "sha256:9ab75e0b2820880ae24b7136c4d230383e07db014456a476d096591172569c38"}, - {file = "psycopg2-2.8.4-cp34-cp34m-win_amd64.whl", hash = "sha256:b0845e3bdd4aa18dc2f9b6fb78fbd3d9d371ad167fd6d1b7ad01c0a6cdad4fc6"}, - {file = "psycopg2-2.8.4-cp35-cp35m-win32.whl", hash = "sha256:ef6df7e14698e79c59c7ee7cf94cd62e5b869db369ed4b1b8f7b729ea825712a"}, - {file = "psycopg2-2.8.4-cp35-cp35m-win_amd64.whl", hash = "sha256:965c4c93e33e6984d8031f74e51227bd755376a9df6993774fd5b6fb3288b1f4"}, - {file = "psycopg2-2.8.4-cp36-cp36m-win32.whl", hash = "sha256:ed686e5926929887e2c7ae0a700e32c6129abb798b4ad2b846e933de21508151"}, - {file = "psycopg2-2.8.4-cp36-cp36m-win_amd64.whl", hash = "sha256:dca2d7203f0dfce8ea4b3efd668f8ea65cd2b35112638e488a4c12594015f67b"}, - {file = "psycopg2-2.8.4-cp37-cp37m-win32.whl", hash = "sha256:8396be6e5ff844282d4d49b81631772f80dabae5658d432202faf101f5283b7c"}, - {file = "psycopg2-2.8.4-cp37-cp37m-win_amd64.whl", hash = "sha256:47fc642bf6f427805daf52d6e52619fe0637648fe27017062d898f3bf891419d"}, - {file = "psycopg2-2.8.4-cp38-cp38-win32.whl", hash = "sha256:4212ca404c4445dc5746c0d68db27d2cbfb87b523fe233dc84ecd24062e35677"}, - {file = "psycopg2-2.8.4-cp38-cp38-win_amd64.whl", hash = "sha256:92a07dfd4d7c325dd177548c4134052d4842222833576c8391aab6f74038fc3f"}, - {file = "psycopg2-2.8.4.tar.gz", hash = "sha256:f898e5cc0a662a9e12bde6f931263a1bbd350cfb18e1d5336a12927851825bb6"}, -] -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.0-py2.py3-none-any.whl", hash = "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa"}, - {file = "py-1.8.0.tar.gz", hash = "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53"}, -] -pycodestyle = [ - {file = "pycodestyle-2.5.0-py2.py3-none-any.whl", hash = "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56"}, - {file = "pycodestyle-2.5.0.tar.gz", hash = "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"}, -] -pycparser = [ - {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, - {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, -] -pygit2 = [ - {file = "pygit2-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:997430ffbf3a327c3608ae6b0c18c714b3334bfb6e88d850746f37ccd29c61ab"}, - {file = "pygit2-1.2.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:ed13fd6945b7508f1763d5d170dedbc7001601afed606f989d778019c2a198f6"}, - {file = "pygit2-1.2.0-cp36-cp36m-win32.whl", hash = "sha256:10c7b5ff733d75f198233012fe33570d8f9bec2dd73079edfd42a892a8322629"}, - {file = "pygit2-1.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:55965517b2775d34878d87ab2e66edbd3a3a9ff5fc9181e342e40511d5bea63f"}, - {file = "pygit2-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:32b210da98c7e37800db5b2d4b9217ba933e3f58b34a8894bea02ed12601bccf"}, - {file = "pygit2-1.2.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:a65dbe2485f7d888d46a70f192e7e7ab0a0d4623c8c2974dbbf98da235338e48"}, - {file = "pygit2-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:c7484d277319a347aa44dd0363320d34059716a7b95b4609c40572188229405e"}, - {file = "pygit2-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1fc1afe2acd06811416adc67942259eaa903f86a2f631d92d7fa5b0e9ad36a0c"}, - {file = "pygit2-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a8688eab31cdd773236dd594712072fa20f9f6e3766e2f016c9a580149c2cd82"}, - {file = "pygit2-1.2.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:5916e8ce38cfc30fb1798c29ed8ffa87317a4125096e5008d78951e3a8f907ee"}, - {file = "pygit2-1.2.0-cp38-cp38-win32.whl", hash = "sha256:12cc53e7d812404e6121840216885e23dbcf4577c1f0929b5660b12b4f35312c"}, - {file = "pygit2-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:ab07a81b5411be041784ca6334fb4467a76c4c272d53abe33178651e5dbbc015"}, - {file = "pygit2-1.2.0.tar.gz", hash = "sha256:f991347f5b11589ac8dc5a3c8257a514cf802545b75c11133a43ae9f76388278"}, -] -pygments = [ - {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, - {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, -] -pyparsing = [ - {file = "pyparsing-2.4.5-py2.py3-none-any.whl", hash = "sha256:20f995ecd72f2a1f4bf6b072b63b22e2eb457836601e76d6e5dfcd75436acc1f"}, - {file = "pyparsing-2.4.5.tar.gz", hash = "sha256:4ca62001be367f01bd3e92ecbb79070272a9d4964dce6a48a82ff0b8bc7e683a"}, -] -pytest = [ - {file = "pytest-5.3.2-py3-none-any.whl", hash = "sha256:e41d489ff43948babd0fad7ad5e49b8735d5d55e26628a58673c39ff61d95de4"}, - {file = "pytest-5.3.2.tar.gz", hash = "sha256:6b571215b5a790f9b41f19f3531c53a45cf6bb8ef2988bc1ff9afb38270b25fa"}, -] -pytest-dependency = [ - {file = "pytest-dependency-0.4.0.tar.gz", hash = "sha256:bda0ef48e6a44c091399b12ab4a7e580d2dd8294c222b301f88d7d57f47ba142"}, -] -pytest-django = [ - {file = "pytest-django-3.7.0.tar.gz", hash = "sha256:17592f06d51c2ef4b7a0fb24aa32c8b6998506a03c8439606cb96db160106659"}, - {file = "pytest_django-3.7.0-py2.py3-none-any.whl", hash = "sha256:ef3d15b35ed7e46293475e6f282e71a53bcd8c6f87bdc5d5e7ad0f4d49352127"}, -] -pytest-mock = [ - {file = "pytest-mock-1.13.0.tar.gz", hash = "sha256:e24a911ec96773022ebcc7030059b57cd3480b56d4f5d19b7c370ec635e6aed5"}, - {file = "pytest_mock-1.13.0-py2.py3-none-any.whl", hash = "sha256:67e414b3caef7bff6fc6bd83b22b5bc39147e4493f483c2679bc9d4dc485a94d"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, - {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, -] -pytoml = [ - {file = "pytoml-0.1.21-py2.py3-none-any.whl", hash = "sha256:57a21e6347049f73bfb62011ff34cd72774c031b9828cb628a752225136dfc33"}, - {file = "pytoml-0.1.21.tar.gz", hash = "sha256:8eecf7c8d0adcff3b375b09fe403407aa9b645c499e5ab8cac670ac4a35f61e7"}, -] -pytz = [ - {file = "pytz-2019.3-py2.py3-none-any.whl", hash = "sha256:1c557d7d0e871de1f5ccd5833f60fb2550652da6be2693c1e02300743d21500d"}, - {file = "pytz-2019.3.tar.gz", hash = "sha256:b02c06db6cf09c12dd25137e563b31700d3b80fcc4ad23abb7a315f2789819be"}, -] -pyyaml = [ - {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, - {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, - {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, - {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, - {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, -] -requests = [ - {file = "requests-2.23.0-py2.7.egg", hash = "sha256:5d2d0ffbb515f39417009a46c14256291061ac01ba8f875b90cad137de83beb4"}, - {file = "requests-2.23.0-py2.py3-none-any.whl", hash = "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee"}, - {file = "requests-2.23.0.tar.gz", hash = "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"}, -] -"ruamel.yaml" = [ - {file = "ruamel.yaml-0.16.12-py2.py3-none-any.whl", hash = "sha256:012b9470a0ea06e4e44e99e7920277edf6b46eee0232a04487ea73a7386340a5"}, - {file = "ruamel.yaml-0.16.12.tar.gz", hash = "sha256:076cc0bc34f1966d920a49f18b52b6ad559fbe656a0748e3535cf7b3f29ebf9e"}, -] -"ruamel.yaml.clib" = [ - {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:28116f204103cb3a108dfd37668f20abe6e3cafd0d3fd40dba126c732457b3cc"}, - {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:daf21aa33ee9b351f66deed30a3d450ab55c14242cfdfcd377798e2c0d25c9f1"}, - {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win32.whl", hash = "sha256:30dca9bbcbb1cc858717438218d11eafb78666759e5094dd767468c0d577a7e7"}, - {file = "ruamel.yaml.clib-0.2.2-cp27-cp27m-win_amd64.whl", hash = "sha256:f6061a31880c1ed6b6ce341215336e2f3d0c1deccd84957b6fa8ca474b41e89f"}, - {file = "ruamel.yaml.clib-0.2.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:73b3d43e04cc4b228fa6fa5d796409ece6fcb53a6c270eb2048109cbcbc3b9c2"}, - {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:53b9dd1abd70e257a6e32f934ebc482dac5edb8c93e23deb663eac724c30b026"}, - {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:839dd72545ef7ba78fd2aa1a5dd07b33696adf3e68fae7f31327161c1093001b"}, - {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win32.whl", hash = "sha256:b1e981fe1aff1fd11627f531524826a4dcc1f26c726235a52fcb62ded27d150f"}, - {file = "ruamel.yaml.clib-0.2.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4e52c96ca66de04be42ea2278012a2342d89f5e82b4512fb6fb7134e377e2e62"}, - {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a873e4d4954f865dcb60bdc4914af7eaae48fb56b60ed6daa1d6251c72f5337c"}, - {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ab845f1f51f7eb750a78937be9f79baea4a42c7960f5a94dde34e69f3cce1988"}, - {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win32.whl", hash = "sha256:e9f7d1d8c26a6a12c23421061f9022bb62704e38211fe375c645485f38df34a2"}, - {file = "ruamel.yaml.clib-0.2.2-cp36-cp36m-win_amd64.whl", hash = "sha256:2602e91bd5c1b874d6f93d3086f9830f3e907c543c7672cf293a97c3fabdcd91"}, - {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:44c7b0498c39f27795224438f1a6be6c5352f82cb887bc33d962c3a3acc00df6"}, - {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8e8fd0a22c9d92af3a34f91e8a2594eeb35cba90ab643c5e0e643567dc8be43e"}, - {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win32.whl", hash = "sha256:464e66a04e740d754170be5e740657a3b3b6d2bcc567f0c3437879a6e6087ff6"}, - {file = "ruamel.yaml.clib-0.2.2-cp37-cp37m-win_amd64.whl", hash = "sha256:52ae5739e4b5d6317b52f5b040b1b6639e8af68a5b8fd606a8b08658fbd0cab5"}, - {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4df5019e7783d14b79217ad9c56edf1ba7485d614ad5a385d1b3c768635c81c0"}, - {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5254af7d8bdf4d5484c089f929cb7f5bafa59b4f01d4f48adda4be41e6d29f99"}, - {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win32.whl", hash = "sha256:74161d827407f4db9072011adcfb825b5258a5ccb3d2cd518dd6c9edea9e30f1"}, - {file = "ruamel.yaml.clib-0.2.2-cp38-cp38-win_amd64.whl", hash = "sha256:058a1cc3df2a8aecc12f983a48bda99315cebf55a3b3a5463e37bb599b05727b"}, - {file = "ruamel.yaml.clib-0.2.2.tar.gz", hash = "sha256:2d24bd98af676f4990c4d715bcdc2a60b19c56a3fb3a763164d2d8ca0e806ba7"}, -] -saneyaml = [ - {file = "saneyaml-0.4-py2.py3-none-any.whl", hash = "sha256:f0d5bdd51649f3253ca8c2d9e48c78540c39d9d035810a2cd4406dbeffd8da11"}, - {file = "saneyaml-0.4.tar.gz", hash = "sha256:9a1863a9d27586fd86c30b9736478a7d441bf1d118cdc71a2fec0d94cfc3cf5c"}, -] -schema = [ - {file = "schema-0.7.1-py2.py3-none-any.whl", hash = "sha256:10b550886f5ff402e1fdef85bd7be761b0e09a35a43633311807a57a5bc4db50"}, - {file = "schema-0.7.1.tar.gz", hash = "sha256:c9dc8f4624e287c7d1435f8fd758f6a0aabbb7eff442db9192cd46f0e2b6d959"}, -] -six = [ - {file = "six-1.13.0-py2.py3-none-any.whl", hash = "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd"}, - {file = "six-1.13.0.tar.gz", hash = "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66"}, -] -soupsieve = [ - {file = "soupsieve-1.9.5-py2.py3-none-any.whl", hash = "sha256:bdb0d917b03a1369ce964056fc195cfdff8819c40de04695a80bc813c3cfa1f5"}, - {file = "soupsieve-1.9.5.tar.gz", hash = "sha256:e2c1c5dee4a1c36bcb790e0fabd5492d874b8ebd4617622c4f6a731701060dda"}, -] -sqlparse = [ - {file = "sqlparse-0.3.0-py2.py3-none-any.whl", hash = "sha256:40afe6b8d4b1117e7dff5504d7a8ce07d9a1b15aeeade8a2d10f130a834f8177"}, - {file = "sqlparse-0.3.0.tar.gz", hash = "sha256:7c3dca29c022744e95b547e867cee89f4fce4373f3549ccd8797d8eb52cdb873"}, -] -tqdm = [ - {file = "tqdm-4.41.1-py2.py3-none-any.whl", hash = "sha256:efab950cf7cc1e4d8ee50b2bb9c8e4a89f8307b49e0b2c9cfef3ec4ca26655eb"}, - {file = "tqdm-4.41.1.tar.gz", hash = "sha256:4789ccbb6fc122b5a6a85d512e4e41fc5acad77216533a6f2b8ce51e0f265c23"}, -] -traitlets = [ - {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, - {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, -] -uritemplate = [ - {file = "uritemplate-3.0.1-py2.py3-none-any.whl", hash = "sha256:07620c3f3f8eed1f12600845892b0e036a2420acf513c53f7de0abd911a5894f"}, - {file = "uritemplate-3.0.1.tar.gz", hash = "sha256:5af8ad10cec94f215e3f48112de2022e1d5a37ed427fbd88652fa908f2ab7cae"}, -] -urllib3 = [ - {file = "urllib3-1.25.11-py2.py3-none-any.whl", hash = "sha256:f5321fbe4bf3fefa0efd0bfe7fb14e90909eb62a48ccda331726b4319897dd5e"}, - {file = "urllib3-1.25.11.tar.gz", hash = "sha256:8d7eaa5a82a1cac232164990f04874c594c9453ec55eef02eab885aa02fc17a2"}, -] -wcwidth = [ - {file = "wcwidth-0.1.7-py2.py3-none-any.whl", hash = "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"}, - {file = "wcwidth-0.1.7.tar.gz", hash = "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e"}, -] -whitenoise = [ - {file = "whitenoise-5.0.1-py2.py3-none-any.whl", hash = "sha256:62556265ec1011bd87113fb81b7516f52688887b7a010ee899ff1fd18fd22700"}, - {file = "whitenoise-5.0.1.tar.gz", hash = "sha256:0f9137f74bd95fa54329ace88d8dc695fbe895369a632e35f7a136e003e41d73"}, -] -yarl = [ - {file = "yarl-1.6.3-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:0355a701b3998dcd832d0dc47cc5dedf3874f966ac7f870e0f3a6788d802d434"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:bafb450deef6861815ed579c7a6113a879a6ef58aed4c3a4be54400ae8871478"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:547f7665ad50fa8563150ed079f8e805e63dd85def6674c97efd78eed6c224a6"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:63f90b20ca654b3ecc7a8d62c03ffa46999595f0167d6450fa8383bab252987e"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:97b5bdc450d63c3ba30a127d018b866ea94e65655efaf889ebeabc20f7d12406"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d8d07d102f17b68966e2de0e07bfd6e139c7c02ef06d3a0f8d2f0f055e13bb76"}, - {file = "yarl-1.6.3-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:15263c3b0b47968c1d90daa89f21fcc889bb4b1aac5555580d74565de6836366"}, - {file = "yarl-1.6.3-cp36-cp36m-win32.whl", hash = "sha256:b5dfc9a40c198334f4f3f55880ecf910adebdcb2a0b9a9c23c9345faa9185721"}, - {file = "yarl-1.6.3-cp36-cp36m-win_amd64.whl", hash = "sha256:b2e9a456c121e26d13c29251f8267541bd75e6a1ccf9e859179701c36a078643"}, - {file = "yarl-1.6.3-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:ce3beb46a72d9f2190f9e1027886bfc513702d748047b548b05dab7dfb584d2e"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2ce4c621d21326a4a5500c25031e102af589edb50c09b321049e388b3934eec3"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:d26608cf178efb8faa5ff0f2d2e77c208f471c5a3709e577a7b3fd0445703ac8"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:4c5bcfc3ed226bf6419f7a33982fb4b8ec2e45785a0561eb99274ebbf09fdd6a"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4736eaee5626db8d9cda9eb5282028cc834e2aeb194e0d8b50217d707e98bb5c"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:68dc568889b1c13f1e4745c96b931cc94fdd0defe92a72c2b8ce01091b22e35f"}, - {file = "yarl-1.6.3-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:7356644cbed76119d0b6bd32ffba704d30d747e0c217109d7979a7bc36c4d970"}, - {file = "yarl-1.6.3-cp37-cp37m-win32.whl", hash = "sha256:00d7ad91b6583602eb9c1d085a2cf281ada267e9a197e8b7cae487dadbfa293e"}, - {file = "yarl-1.6.3-cp37-cp37m-win_amd64.whl", hash = "sha256:69ee97c71fee1f63d04c945f56d5d726483c4762845400a6795a3b75d56b6c50"}, - {file = "yarl-1.6.3-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:e46fba844f4895b36f4c398c5af062a9808d1f26b2999c58909517384d5deda2"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:31ede6e8c4329fb81c86706ba8f6bf661a924b53ba191b27aa5fcee5714d18ec"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fcbb48a93e8699eae920f8d92f7160c03567b421bc17362a9ffbbd706a816f71"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:72a660bdd24497e3e84f5519e57a9ee9220b6f3ac4d45056961bf22838ce20cc"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:324ba3d3c6fee56e2e0b0d09bf5c73824b9f08234339d2b788af65e60040c959"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e6b5460dc5ad42ad2b36cca524491dfcaffbfd9c8df50508bddc354e787b8dc2"}, - {file = "yarl-1.6.3-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:6d6283d8e0631b617edf0fd726353cb76630b83a089a40933043894e7f6721e2"}, - {file = "yarl-1.6.3-cp38-cp38-win32.whl", hash = "sha256:9ede61b0854e267fd565e7527e2f2eb3ef8858b301319be0604177690e1a3896"}, - {file = "yarl-1.6.3-cp38-cp38-win_amd64.whl", hash = "sha256:f0b059678fd549c66b89bed03efcabb009075bd131c248ecdf087bdb6faba24a"}, - {file = "yarl-1.6.3-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:329412812ecfc94a57cd37c9d547579510a9e83c516bc069470db5f75684629e"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:c49ff66d479d38ab863c50f7bb27dee97c6627c5fe60697de15529da9c3de724"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f040bcc6725c821a4c0665f3aa96a4d0805a7aaf2caf266d256b8ed71b9f041c"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:d5c32c82990e4ac4d8150fd7652b972216b204de4e83a122546dce571c1bdf25"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:d597767fcd2c3dc49d6eea360c458b65643d1e4dbed91361cf5e36e53c1f8c96"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:8aa3decd5e0e852dc68335abf5478a518b41bf2ab2f330fe44916399efedfae0"}, - {file = "yarl-1.6.3-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:73494d5b71099ae8cb8754f1df131c11d433b387efab7b51849e7e1e851f07a4"}, - {file = "yarl-1.6.3-cp39-cp39-win32.whl", hash = "sha256:5b883e458058f8d6099e4420f0cc2567989032b5f34b271c0827de9f1079a424"}, - {file = "yarl-1.6.3-cp39-cp39-win_amd64.whl", hash = "sha256:4953fb0b4fdb7e08b2f3b3be80a00d28c5c8a2056bb066169de00e6501b986b6"}, - {file = "yarl-1.6.3.tar.gz", hash = "sha256:8a9066529240171b68893d60dca86a763eae2139dd42f42106b03cf4b426bf10"}, -] -zipp = [ - {file = "zipp-0.6.0-py2.py3-none-any.whl", hash = "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335"}, - {file = "zipp-0.6.0.tar.gz", hash = "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e"}, -] diff --git a/etc/nix/pyproject.toml.generated b/etc/nix/pyproject.toml.generated deleted file mode 100644 index 770f3888b..000000000 --- a/etc/nix/pyproject.toml.generated +++ /dev/null @@ -1,72 +0,0 @@ -[tool.poetry] -name = "vulnerablecode" -version = "20.10" -description = "Software package vulnerabilities database." -authors = ["nexB Inc. and others "] -license = "Apache-2.0" - -[tool.poetry.dependencies] -python = "^3.8" -aiohttp = "==3.6.2" -asgiref = "==3.2.7" -attrs = "==19.3.0" -backcall = "==0.1.0" -beautifulsoup4 = "==4.7.1" -cached-property = "==1.5.1" -cffi = "==1.14.0" -contextlib2 = "==0.5.5" -decorator = "==4.4.2" -dephell-specifier = "==0.2.1" -dj-database-url = "==0.4.2" -Django = "==3.0.7" -django-filter = "==2.2.0" -djangorestframework = "==3.11.0" -django-widget-tweaks = "==1.4.8" -drf-yasg = "==1.17.1" -gunicorn = "==19.7.1" -importlib-metadata = "==1.3.0" -ipython = "==7.13.0" -ipython-genutils = "==0.2.0" -jedi = "==0.17.0" -lxml = "==4.3.3" -more-itertools = "==8.0.2" -packageurl-python = "==0.9.3" -packaging = "==19.2" -parso = "==0.7.0" -pexpect = "==4.8.0" -pickleshare = "==0.7.5" -pluggy = "==0.13.1" -prompt-toolkit = "==3.0.5" -psycopg2 = "==2.8.4" -ptyprocess = "==0.6.0" -py = "==1.8.0" -pycodestyle = "==2.5.0" -pycparser = "==2.20" -pygit2 = "==1.2.0" -Pygments = "==2.6.1" -pyparsing = "==2.4.5" -pytest = "==5.3.2" -pytest-dependency = "==0.4.0" -pytest-django = "==3.7.0" -pytest-mock = "==1.13.0" -python-dateutil = "==2.8.1" -pytoml = "==0.1.21" -pytz = "==2019.3" -PyYAML = "==5.3.1" -saneyaml = "==0.4" -schema = "==0.7.1" -six = "==1.13.0" -soupsieve = "==1.9.5" -sqlparse = "==0.3.0" -tqdm = "==4.41.1" -traitlets = "==4.3.3" -wcwidth = "==0.1.7" -whitenoise = "==5.0.1" -zipp = "==0.6.0" -requests = "==2.23.0" - -[tool.poetry.dev-dependencies] - -[build-system] -requires = ["poetry>=0.12"] -build-backend = "poetry.masonry.api" diff --git a/etc/nix/test-import-using-nix.sh b/etc/nix/test-import-using-nix.sh index e2e0e8105..641289ecb 100755 --- a/etc/nix/test-import-using-nix.sh +++ b/etc/nix/test-import-using-nix.sh @@ -5,15 +5,16 @@ # checkout. set -e + +THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" DEFAULT_INSTALL_DIR=$VULNERABLECODE_INSTALL_DIR # in the Nix store, see flake.nix INSTALL_DIR=${INSTALL_DIR:-$DEFAULT_INSTALL_DIR} ARGS=$(if [ $# -eq 0 ]; then echo "--all"; else echo "$@"; fi) export DJANGO_DEV=${DJANGO_DEV:-1} +TEMPDIR=$(mktemp -d -p "$THIS_DIR") +export TEMPDIR -export THIS_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -export TEMPDIR=$(mktemp -d -p "$THIS_DIR") -export DATADIR="${TEMPDIR}/pgdata" -export RUNDIR="${TEMPDIR}/run" +source "$THIS_DIR/lib.sh" cleanup() { pg_ctl -D "$DATADIR" stop @@ -22,12 +23,7 @@ cleanup() { trap cleanup EXIT -ENCODING="UTF-8" -mkdir -p "$RUNDIR" -initdb -D "$DATADIR" -E $ENCODING -pg_ctl -D "$DATADIR" -o "-k $RUNDIR" -l "$DATADIR/logfile" start -createuser --host "$RUNDIR" --no-createrole --no-superuser --login --inherit --createdb vulnerablecode -createdb --host "$RUNDIR" -E $ENCODING --owner=vulnerablecode --user=vulnerablecode --port=5432 vulnerablecode +initPostgres "$TEMPDIR" "$INSTALL_DIR/manage.py" migrate "$INSTALL_DIR/manage.py" import $ARGS From 7dfdc99e3fd3ff682ed04afeed009a4671c58d5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Sat, 12 Dec 2020 12:57:05 +0100 Subject: [PATCH 18/21] Improve docs. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- README.rst | 4 ++-- etc/nix/flake.nix | 1 + etc/nix/lib.sh | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index ca8c00c02..226e2cb40 100644 --- a/README.rst +++ b/README.rst @@ -146,7 +146,7 @@ There are several options to use the Nix version :: - # Enter an interactive environment with all dependencies setup. + # Enter an interactive environment with all dependencies set up. cd etc/nix nix develop > ../../manage.py ... # invoke the local checkout @@ -162,7 +162,7 @@ There are several options to use the Nix version The Nix installation uses `mach-nix `__ to handle Python dependencies because some dependencies are currently not available as Nix packages. All Python dependencies are automatically fetched from ``./requirements.txt``. -Non-Python dependencies are curated in ``etc/nix/flake.nix:Vulnerablecode.propagatedBuildInputs``. +Non-Python dependencies are curated in ``etc/nix/flake.nix:vulnerablecode.propagatedBuildInputs``. Tests diff --git a/etc/nix/flake.nix b/etc/nix/flake.nix index 6ef76f405..881c976fd 100644 --- a/etc/nix/flake.nix +++ b/etc/nix/flake.nix @@ -25,6 +25,7 @@ version = builtins.head (builtins.match ''.*version=["']?([^"',]+).*'' (builtins.readFile (vulnerablecode-src + "/setup.py"))); + # Common shell code. libSh = ./lib.sh; # System types to support. diff --git a/etc/nix/lib.sh b/etc/nix/lib.sh index ebd84ab3a..ec717180d 100644 --- a/etc/nix/lib.sh +++ b/etc/nix/lib.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Setup postgres; see the README.md for the the latest instructions. +# Setup postgres; see the README.md for the latest instructions. # # $RUNDIR is used to prevent postgres from accessings its default run dir at # /run/postgresql. See From 2dd75c5c947a8cb798abdeb263bec4aa2c9fd695 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Sat, 16 Jan 2021 21:29:14 +0100 Subject: [PATCH 19/21] Work in PR comments. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- etc/nix/flake.nix | 14 ++++++-------- etc/nix/lib.sh | 2 +- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/etc/nix/flake.nix b/etc/nix/flake.nix index 881c976fd..f4c863d74 100644 --- a/etc/nix/flake.nix +++ b/etc/nix/flake.nix @@ -55,11 +55,10 @@ overlay = final: prev: with final.pkgs; { - pythonEnv = with machnixFor.${system}; - mkPython { - requirements = - builtins.readFile (vulnerablecode-src + "/requirements.txt"); - }; + pythonEnv = machnixFor.${system}.mkPython { + requirements = + builtins.readFile (vulnerablecode-src + "/requirements.txt"); + }; vulnerablecode = stdenv.mkDerivation { inherit version; @@ -90,7 +89,7 @@ buildInputs = [ vulnerablecode ]; shellHook = '' alias vulnerablecode-manage.py=${vulnerablecode}/manage.py - ''; + ''; }); # Provide some packages for selected system types. @@ -103,8 +102,7 @@ # Tests run by 'nix flake check' and by Hydra. checks = forAllSystems (system: { - inherit (self.packages.${system}) - ; + inherit (self.packages.${system}) vulnerablecode; vulnerablecode-test = with nixpkgsFor.${system}; stdenv.mkDerivation { diff --git a/etc/nix/lib.sh b/etc/nix/lib.sh index ec717180d..fc75cf5c9 100644 --- a/etc/nix/lib.sh +++ b/etc/nix/lib.sh @@ -1,6 +1,6 @@ #!/usr/bin/env bash -# Setup postgres; see the README.md for the latest instructions. +# Setup postgres; see the README for the latest instructions. # # $RUNDIR is used to prevent postgres from accessings its default run dir at # /run/postgresql. See From 65b78f4d6cb52b7a747940c345227289a99ecc08 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Wed, 20 Jan 2021 06:57:17 +0100 Subject: [PATCH 20/21] Pin pypi db repo to a 2021-01-20 to include necessary deps. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- etc/nix/flake.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/etc/nix/flake.nix b/etc/nix/flake.nix index f4c863d74..f8772d0a0 100644 --- a/etc/nix/flake.nix +++ b/etc/nix/flake.nix @@ -47,6 +47,13 @@ import machnix { pkgs = (nixpkgsFor.${system}).pkgs; python = "python38"; + + # Pin pypi repo to a specific commit which includes all necessary + # Python deps. The corresponding sha256 hash can be obtained with: + # $ nix-prefetch-url --unpack https://github.com/DavHau/pypi-deps-db/tarball/ + pypiDataRev = "c86b4490a7d838bd54a2d82730455e96c6e4eb14"; + pypiDataSha256 = + "0al490gi0qda1nkb9289z2msgpc633rv5hn3w5qihkl1rh88dmjd"; }); in { From 3f732cd6868b2c3d6897cdeb2aef3ee4aa6771de Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rolf=20Schr=C3=B6der?= Date: Wed, 20 Jan 2021 09:26:26 +0100 Subject: [PATCH 21/21] Update docs. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rolf Schröder --- README.rst | 4 +++- etc/nix/flake.nix | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/README.rst b/README.rst index 7b5e2bb86..2bc43ef4b 100644 --- a/README.rst +++ b/README.rst @@ -162,6 +162,8 @@ There are several options to use the Nix version The Nix installation uses `mach-nix `__ to handle Python dependencies because some dependencies are currently not available as Nix packages. All Python dependencies are automatically fetched from ``./requirements.txt``. +If the ``mach-nix``-based installation fails, you might need to update ``mach-nix`` itself and the `pypi-deps-db `_ version in use (see ``etc/nix/flake.nix:inputs.machnix`` and ``machnixFor.pypiDataRev``). + Non-Python dependencies are curated in ``etc/nix/flake.nix:vulnerablecode.propagatedBuildInputs``. @@ -260,4 +262,4 @@ For full documentation about API endpoints. .. |Gitter chat| image:: https://badges.gitter.im/gitterHQ/gitter.png :target: https://gitter.im/aboutcode-org/vulnerablecode .. |PRs Welcome| image:: https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square - :target: http://makeapullrequest.com \ No newline at end of file + :target: http://makeapullrequest.com diff --git a/etc/nix/flake.nix b/etc/nix/flake.nix index f8772d0a0..0ae9f6627 100644 --- a/etc/nix/flake.nix +++ b/etc/nix/flake.nix @@ -49,7 +49,9 @@ python = "python38"; # Pin pypi repo to a specific commit which includes all necessary - # Python deps. The corresponding sha256 hash can be obtained with: + # Python deps. The default version is updated with every mach-nix + # release might be be sufficient for newer releases. + # The corresponding sha256 hash can be obtained with: # $ nix-prefetch-url --unpack https://github.com/DavHau/pypi-deps-db/tarball/ pypiDataRev = "c86b4490a7d838bd54a2d82730455e96c6e4eb14"; pypiDataSha256 =