From cb9a7f7ad52d0a66f820a2684fe5df26aa5ed544 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 14:40:00 -0500 Subject: [PATCH 01/39] Initial poetry support --- .gitignore | 1 + bin/__init__.py | 0 bin/{relate => relate.py} | 0 pyproject.toml | 98 +++++++++++++++++++++++++++++++++++++++ setup.py | 48 ------------------- 5 files changed, 99 insertions(+), 48 deletions(-) create mode 100644 bin/__init__.py rename bin/{relate => relate.py} (100%) create mode 100644 pyproject.toml delete mode 100644 setup.py diff --git a/.gitignore b/.gitignore index 3fc425ee..edc7b5d6 100644 --- a/.gitignore +++ b/.gitignore @@ -14,6 +14,7 @@ virtualenv-[0-9]* *.egg-info build +/dist/ *.pyz diff --git a/bin/__init__.py b/bin/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/bin/relate b/bin/relate.py similarity index 100% rename from bin/relate rename to bin/relate.py diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..bfb10367 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,98 @@ +[build-system] +requires = ["poetry>=0.12"] +build-backend = "poetry.masonry.api" + +[tool.poetry] +name = "relate-courseware" +version = "2016.1" +description = "RELATE courseware" +readme = "README.rst" +repository = "https://github.com/inducer/relate" +documentation = "https://documen.tician.de/relate/" +authors = ["Andreas Kloeckner "] +license = "MIT" +packages = [ + { include = "course" }, + { include = "accounts" }, + { include = "relate" }, + { include = "bin" }, +] + +[tool.poetry.dependencies] +python = "^3.7" +django = "^3.0.7" +# Automatically renders Django forms in a pretty, Bootstrap-compatible way. +django-crispy-forms = ">=1.5.1" +# Page data, answer data, ... all represented in JSON. This makes that editable in the Django admin. +jsonfield = ">=1.4.0" +# /!\ Upstream is dead, using branch for Django 3.0 support +django-yamlfield = {git = "https://github.com/bakatrouble/django-yamlfield.git", rev = "c92d0373d12a02d1e52fb09b44010f156111d7ea"} +# For easy content formatting: +markdown = "^2.6.3" +# For rendering macros in content: +jinja2 = "^2.11.2" +# For math/symbolic questions +pymbolic = "*" +sympy = "*" +# Django timezone support +pytz = "^2020.1" +# Course content is stored in YAML. +pyyaml = "*" +# Dulwich git integration +dulwich = "^0.19" +ecdsa = "^0.15" +# FIXME: 2.7.1 gives bogus 'incorrect padding' error on PEM parsing +paramiko = "<2.7" +# A date picker widget - https://github.com/tutorcruncher/django-bootstrap3-datetimepicker +django-bootstrap3-datetimepicker-2 = "^2.8.2" +# For in-class instant messaging +dnspython = "^1.16.0" +SleekXMPP = "^1.3.3" +# To manage web dependencies +django-npm = "^1.0.0" +# For comfortable code entry +django-codemirror-widget = ">=0.5" +# For code isolation in code questions +docker-py = "^1.10.6" +# For code highlighting, required via the CodeHilite extension to Python-Markdown +pygments = "^2.6.1" +# For grade export +unicodecsv = "^0.14.1" +# To support network matching for facility recognition +ipaddress = "^1.0.23" +# {{{ For interoperation with SAML2/Shibboleth +# 4.6.1 suffers from https://github.com/IdentityPython/pysaml2/pull/543 +# 4.6.5 causes a 403 on /saml2/acs upon sign in with djangosaml2 +# upper bounds just out of caution +pysaml2 = ">=5.0.0,<6" +djangosaml2 = ">=0.19.0,<0.20" +# Explicit dependency decls to work around broken dep declaration in pysaml2 4.6.0 +pyOpenSSL = "^19.1.0" +future = "^0.18.2" +# Try to avoid https://github.com/Julian/jsonschema/issues/449 +attrs = ">=19" +python-memcached = "^1.59" +# A task queue, used to execute long-running tasks +celery = "4.2.1" +kombu = "4.2.2-post1" +django-celery-results = "1.0.1" +# For searchable select widgets +django_select2 = ">=7.4.2,<8" +# To sanitize HTML generated by user code for https://github.com/mozilla/bleach/pull/346 +bleach = {git = "https://github.com/inducer/bleach", rev = "prevent-attribute-value-filtering"} +# For query lexing +pytools = "^2020.2" +# For mypy (static type checking) support +typing = ">=3.6.1" +# For rendering ipython notebook +nbconvert = ">=5.2.1" +IPython = "^7.15.0" +# For relate script +colorama = "*" + +[tool.poetry.dev-dependencies] +codecov = "^2.1.4" +factory_boy = "^2.12.0" + +[tool.poetry.scripts] +relate = "bin.relate:main" diff --git a/setup.py b/setup.py deleted file mode 100644 index fc08e2ba..00000000 --- a/setup.py +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from setuptools import setup, find_packages - -# This script (for now) is only intended to install the 'relate' content helper -# script. Its use is not needed for (and unrelated to) deploying RELATE as a -# web service. - -# Use 'pip install -r requirements.txt' to install prerequisites for RELATE as -# a web service. - -setup(name="relate-courseware", - version="2016.1", - description="RELATE courseware", - long_description=open("README.rst", "rt").read(), - - scripts=["bin/relate"], - author="Andreas Kloeckner", - url="https://github.com/inducer/relate", - author_email="inform@tiker.net", - license="MIT", - packages=find_packages(exclude=['tests']), - install_requires=[ - "django>=3.0.7", - "django-crispy-forms>=1.5.1", - "colorama", - "markdown<3.0", - "dulwich", - "pyyaml", - "nbconvert>=5.2.1", - - # Try to avoid https://github.com/Julian/jsonschema/issues/449 - "attrs>=19", - - "pymbolic", - "sympy", - ], - package_data={ - "relate": [ - "templates/*.html", - ], - "course": [ - "templates/course/*.html", - "templates/course/jinja2/*.tpl", - ], - }, - ) -- GitLab From 1bb11395b475481004f6a5c095dbaf69ef30ca61 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 15:12:28 -0500 Subject: [PATCH 02/39] Cleanup to pass flake8 --- bin/relate.py | 2 +- exercise-docker.py | 8 +++---- local_settings_example.py | 44 +++++++++++++++++++++------------------ manage.py | 2 +- pyproject.toml | 2 ++ setup.cfg | 4 +++- 6 files changed, 35 insertions(+), 27 deletions(-) diff --git a/bin/relate.py b/bin/relate.py index c9468306..1df21764 100644 --- a/bin/relate.py +++ b/bin/relate.py @@ -194,7 +194,7 @@ def test_code_yml(yml_file, repo_root): return for page in pages: - test_code_question(page, repo_root) + test_code_question(page, repo_root) def test_code(args): diff --git a/exercise-docker.py b/exercise-docker.py index 01a12d3a..2c246159 100644 --- a/exercise-docker.py +++ b/exercise-docker.py @@ -11,13 +11,13 @@ def main(): } count = 0 while True: - print count + print(count) count += 1 - res = request_run(req, 5, - image="inducer/runpy-i386") + res = request_python_run(req, 5, image="inducer/runpy-i386") if res["result"] != "success": - print res + print(res) break + if __name__ == "__main__": main() diff --git a/local_settings_example.py b/local_settings_example.py index 104f5f0f..f40d4e90 100644 --- a/local_settings_example.py +++ b/local_settings_example.py @@ -333,8 +333,10 @@ RELATE_SHOW_EDITOR_FORM = True # # import os.path -# RELATE_OVERRIDE_TEMPLATES_DIRS = [os.path.join(os.path.dirname(__file__), "my_templates"), -# os.path.join(os.path.dirname(__file__), "my_other_templates")] +# RELATE_OVERRIDE_TEMPLATES_DIRS = [ +# os.path.join(os.path.dirname(__file__), "my_templates"), +# os.path.join(os.path.dirname(__file__), "my_other_templates") +# ] # }}} @@ -469,6 +471,25 @@ if RELATE_SIGN_IN_BY_SAML2_ENABLED: SAML_DJANGO_USER_MAIN_ATTRIBUTE = 'username' SAML_DJANGO_USER_MAIN_ATTRIBUTE_LOOKUP = '__iexact' + # The list of IdPs we talk to are defined + SAML_IDP = { + # Find the entity ID of your IdP and make this the key here: + 'urn:mace:incommon:uiuc.edu': { + 'single_sign_on_service': { + # Add the POST and REDIRECT bindings for the sign on service here: + saml2.BINDING_HTTP_POST: + 'https://shibboleth.illinois.edu/idp/profile/SAML2/POST/SSO', + saml2.BINDING_HTTP_REDIRECT: + 'https://shibboleth.illinois.edu/idp/profile/SAML2/Redirect/SSO', + }, + 'single_logout_service': { + # And the REDIRECT binding for the logout service here: + saml2.BINDING_HTTP_REDIRECT: + 'https://shibboleth.illinois.edu/idp/logout.jsp', # noqa + }, + }, + } + SAML_CONFIG = { # full path to the xmlsec1 binary programm 'xmlsec_binary': '/usr/bin/xmlsec1', @@ -512,24 +533,7 @@ if RELATE_SIGN_IN_BY_SAML2_ENABLED: # attributes that may be useful to have but not required 'optional_attributes': ['eduPersonAffiliation'], - # in this section the list of IdPs we talk to are defined - 'idp': { - # Find the entity ID of your IdP and make this the key here: - 'urn:mace:incommon:uiuc.edu': { - 'single_sign_on_service': { - # Add the POST and REDIRECT bindings for the sign on service here: - saml2.BINDING_HTTP_POST: - 'https://shibboleth.illinois.edu/idp/profile/SAML2/POST/SSO', - saml2.BINDING_HTTP_REDIRECT: - 'https://shibboleth.illinois.edu/idp/profile/SAML2/Redirect/SSO', - }, - 'single_logout_service': { - # And the REDIRECT binding for the logout service here: - saml2.BINDING_HTTP_REDIRECT: - 'https://shibboleth.illinois.edu/idp/logout.jsp', # noqa - }, - }, - }, + 'idp': SAML_IDP, }, }, diff --git a/manage.py b/manage.py index b7d4dc98..ea410b18 100755 --- a/manage.py +++ b/manage.py @@ -48,7 +48,7 @@ def get_local_test_settings_file(argv): if __name__ == "__main__": os.environ.setdefault("DJANGO_SETTINGS_MODULE", "relate.settings") - from django.core.management import execute_from_command_line, CommandError + from django.core.management import execute_from_command_line if sys.argv[1] == "test": local_settings_file = get_local_test_settings_file(sys.argv) diff --git a/pyproject.toml b/pyproject.toml index bfb10367..51a38d71 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -93,6 +93,8 @@ colorama = "*" [tool.poetry.dev-dependencies] codecov = "^2.1.4" factory_boy = "^2.12.0" +flake8 = "^3.8.3" +pep8-naming = "^0.10.0" [tool.poetry.scripts] relate = "bin.relate:main" diff --git a/setup.cfg b/setup.cfg index d7acc3aa..ae7699c5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,7 +1,7 @@ [flake8] ignore = E126,E127,E128,E123,E226,E241,E242,E265,E402,W503 max-line-length=85 -exclude=course/migrations,accounts/migrations,static,components,course/mdx_mathjax.py +exclude=course/migrations,accounts/migrations,static,components,course/mdx_mathjax.py,saml-config/attribute-maps,doc/conf.py,local_settings.py [coverage:run] source = . @@ -23,6 +23,8 @@ omit = */wsgi.py */tests/* */tests.py + # FIXME: Temporary since this file is now picked up by coverage + bin/* [coverage:report] exclude_lines = -- GitLab From bbba066fc0175935a22658d8a496cbd96088b179 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 16:58:20 -0500 Subject: [PATCH 03/39] Move script into relate tree for simpler packaging --- pyproject.toml | 10 ++++++---- {bin => relate/bin}/__init__.py | 0 {bin => relate/bin}/relate.py | 2 +- setup.cfg | 11 +++++++++++ 4 files changed, 18 insertions(+), 5 deletions(-) rename {bin => relate/bin}/__init__.py (100%) rename {bin => relate/bin}/relate.py (99%) diff --git a/pyproject.toml b/pyproject.toml index 51a38d71..8088eefb 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,9 +15,12 @@ packages = [ { include = "course" }, { include = "accounts" }, { include = "relate" }, - { include = "bin" }, + # { include = "bin" }, ] +[tool.poetry.scripts] +relate = "relate.bin.relate:main" + [tool.poetry.dependencies] python = "^3.7" django = "^3.0.7" @@ -95,6 +98,5 @@ codecov = "^2.1.4" factory_boy = "^2.12.0" flake8 = "^3.8.3" pep8-naming = "^0.10.0" - -[tool.poetry.scripts] -relate = "bin.relate:main" +mypy = "*" +django-stubs = "^1.5.0" diff --git a/bin/__init__.py b/relate/bin/__init__.py similarity index 100% rename from bin/__init__.py rename to relate/bin/__init__.py diff --git a/bin/relate.py b/relate/bin/relate.py similarity index 99% rename from bin/relate.py rename to relate/bin/relate.py index 1df21764..c9468306 100644 --- a/bin/relate.py +++ b/relate/bin/relate.py @@ -194,7 +194,7 @@ def test_code_yml(yml_file, repo_root): return for page in pages: - test_code_question(page, repo_root) + test_code_question(page, repo_root) def test_code(args): diff --git a/setup.cfg b/setup.cfg index ae7699c5..41ec1dd3 100644 --- a/setup.cfg +++ b/setup.cfg @@ -3,6 +3,17 @@ ignore = E126,E127,E128,E123,E226,E241,E242,E265,E402,W503 max-line-length=85 exclude=course/migrations,accounts/migrations,static,components,course/mdx_mathjax.py,saml-config/attribute-maps,doc/conf.py,local_settings.py +[mypy] +strict_optional = True +ignore_missing_imports = True +follow_imports=skip +disallow_untyped_calls = True +plugins = + mypy_django_plugin.main + +[mypy.plugins.django-stubs] +django_settings_module = "local_settings_example" + [coverage:run] source = . branch=True -- GitLab From 1f8035168d58e447eaa728b721ded1faa61747f9 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 17:00:05 -0500 Subject: [PATCH 04/39] Attempt to refactor travis config for easier matrix This takes advantage of poetry to automate a lot of the setup and teardown done by external scripts. --- .travis.yml | 116 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 100 insertions(+), 16 deletions(-) diff --git a/.travis.yml b/.travis.yml index 3e02cadb..5d02b609 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,25 +1,109 @@ language: python +python: + - "3.7" + - "3.8" dist: xenial cache: pip -install: true addons: postgresql: "10" -matrix: +before_install: + - pip install poetry +install: + - poetry install + +jobs: include: - - python: "3.7" - env: RL_TRAVIS_TEST=test PY_EXE=python3.7 - - python: "3.7" - env: RL_TRAVIS_TEST=test_expensive PY_EXE=python3.7 - - python: "3.7" - env: RL_TRAVIS_TEST=test_postgres PY_EXE=python3.7 + - stage: Quality + name: flake8 + script: poetry run flake8 relate course accounts tests + - name: mypy + script: poetry run mypy relate course + - stage: Test + name: unit tests + script: + - cp local_settings_example.py local_settings.py + - poetry run manage.py makemessages --no-location --ignore=req.txt > output.txt + - | + if [[ -n $(grep "msgid" output.txt) ]]; then + echo "Command 'python manage.py makemessages' failed with the following info:\n" + grep --color -E '^|warning: ' output.txt + exit 1; + fi + - poetry run manage.py compilemessages + - poetry run coverage run manage.py test tests + - poetry run coverage report -makemessages + - poetry run codecov + - name: expensive tests + script: + - cp local_settings_example.py local_settings.py + - poetry run manage.py makemessages --no-location --ignore=req.txt > output.txt + - | + if [[ -n $(grep "msgid" output.txt) ]]; then + echo "Command 'python manage.py makemessages' failed with the following info:\n" + grep --color -E '^|warning: ' output.txt + exit 1; + fi + - poetry run manage.py compilemessages + - | + poetry run coverage run manage.py test tests.test_tasks \ + tests.test_admin \ + tests.test_pages.test_code \ + tests.test_pages.test_generic \ + tests.test_pages.test_inline.InlineMultiPageUpdateTest \ + tests.test_pages.test_upload.UploadQuestionNormalizeTest \ + tests.test_grades.test_generic \ + tests.test_grades.test_grades.GetGradeTableTest \ + tests.test_grading.SingleCourseQuizPageGradeInterfaceTest \ + tests.test_utils.LanguageOverrideTest \ + tests.test_accounts.test_admin.AccountsAdminTest \ + tests.test_flow.test_flow.AssemblePageGradesTest \ + tests.test_flow.test_flow.FinishFlowSessionViewTest \ + tests.test_content.SubDirRepoTest \ + tests.test_auth.SignInByPasswordTest \ + tests.test_analytics.FlowAnalyticsTest \ + tests.test_analytics.PageAnalyticsTest \ + tests.test_analytics.FlowListTest \ + tests.test_analytics.IsFlowMultipleSubmitTest \ + tests.test_analytics.IsPageMultipleSubmitTest \ + tests.test_versioning.ParamikoSSHVendorTest \ + tests.test_receivers.UpdateCouresOrUserSignalTest + - poetry run coverage report -makemessages + - poetry run codecov + - name: postgres tests + script: + - cp local_settings_example.py local_settings.py + - poetry run pip install psycopg2-binary + - psql -c 'create database relate;' -U postgres + - echo "import psycopg2.extensions" >> local_settings.py + - | + echo "DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'USER': 'postgres', + 'NAME': 'test_relate', + 'OPTIONS': { + 'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE, + }, + }, + }" >> local_settings.py + - poetry run manage.py makemessages --no-location --ignore=req.txt > output.txt + - | + if [[ -n $(grep "msgid" output.txt) ]]; then + echo "Command 'python manage.py makemessages' failed with the following info:\n" + grep --color -E '^|warning: ' output.txt + exit 1; + fi + - poetry run manage.py compilemessages + - poetry run coverage run manage.py test tests.test_postgres + - poetry run coverage report -makemessages + - poetry run codecov + - name: CLI tests + script: + - git clone https://github.com/inducer/relate-sample + - cd relate-sample + - poetry run relate validate . + - poetry run relate test-code questions/autograded-python-example.yml + - poetry run relate expand-yaml flows/quiz-test.yml > /dev/null - - python: "3.7" - env: RL_TRAVIS_TEST=cmdline PY_EXE=python3.7 - - python: "3.7" - env: RL_TRAVIS_TEST=flake8 PY_EXE=python3.7 - - python: "3.7" - env: RL_TRAVIS_TEST=mypy PY_EXE=python3.7 -script: - - bash ./run-travis-ci.sh -- GitLab From 615b5b78879632c23fd1ae8054ffda0d1276df0d Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 17:57:50 -0500 Subject: [PATCH 05/39] Revert changes to travis config and fix scripts Using poetry can bypass a lot of duplication in the scripts --- .travis.yml | 116 ++++++-------------------------------- run-tests-for-ci.sh | 55 +++++++++--------- run-travis-ci.sh | 18 +++--- test-command-line-tool.sh | 6 +- 4 files changed, 57 insertions(+), 138 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5d02b609..3e02cadb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,109 +1,25 @@ language: python -python: - - "3.7" - - "3.8" dist: xenial cache: pip +install: true addons: postgresql: "10" -before_install: - - pip install poetry -install: - - poetry install - -jobs: +matrix: include: - - stage: Quality - name: flake8 - script: poetry run flake8 relate course accounts tests - - name: mypy - script: poetry run mypy relate course - - stage: Test - name: unit tests - script: - - cp local_settings_example.py local_settings.py - - poetry run manage.py makemessages --no-location --ignore=req.txt > output.txt - - | - if [[ -n $(grep "msgid" output.txt) ]]; then - echo "Command 'python manage.py makemessages' failed with the following info:\n" - grep --color -E '^|warning: ' output.txt - exit 1; - fi - - poetry run manage.py compilemessages - - poetry run coverage run manage.py test tests - - poetry run coverage report -makemessages - - poetry run codecov - - name: expensive tests - script: - - cp local_settings_example.py local_settings.py - - poetry run manage.py makemessages --no-location --ignore=req.txt > output.txt - - | - if [[ -n $(grep "msgid" output.txt) ]]; then - echo "Command 'python manage.py makemessages' failed with the following info:\n" - grep --color -E '^|warning: ' output.txt - exit 1; - fi - - poetry run manage.py compilemessages - - | - poetry run coverage run manage.py test tests.test_tasks \ - tests.test_admin \ - tests.test_pages.test_code \ - tests.test_pages.test_generic \ - tests.test_pages.test_inline.InlineMultiPageUpdateTest \ - tests.test_pages.test_upload.UploadQuestionNormalizeTest \ - tests.test_grades.test_generic \ - tests.test_grades.test_grades.GetGradeTableTest \ - tests.test_grading.SingleCourseQuizPageGradeInterfaceTest \ - tests.test_utils.LanguageOverrideTest \ - tests.test_accounts.test_admin.AccountsAdminTest \ - tests.test_flow.test_flow.AssemblePageGradesTest \ - tests.test_flow.test_flow.FinishFlowSessionViewTest \ - tests.test_content.SubDirRepoTest \ - tests.test_auth.SignInByPasswordTest \ - tests.test_analytics.FlowAnalyticsTest \ - tests.test_analytics.PageAnalyticsTest \ - tests.test_analytics.FlowListTest \ - tests.test_analytics.IsFlowMultipleSubmitTest \ - tests.test_analytics.IsPageMultipleSubmitTest \ - tests.test_versioning.ParamikoSSHVendorTest \ - tests.test_receivers.UpdateCouresOrUserSignalTest - - poetry run coverage report -makemessages - - poetry run codecov - - name: postgres tests - script: - - cp local_settings_example.py local_settings.py - - poetry run pip install psycopg2-binary - - psql -c 'create database relate;' -U postgres - - echo "import psycopg2.extensions" >> local_settings.py - - | - echo "DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'USER': 'postgres', - 'NAME': 'test_relate', - 'OPTIONS': { - 'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE, - }, - }, - }" >> local_settings.py - - poetry run manage.py makemessages --no-location --ignore=req.txt > output.txt - - | - if [[ -n $(grep "msgid" output.txt) ]]; then - echo "Command 'python manage.py makemessages' failed with the following info:\n" - grep --color -E '^|warning: ' output.txt - exit 1; - fi - - poetry run manage.py compilemessages - - poetry run coverage run manage.py test tests.test_postgres - - poetry run coverage report -makemessages - - poetry run codecov - - name: CLI tests - script: - - git clone https://github.com/inducer/relate-sample - - cd relate-sample - - poetry run relate validate . - - poetry run relate test-code questions/autograded-python-example.yml - - poetry run relate expand-yaml flows/quiz-test.yml > /dev/null + - python: "3.7" + env: RL_TRAVIS_TEST=test PY_EXE=python3.7 + - python: "3.7" + env: RL_TRAVIS_TEST=test_expensive PY_EXE=python3.7 + - python: "3.7" + env: RL_TRAVIS_TEST=test_postgres PY_EXE=python3.7 + - python: "3.7" + env: RL_TRAVIS_TEST=cmdline PY_EXE=python3.7 + - python: "3.7" + env: RL_TRAVIS_TEST=flake8 PY_EXE=python3.7 + - python: "3.7" + env: RL_TRAVIS_TEST=mypy PY_EXE=python3.7 +script: + - bash ./run-travis-ci.sh diff --git a/run-tests-for-ci.sh b/run-tests-for-ci.sh index 4aaf3ef3..8ff86878 100644 --- a/run-tests-for-ci.sh +++ b/run-tests-for-ci.sh @@ -19,21 +19,21 @@ git submodule update --init --recursive # {{{ virtualenv -VENV_VERSION="virtualenv-15.2.0" -rm -Rf "$VENV_VERSION" -curl -k https://files.pythonhosted.org/packages/b1/72/2d70c5a1de409ceb3a27ff2ec007ecdd5cc52239e7c74990e32af57affe9/$VENV_VERSION.tar.gz | tar xfz - +# VENV_VERSION="virtualenv-15.2.0" +# rm -Rf "$VENV_VERSION" +# curl -k https://files.pythonhosted.org/packages/b1/72/2d70c5a1de409ceb3a27ff2ec007ecdd5cc52239e7c74990e32af57affe9/$VENV_VERSION.tar.gz | tar xfz - -VIRTUALENV="${PY_EXE} -m venv" -${VIRTUALENV} -h > /dev/null || VIRTUALENV="$VENV_VERSION/virtualenv.py --no-setuptools -p ${PY_EXE}" +# VIRTUALENV="${PY_EXE} -m venv" +# ${VIRTUALENV} -h > /dev/null || VIRTUALENV="$VENV_VERSION/virtualenv.py --no-setuptools -p ${PY_EXE}" -if [ -d ".env" ]; then - echo "**> virtualenv exists" -else - echo "**> creating virtualenv" - ${VIRTUALENV} .env -fi +# if [ -d ".env" ]; then +# echo "**> virtualenv exists" +# else +# echo "**> creating virtualenv" +# ${VIRTUALENV} .env +# fi -. .env/bin/activate +# . .env/bin/activate # }}} @@ -41,23 +41,26 @@ fi #curl -k https://bitbucket.org/pypa/setuptools/raw/bootstrap-py24/ez_setup.py | python - #curl -k https://ssl.tiker.net/software/ez_setup.py | python - -curl -k https://bootstrap.pypa.io/ez_setup.py | python - +# curl -k https://bootstrap.pypa.io/ez_setup.py | python - # }}} -curl -k https://bootstrap.pypa.io/get-pip.py | python - +# curl -k https://bootstrap.pypa.io/get-pip.py | python - # Not sure why pip ends up there, but in Py3.3, it sometimes does. -export PATH=`pwd`/.env/local/bin:$PATH +# export PATH=`pwd`/.env/local/bin:$PATH + +# PIP="${PY_EXE} $(which pip)" +${PY_EXE} -m ensurepip +${PY_EXE} -m pip install poetry +poetry install -PIP="${PY_EXE} $(which pip)" -$PIP install -r requirements.txt cp local_settings_example.py local_settings.py if [[ "$RL_CI_TEST" = "test_postgres" ]]; then - $PIP install psycopg2-binary + poetry run pip install psycopg2-binary psql -c 'create database relate;' -U postgres echo "import psycopg2.extensions" >> local_settings_example.py echo "DATABASES = { @@ -73,7 +76,7 @@ if [[ "$RL_CI_TEST" = "test_postgres" ]]; then fi # Make sure i18n literals marked correctly -${PY_EXE} manage.py makemessages --no-location --ignore=req.txt > output.txt +poetry run manage.py makemessages --no-location --ignore=req.txt > output.txt if [[ -n $(grep "msgid" output.txt) ]]; then echo "Command 'python manage.py makemessages' failed with the following info:" @@ -82,12 +85,12 @@ if [[ -n $(grep "msgid" output.txt) ]]; then exit 1; fi -${PY_EXE} manage.py compilemessages +poetry run manage.py compilemessages -$PIP install codecov factory_boy +poetry run pip install codecov factory_boy if [[ "$RL_CI_TEST" = "test_expensive" ]]; then - coverage run manage.py test tests.test_tasks \ + poetry run coverage run manage.py test tests.test_tasks \ tests.test_admin \ tests.test_pages.test_code \ tests.test_pages.test_generic \ @@ -111,11 +114,11 @@ if [[ "$RL_CI_TEST" = "test_expensive" ]]; then tests.test_receivers.UpdateCouresOrUserSignalTest elif [[ "$RL_CI_TEST" = "test_postgres" ]]; then - coverage run manage.py test tests.test_postgres + poetry run coverage run manage.py test tests.test_postgres else - coverage run manage.py test tests + poetry run coverage run manage.py test tests fi -coverage report -m -codecov +poetry run coverage report -m +poetry run codecov diff --git a/run-travis-ci.sh b/run-travis-ci.sh index 6f9c9bf2..19afd447 100644 --- a/run-travis-ci.sh +++ b/run-travis-ci.sh @@ -3,13 +3,13 @@ export RL_CI_TEST="$RL_TRAVIS_TEST" # before_script -if [[ $RL_TRAVIS_TEST == flake8 ]]; then - curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-flake8.sh -fi +# if [[ $RL_TRAVIS_TEST == flake8 ]]; then +# curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-flake8.sh +# fi -if [[ $RL_TRAVIS_TEST == mypy ]]; then - curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-mypy.sh -fi +# if [[ $RL_TRAVIS_TEST == mypy ]]; then +# curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-mypy.sh +# fi # run ci according to env variables if [[ $RL_TRAVIS_TEST == test* ]]; then @@ -17,7 +17,9 @@ if [[ $RL_TRAVIS_TEST == test* ]]; then elif [[ $RL_TRAVIS_TEST == cmdline ]]; then . ./test-command-line-tool.sh $PY_EXE elif [[ $RL_TRAVIS_TEST == mypy ]]; then - . ./prepare-and-run-mypy.sh $PY_EXE mypy==0.641 + # . ./prepare-and-run-mypy.sh $PY_EXE mypy==0.641 + poetry run mypy relate course elif [[ $RL_TRAVIS_TEST == flake8 ]]; then - . ./prepare-and-run-flake8.sh relate course accounts tests bin + poetry run flake8 relate course accounts tests + # . ./prepare-and-run-flake8.sh relate course accounts tests bin fi diff --git a/test-command-line-tool.sh b/test-command-line-tool.sh index 93ff339a..4321482e 100644 --- a/test-command-line-tool.sh +++ b/test-command-line-tool.sh @@ -33,14 +33,12 @@ fi # {{{ virtualenv -${PY_EXE} -m venv .env -. .env/bin/activate - ${PY_EXE} -m ensurepip +${PY_EXE} -m pip install poetry # }}} -$PY_EXE -m pip install . +poetry install git clone https://github.com/inducer/relate-sample cd relate-sample -- GitLab From 533988bb6063f868d6ad94640764f29d675bd4b3 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 17:58:32 -0500 Subject: [PATCH 06/39] Refactor gh actions instead of travis --- .github/workflows/ci.yml | 68 +++++++++++++++++++++++++--------------- 1 file changed, 42 insertions(+), 26 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4ed2188f..eecd1f36 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,42 +14,58 @@ jobs: name: Flake8 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - - uses: actions/setup-python@v1 - with: - python-version: '3.x' - - name: "Main Script" - run: | - curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-flake8.sh - . ./prepare-and-run-flake8.sh relate course accounts tests bin + - uses: actions/checkout@v2 + - uses: actions/setup-python@v1 + with: + python-version: '3.x' + - name: "Install poetry" + run: pip install poetry + - uses: actions/cache@v1 + with: + path: ~/.cache/pypoetry/virtualenvs + key: ${{ runner.os }}-poetry-${{ hashFiles('poetry.lock') }} + restore-keys: | + ${{ runner.os }}-poetry- + - name: "Flake8" + run: poetry run flake8 relate course accounts tests bin mypy: name: Mypy runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - - uses: actions/setup-python@v1 - with: - python-version: '3.x' - - name: "Main Script" - run: | - curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-mypy.sh - . ./prepare-and-run-mypy.sh python3 mypy + - uses: actions/checkout@v2 + - uses: actions/setup-python@v1 + with: + python-version: '3.x' + - name: "Install poetry" + run: pip install poetry + - uses: actions/cache@v1 + with: + path: ~/.cache/pypoetry/virtualenvs + key: ${{ runner.os }}-poetry-${{ hashFiles('poetry.lock') }} + restore-keys: | + ${{ runner.os }}-poetry- + - name: "Mypy" + run: poetry run mypy relate course cmdline: name: Command Line runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - - uses: actions/setup-python@v1 - with: - python-version: '3.x' - - name: "Main Script" - run: | - PY_EXE=python3 bash ./test-command-line-tool.sh python3 + - uses: actions/checkout@v2 + - uses: actions/setup-python@v1 + with: + python-version: '3.x' + - name: "Install poetry" + run: pip install poetry + - uses: actions/cache@v1 + with: + path: ~/.cache/pypoetry/virtualenvs + key: ${{ runner.os }}-poetry-${{ hashFiles('poetry.lock') }} + restore-keys: | + ${{ runner.os }}-poetry- + - name: "Main Script" + run: ./test-command-line-tool.sh python3 pytest: name: Pytest on Py${{ matrix.python-version }} -- GitLab From b349685fd997f1467b1de164c37e7b94f55e9ae2 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 18:10:27 -0500 Subject: [PATCH 07/39] Another stab at GH CI --- .github/workflows/ci.yml | 56 ++++++++++++++++++++++++++++------------ 1 file changed, 40 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index eecd1f36..2c306c57 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -18,14 +18,22 @@ jobs: - uses: actions/setup-python@v1 with: python-version: '3.x' - - name: "Install poetry" - run: pip install poetry + - name: Install Poetry + uses: dschep/install-poetry-action@v1.2 - uses: actions/cache@v1 + id: cache with: - path: ~/.cache/pypoetry/virtualenvs - key: ${{ runner.os }}-poetry-${{ hashFiles('poetry.lock') }} + path: ~/.virtualenvs + key: poetry-${{ hashFiles('**/poetry.lock') }} restore-keys: | - ${{ runner.os }}-poetry- + poetry-${{ hashFiles('**/poetry.lock') }} + - name: Set Poetry config + run: | + poetry config settings.virtualenvs.in-project false + poetry config settings.virtualenvs.path ~/.virtualenvs + - name: Install Dependencies + run: poetry install + if: steps.cache.outputs.cache-hit != 'true' - name: "Flake8" run: poetry run flake8 relate course accounts tests bin @@ -37,14 +45,22 @@ jobs: - uses: actions/setup-python@v1 with: python-version: '3.x' - - name: "Install poetry" - run: pip install poetry + - name: Install Poetry + uses: dschep/install-poetry-action@v1.2 - uses: actions/cache@v1 + id: cache with: - path: ~/.cache/pypoetry/virtualenvs - key: ${{ runner.os }}-poetry-${{ hashFiles('poetry.lock') }} + path: ~/.virtualenvs + key: poetry-${{ hashFiles('**/poetry.lock') }} restore-keys: | - ${{ runner.os }}-poetry- + poetry-${{ hashFiles('**/poetry.lock') }} + - name: Set Poetry config + run: | + poetry config settings.virtualenvs.in-project false + poetry config settings.virtualenvs.path ~/.virtualenvs + - name: Install Dependencies + run: poetry install + if: steps.cache.outputs.cache-hit != 'true' - name: "Mypy" run: poetry run mypy relate course @@ -56,16 +72,24 @@ jobs: - uses: actions/setup-python@v1 with: python-version: '3.x' - - name: "Install poetry" - run: pip install poetry + - name: Install Poetry + uses: dschep/install-poetry-action@v1.2 - uses: actions/cache@v1 + id: cache with: - path: ~/.cache/pypoetry/virtualenvs - key: ${{ runner.os }}-poetry-${{ hashFiles('poetry.lock') }} + path: ~/.virtualenvs + key: poetry-${{ hashFiles('**/poetry.lock') }} restore-keys: | - ${{ runner.os }}-poetry- + poetry-${{ hashFiles('**/poetry.lock') }} + - name: Set Poetry config + run: | + poetry config settings.virtualenvs.in-project false + poetry config settings.virtualenvs.path ~/.virtualenvs + - name: Install Dependencies + run: poetry install + if: steps.cache.outputs.cache-hit != 'true' - name: "Main Script" - run: ./test-command-line-tool.sh python3 + run: PY_EXE=$(poetry run which python) bash ./test-command-line-tool.sh $(poetry run which python) pytest: name: Pytest on Py${{ matrix.python-version }} -- GitLab From 786edcae035df9f42a7ad41be49b42740abb19ce Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 18:14:41 -0500 Subject: [PATCH 08/39] Remove extraneous config and add lock file --- .github/workflows/ci.yml | 12 +- poetry.lock | 1971 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 1977 insertions(+), 6 deletions(-) create mode 100644 poetry.lock diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 2c306c57..88408949 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,8 +29,8 @@ jobs: poetry-${{ hashFiles('**/poetry.lock') }} - name: Set Poetry config run: | - poetry config settings.virtualenvs.in-project false - poetry config settings.virtualenvs.path ~/.virtualenvs + poetry config virtualenvs.in-project false + poetry config virtualenvs.path ~/.virtualenvs - name: Install Dependencies run: poetry install if: steps.cache.outputs.cache-hit != 'true' @@ -56,8 +56,8 @@ jobs: poetry-${{ hashFiles('**/poetry.lock') }} - name: Set Poetry config run: | - poetry config settings.virtualenvs.in-project false - poetry config settings.virtualenvs.path ~/.virtualenvs + poetry config virtualenvs.in-project false + poetry config virtualenvs.path ~/.virtualenvs - name: Install Dependencies run: poetry install if: steps.cache.outputs.cache-hit != 'true' @@ -83,8 +83,8 @@ jobs: poetry-${{ hashFiles('**/poetry.lock') }} - name: Set Poetry config run: | - poetry config settings.virtualenvs.in-project false - poetry config settings.virtualenvs.path ~/.virtualenvs + poetry config virtualenvs.in-project false + poetry config virtualenvs.path ~/.virtualenvs - name: Install Dependencies run: poetry install if: steps.cache.outputs.cache-hit != 'true' diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..b95ea6c3 --- /dev/null +++ b/poetry.lock @@ -0,0 +1,1971 @@ +[[package]] +category = "main" +description = "Low-level AMQP client for Python (fork of amqplib)." +name = "amqp" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "2.6.0" + +[package.dependencies] +vine = ">=1.1.3,<5.0.0a1" + +[[package]] +category = "main" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +name = "appdirs" +optional = false +python-versions = "*" +version = "1.4.4" + +[[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 = "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 = "Modern password hashing for your software and your servers" +name = "bcrypt" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "3.1.7" + +[package.dependencies] +cffi = ">=1.1" +six = ">=1.4.1" + +[package.extras] +tests = ["pytest (>=3.2.1,<3.3.0 || >3.3.0)"] + +[[package]] +category = "main" +description = "Python multiprocessing fork with improvements and bugfixes" +name = "billiard" +optional = false +python-versions = "*" +version = "3.5.0.5" + +[[package]] +category = "main" +description = "An easy safelist-based HTML-sanitizing tool." +name = "bleach" +optional = false +python-versions = "*" +version = "2.1.2" + +[package.dependencies] +html5lib = ">=0.99999999pre,<1.0b1 || >1.0b1,<1.0b2 || >1.0b2,<1.0b3 || >1.0b3,<1.0b4 || >1.0b4,<1.0b5 || >1.0b5,<1.0b6 || >1.0b6,<1.0b7 || >1.0b7,<1.0b8 || >1.0b8" +six = "*" + +[package.source] +reference = "8ab3aaba3a77b4875262377787bdab20330379a1" +type = "git" +url = "https://github.com/inducer/bleach" +[[package]] +category = "main" +description = "Distributed Task Queue." +name = "celery" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "4.2.1" + +[package.dependencies] +billiard = ">=3.5.0.2,<3.6.0" +kombu = ">=4.2.0,<5.0" +pytz = ">0.0-dev" + +[package.extras] +auth = ["pyopenssl"] +cassandra = ["cassandra-driver"] +consul = ["python-consul"] +couchbase = ["couchbase", "couchbase-cffi"] +couchdb = ["pycouchdb"] +django = ["Django (>=1.8)"] +dynamodb = ["boto3 (>=1.4.6)"] +elasticsearch = ["elasticsearch"] +eventlet = ["eventlet"] +gevent = ["gevent"] +librabbitmq = ["librabbitmq (>=1.5.0)"] +memcache = ["pylibmc"] +mongodb = ["pymongo (>=3.3.0)"] +msgpack = ["msgpack-python (>=0.3.0)"] +pymemcache = ["python-memcached"] +pyro = ["pyro4"] +redis = ["redis (>=2.10.5)"] +riak = ["riak (>=2.0)"] +slmq = ["softlayer-messaging (>=1.0.3)"] +solar = ["ephem"] +sqlalchemy = ["sqlalchemy"] +sqs = ["boto3 (>=1.4.6)", "pycurl"] +tblib = ["tblib (>=1.3.0)"] +yaml = ["PyYAML (>=3.10)"] +zookeeper = ["kazoo (>=1.3.1)"] + +[[package]] +category = "main" +description = "Python package for providing Mozilla's CA Bundle." +name = "certifi" +optional = false +python-versions = "*" +version = "2020.4.5.2" + +[[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 = "dev" +description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" +name = "codecov" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.1.4" + +[package.dependencies] +coverage = "*" +requests = ">=2.7.9" + +[[package]] +category = "main" +description = "Cross-platform colored terminal text." +name = "colorama" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.4.3" + +[[package]] +category = "dev" +description = "Code coverage measurement for Python" +name = "coverage" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" +version = "5.1" + +[package.extras] +toml = ["toml"] + +[[package]] +category = "main" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +name = "cryptography" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +version = "2.9.2" + +[package.dependencies] +cffi = ">=1.8,<1.11.3 || >1.11.3" +six = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5,<1.8.0 || >1.8.0)", "sphinx-rtd-theme"] +docstest = ["doc8", "pyenchant (>=1.6.11)", "twine (>=1.12.0)", "sphinxcontrib-spelling (>=4.0.1)"] +idna = ["idna (>=2.1)"] +pep8test = ["flake8", "flake8-import-order", "pep8-naming"] +test = ["pytest (>=3.6.0,<3.9.0 || >3.9.0,<3.9.1 || >3.9.1,<3.9.2 || >3.9.2)", "pretend", "iso8601", "pytz", "hypothesis (>=1.11.4,<3.79.2 || >3.79.2)"] + +[[package]] +category = "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 = "XML bomb protection for Python stdlib modules" +name = "defusedxml" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "0.6.0" + +[[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 = "A helper class for handling configuration defaults of packaged apps gracefully." +name = "django-appconf" +optional = false +python-versions = "*" +version = "1.0.4" + +[package.dependencies] +django = "*" + +[[package]] +category = "main" +description = "Bootstrap3 compatible datetimepicker for Django projects." +name = "django-bootstrap3-datetimepicker-2" +optional = false +python-versions = "*" +version = "2.8.2" + +[[package]] +category = "main" +description = "Celery result backends for Django." +name = "django-celery-results" +optional = false +python-versions = "*" +version = "1.0.1" + +[package.dependencies] +celery = ">=4.0,<5.0" + +[[package]] +category = "main" +description = "Django form widget library for using CodeMirror on textarea" +name = "django-codemirror-widget" +optional = false +python-versions = "*" +version = "0.5.0" + +[[package]] +category = "main" +description = "Best way to have Django DRY forms" +name = "django-crispy-forms" +optional = false +python-versions = ">=3.5" +version = "1.9.1" + +[[package]] +category = "main" +description = "A django staticfiles finder that uses npm" +name = "django-npm" +optional = false +python-versions = "*" +version = "1.0.0" + +[package.extras] +test = ["pytest"] + +[[package]] +category = "main" +description = "Select2 option fields for Django" +name = "django-select2" +optional = false +python-versions = "*" +version = "7.4.2" + +[package.dependencies] +django = ">=2.2" +django-appconf = ">=0.6.0" + +[package.extras] +test = ["pytest", "pytest-cov", "pytest-django", "selenium"] + +[[package]] +category = "dev" +description = "Mypy stubs for Django" +name = "django-stubs" +optional = false +python-versions = ">=3.6" +version = "1.5.0" + +[package.dependencies] +django = "*" +mypy = ">=0.770,<0.780" +typing-extensions = "*" + +[[package]] +category = "main" +description = "A Django database field for storing YAML data" +name = "django-yamlfield" +optional = false +python-versions = "*" +version = "1.0.3" + +[package.dependencies] +PyYAML = ">=3.10" +six = ">=1.4.1" + +[package.source] +reference = "c92d0373d12a02d1e52fb09b44010f156111d7ea" +type = "git" +url = "https://github.com/bakatrouble/django-yamlfield.git" +[[package]] +category = "main" +description = "pysaml2 integration for Django" +name = "djangosaml2" +optional = false +python-versions = "*" +version = "0.19.0" + +[package.dependencies] +Django = ">=2.2" +defusedxml = ">=0.4.1" +pysaml2 = ">=5.0.0" + +[[package]] +category = "main" +description = "DNS toolkit" +name = "dnspython" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.16.0" + +[package.extras] +DNSSEC = ["pycryptodome", "ecdsa (>=0.13)"] +IDNA = ["idna (>=2.1)"] + +[[package]] +category = "main" +description = "Python client for Docker." +name = "docker-py" +optional = false +python-versions = "*" +version = "1.10.6" + +[package.dependencies] +docker-pycreds = ">=0.2.1" +requests = ">=2.5.2,<2.11.0 || >2.11.0" +six = ">=1.4.0" +websocket-client = ">=0.32.0" + +[[package]] +category = "main" +description = "Python bindings for the docker credentials store API" +name = "docker-pycreds" +optional = false +python-versions = "*" +version = "0.4.0" + +[package.dependencies] +six = ">=1.4.0" + +[[package]] +category = "main" +description = "Python Git Library" +name = "dulwich" +optional = false +python-versions = "*" +version = "0.19.16" + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.24.1" + +[package.extras] +fastimport = ["fastimport"] +https = ["urllib3 (>=1.24.1)"] +pgp = ["gpg"] + +[[package]] +category = "main" +description = "ECDSA cryptographic signature library (pure python)" +name = "ecdsa" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "0.15" + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +gmpy = ["gmpy"] +gmpy2 = ["gmpy2"] + +[[package]] +category = "main" +description = "Discover and load entry points from installed packages." +name = "entrypoints" +optional = false +python-versions = ">=2.7" +version = "0.3" + +[[package]] +category = "dev" +description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." +name = "factory-boy" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.12.0" + +[package.dependencies] +Faker = ">=0.7.0" + +[[package]] +category = "dev" +description = "Faker is a Python package that generates fake data for you." +name = "faker" +optional = false +python-versions = ">=3.4" +version = "4.1.0" + +[package.dependencies] +python-dateutil = ">=2.4" +text-unidecode = "1.3" + +[[package]] +category = "dev" +description = "the modular source code checker: pep8 pyflakes and co" +name = "flake8" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +version = "3.8.3" + +[package.dependencies] +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.6.0a1,<2.7.0" +pyflakes = ">=2.2.0,<2.3.0" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" + +[[package]] +category = "dev" +description = "Polyfill package for Flake8 plugins" +name = "flake8-polyfill" +optional = false +python-versions = "*" +version = "1.0.2" + +[package.dependencies] +flake8 = "*" + +[[package]] +category = "main" +description = "Clean single-source support for Python 3 and 2" +name = "future" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +version = "0.18.2" + +[[package]] +category = "main" +description = "HTML parser based on the WHATWG HTML specification" +name = "html5lib" +optional = false +python-versions = "*" +version = "1.0.1" + +[package.dependencies] +six = ">=1.9" +webencodings = "*" + +[package.extras] +all = ["genshi", "chardet (>=2.2)", "datrie", "lxml"] +chardet = ["chardet (>=2.2)"] +datrie = ["datrie"] +genshi = ["genshi"] +lxml = ["lxml"] + +[[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.9" + +[[package]] +category = "main" +description = "Read metadata from Python packages" +marker = "python_version < \"3.8\"" +name = "importlib-metadata" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +version = "1.6.1" + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["sphinx", "rst.linker"] +testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] + +[[package]] +category = "main" +description = "IPv4/IPv6 manipulation library" +name = "ipaddress" +optional = false +python-versions = "*" +version = "1.0.23" + +[[package]] +category = "main" +description = "IPython: Productive Interactive Computing" +name = "ipython" +optional = false +python-versions = ">=3.6" +version = "7.15.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 = ["Sphinx (>=1.3)", "ipykernel", "ipyparallel", "ipywidgets", "nbconvert", "nbformat", "nose (>=0.10.1)", "notebook", "numpy (>=1.14)", "pygments", "qtconsole", "requests", "testpath"] +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 = "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 = "A reusable Django field that allows you to store validated JSON in your model." +name = "jsonfield" +optional = false +python-versions = ">=3.6" +version = "3.1.0" + +[package.dependencies] +Django = ">=2.2" + +[[package]] +category = "main" +description = "An implementation of JSON Schema validation for Python" +name = "jsonschema" +optional = false +python-versions = "*" +version = "3.2.0" + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0" +setuptools = "*" +six = ">=1.11.0" + +[package.dependencies.importlib-metadata] +python = "<3.8" +version = "*" + +[package.extras] +format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] +format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] + +[[package]] +category = "main" +description = "Jupyter core package. A base package on which Jupyter projects rely." +name = "jupyter-core" +optional = false +python-versions = "!=3.0,!=3.1,!=3.2,!=3.3,!=3.4,>=2.7" +version = "4.6.3" + +[package.dependencies] +pywin32 = ">=1.0" +traitlets = "*" + +[[package]] +category = "main" +description = "Messaging library for Python." +name = "kombu" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "4.2.2.post1" + +[package.dependencies] +amqp = ">=2.1.4,<3.0" + +[package.extras] +consul = ["python-consul (>=0.6.0)"] +librabbitmq = ["librabbitmq (>=1.5.2)"] +mongodb = ["pymongo (>=2.6.2,<3.0)"] +msgpack = ["msgpack"] +pyro = ["pyro4"] +qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] +redis = ["redis (>=2.10.5)"] +slmq = ["softlayer-messaging (>=1.0.3)"] +sqlalchemy = ["sqlalchemy"] +sqs = ["boto3 (>=1.4.4)", "pycurl"] +yaml = ["PyYAML (>=3.10)"] +zookeeper = ["kazoo (>=1.3.1)"] + +[[package]] +category = "main" +description = "Python implementation of Markdown." +name = "markdown" +optional = false +python-versions = "*" +version = "2.6.11" + +[[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 = "dev" +description = "McCabe checker, plugin for flake8" +name = "mccabe" +optional = false +python-versions = "*" +version = "0.6.1" + +[[package]] +category = "main" +description = "The fastest markdown parser in pure Python" +name = "mistune" +optional = false +python-versions = "*" +version = "0.8.4" + +[[package]] +category = "main" +description = "More routines for operating on iterables, beyond itertools" +name = "more-itertools" +optional = false +python-versions = ">=3.5" +version = "8.3.0" + +[[package]] +category = "main" +description = "Python library for arbitrary-precision floating-point arithmetic" +name = "mpmath" +optional = false +python-versions = "*" +version = "1.1.0" + +[[package]] +category = "dev" +description = "Optional static typing for Python" +name = "mypy" +optional = false +python-versions = ">=3.5" +version = "0.770" + +[package.dependencies] +mypy-extensions = ">=0.4.3,<0.5.0" +typed-ast = ">=1.4.0,<1.5.0" +typing-extensions = ">=3.7.4" + +[package.extras] +dmypy = ["psutil (>=4.0)"] + +[[package]] +category = "dev" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +name = "mypy-extensions" +optional = false +python-versions = "*" +version = "0.4.3" + +[[package]] +category = "main" +description = "Converting Jupyter Notebooks" +name = "nbconvert" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +version = "5.6.1" + +[package.dependencies] +bleach = "*" +defusedxml = "*" +entrypoints = ">=0.2.2" +jinja2 = ">=2.4" +jupyter-core = "*" +mistune = ">=0.8.1,<2" +nbformat = ">=4.4" +pandocfilters = ">=1.4.1" +pygments = "*" +testpath = "*" +traitlets = ">=4.2" + +[package.extras] +all = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "tornado (>=4.0)", "sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "mock"] +docs = ["sphinx (>=1.5.1)", "sphinx-rtd-theme", "nbsphinx (>=0.2.12)", "sphinxcontrib-github-alt", "ipython", "jupyter-client (>=5.3.1)"] +execute = ["jupyter-client (>=5.3.1)"] +serve = ["tornado (>=4.0)"] +test = ["pytest", "pytest-cov", "ipykernel", "jupyter-client (>=5.3.1)", "ipywidgets (>=7)", "pebble", "mock"] + +[[package]] +category = "main" +description = "The Jupyter Notebook format" +name = "nbformat" +optional = false +python-versions = ">=3.5" +version = "5.0.6" + +[package.dependencies] +ipython-genutils = "*" +jsonschema = ">=2.4,<2.5.0 || >2.5.0" +jupyter-core = "*" +traitlets = ">=4.1" + +[package.extras] +test = ["testpath", "pytest", "pytest-cov"] + +[[package]] +category = "main" +description = "NumPy is the fundamental package for array computing with Python." +name = "numpy" +optional = false +python-versions = ">=3.5" +version = "1.18.5" + +[[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 = "20.4" + +[package.dependencies] +pyparsing = ">=2.0.2" +six = "*" + +[[package]] +category = "main" +description = "Utilities for writing pandoc filters in python" +name = "pandocfilters" +optional = false +python-versions = "*" +version = "1.4.2" + +[[package]] +category = "main" +description = "SSH2 protocol library" +name = "paramiko" +optional = false +python-versions = "*" +version = "2.6.0" + +[package.dependencies] +bcrypt = ">=3.1.3" +cryptography = ">=2.5" +pynacl = ">=1.0.1" + +[package.extras] +gssapi = ["pyasn1 (>=0.1.7)", "gssapi (>=1.4.1)", "pywin32 (>=2.1.8)"] + +[[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 = "dev" +description = "Check PEP-8 naming conventions, plugin for flake8" +name = "pep8-naming" +optional = false +python-versions = "*" +version = "0.10.0" + +[package.dependencies] +flake8-polyfill = ">=1.0.2,<2" + +[[package]] +category = "main" +description = "Pexpect allows easy control of interactive console applications." +marker = "sys_platform != \"win32\"" +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.dependencies] +[package.dependencies.importlib-metadata] +python = "<3.8" +version = ">=0.12" + +[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 = "Run a subprocess in a pseudo terminal" +marker = "sys_platform != \"win32\"" +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.1" + +[[package]] +category = "dev" +description = "Python style guide checker" +name = "pycodestyle" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.6.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 = "dev" +description = "passive checker of Python programs" +name = "pyflakes" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.2.0" + +[[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 = "A package for symbolic computation" +name = "pymbolic" +optional = false +python-versions = "*" +version = "2020.1" + +[package.dependencies] +pytest = ">=2.3" +pytools = ">=2" +six = "*" + +[[package]] +category = "main" +description = "Python binding to the Networking and Cryptography (NaCl) library" +name = "pynacl" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.4.0" + +[package.dependencies] +cffi = ">=1.4.1" +six = "*" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["pytest (>=3.2.1,<3.3.0 || >3.3.0)", "hypothesis (>=3.27.0)"] + +[[package]] +category = "main" +description = "Python wrapper module around the OpenSSL library" +name = "pyopenssl" +optional = false +python-versions = "*" +version = "19.1.0" + +[package.dependencies] +cryptography = ">=2.8" +six = ">=1.5.2" + +[package.extras] +docs = ["sphinx", "sphinx-rtd-theme"] +test = ["flaky", "pretend", "pytest (>=3.0.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.7" + +[[package]] +category = "main" +description = "Persistent/Functional/Immutable data structures" +name = "pyrsistent" +optional = false +python-versions = "*" +version = "0.16.0" + +[package.dependencies] +six = "*" + +[[package]] +category = "main" +description = "Python implementation of SAML Version 2 Standard" +name = "pysaml2" +optional = false +python-versions = "*" +version = "5.0.0" + +[package.dependencies] +cryptography = ">=1.4" +defusedxml = "*" +pyOpenSSL = "*" +python-dateutil = "*" +pytz = "*" +requests = ">=1.0.0" +six = "*" + +[package.extras] +s2repoze = ["paste", "zope.interface", "repoze.who"] + +[[package]] +category = "main" +description = "pytest: simple powerful testing with Python" +name = "pytest" +optional = false +python-versions = ">=3.5" +version = "5.4.3" + +[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.dependencies.importlib-metadata] +python = "<3.8" +version = ">=0.12" + +[package.extras] +checkqa-mypy = ["mypy (v0.761)"] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[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 = "Pure python memcached client" +name = "python-memcached" +optional = false +python-versions = "*" +version = "1.59" + +[package.dependencies] +six = ">=1.4.0" + +[[package]] +category = "main" +description = "A collection of tools for Python" +name = "pytools" +optional = false +python-versions = "*" +version = "2020.2" + +[package.dependencies] +appdirs = ">=1.4.0" +decorator = ">=3.2.0" +numpy = ">=1.6.0" +six = ">=1.8.0" + +[[package]] +category = "main" +description = "World timezone definitions, modern and historical" +name = "pytz" +optional = false +python-versions = "*" +version = "2020.1" + +[[package]] +category = "main" +description = "Python for Window Extensions" +marker = "sys_platform == \"win32\"" +name = "pywin32" +optional = false +python-versions = "*" +version = "227" + +[[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 = "Python 2 and 3 compatibility utilities" +name = "six" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +version = "1.15.0" + +[[package]] +category = "main" +description = "SleekXMPP is an elegant Python library for XMPP (aka Jabber, Google Talk, etc)." +name = "sleekxmpp" +optional = false +python-versions = "*" +version = "1.3.3" + +[[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.1" + +[[package]] +category = "main" +description = "Computer algebra system (CAS) in Python" +name = "sympy" +optional = false +python-versions = ">=3.5" +version = "1.6" + +[package.dependencies] +mpmath = ">=0.19" + +[[package]] +category = "main" +description = "Test utilities for code working with files and commands" +name = "testpath" +optional = false +python-versions = "*" +version = "0.4.4" + +[package.extras] +test = ["pathlib2"] + +[[package]] +category = "dev" +description = "The most basic Text::Unidecode port" +name = "text-unidecode" +optional = false +python-versions = "*" +version = "1.3" + +[[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 = "dev" +description = "a fork of Python 2 and 3 ast modules with type comment support" +name = "typed-ast" +optional = false +python-versions = "*" +version = "1.4.1" + +[[package]] +category = "main" +description = "Type Hints for Python" +name = "typing" +optional = false +python-versions = "*" +version = "3.7.4.1" + +[[package]] +category = "dev" +description = "Backported and Experimental Type Hints for Python 3.5+" +name = "typing-extensions" +optional = false +python-versions = "*" +version = "3.7.4.2" + +[[package]] +category = "main" +description = "Python2's stdlib csv module is nice, but it doesn't support unicode. This module is a drop-in replacement which *does*." +name = "unicodecsv" +optional = false +python-versions = "*" +version = "0.14.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.9" + +[package.extras] +brotli = ["brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "pyOpenSSL (>=0.14)", "ipaddress"] +socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] + +[[package]] +category = "main" +description = "Promises, promises, promises." +name = "vine" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.3.0" + +[[package]] +category = "main" +description = "Measures the displayed width of unicode strings in a terminal" +name = "wcwidth" +optional = false +python-versions = "*" +version = "0.2.4" + +[[package]] +category = "main" +description = "Character encoding aliases for legacy web content" +name = "webencodings" +optional = false +python-versions = "*" +version = "0.5.1" + +[[package]] +category = "main" +description = "WebSocket client for Python. hybi13 is supported." +name = "websocket-client" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.57.0" + +[package.dependencies] +six = "*" + +[[package]] +category = "main" +description = "Backport of pathlib-compatible object wrapper for zip files" +marker = "python_version < \"3.8\"" +name = "zipp" +optional = false +python-versions = ">=3.6" +version = "3.1.0" + +[package.extras] +docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] +testing = ["jaraco.itertools", "func-timeout"] + +[metadata] +content-hash = "0c7f1788c370e47ac78278f773fa9780f51a1ae986fd0945e35896e768f84253" +python-versions = "^3.7" + +[metadata.files] +amqp = [ + {file = "amqp-2.6.0-py2.py3-none-any.whl", hash = "sha256:bb68f8d2bced8f93ccfd07d96c689b716b3227720add971be980accfc2952139"}, + {file = "amqp-2.6.0.tar.gz", hash = "sha256:24dbaff8ce4f30566bb88976b398e8c4e77637171af3af6f1b9650f48890e60b"}, +] +appdirs = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] +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"}, +] +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"}, +] +bcrypt = [ + {file = "bcrypt-3.1.7-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:d7bdc26475679dd073ba0ed2766445bb5b20ca4793ca0db32b399dccc6bc84b7"}, + {file = "bcrypt-3.1.7-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:69361315039878c0680be456640f8705d76cb4a3a3fe1e057e0f261b74be4b31"}, + {file = "bcrypt-3.1.7-cp27-cp27m-win32.whl", hash = "sha256:5432dd7b34107ae8ed6c10a71b4397f1c853bd39a4d6ffa7e35f40584cffd161"}, + {file = "bcrypt-3.1.7-cp27-cp27m-win_amd64.whl", hash = "sha256:9fe92406c857409b70a38729dbdf6578caf9228de0aef5bc44f859ffe971a39e"}, + {file = "bcrypt-3.1.7-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:763669a367869786bb4c8fcf731f4175775a5b43f070f50f46f0b59da45375d0"}, + {file = "bcrypt-3.1.7-cp34-abi3-macosx_10_6_intel.whl", hash = "sha256:a190f2a5dbbdbff4b74e3103cef44344bc30e61255beb27310e2aec407766052"}, + {file = "bcrypt-3.1.7-cp34-abi3-manylinux1_x86_64.whl", hash = "sha256:c9457fa5c121e94a58d6505cadca8bed1c64444b83b3204928a866ca2e599105"}, + {file = "bcrypt-3.1.7-cp34-cp34m-win32.whl", hash = "sha256:8b10acde4e1919d6015e1df86d4c217d3b5b01bb7744c36113ea43d529e1c3de"}, + {file = "bcrypt-3.1.7-cp34-cp34m-win_amd64.whl", hash = "sha256:cb93f6b2ab0f6853550b74e051d297c27a638719753eb9ff66d1e4072be67133"}, + {file = "bcrypt-3.1.7-cp35-cp35m-win32.whl", hash = "sha256:6fe49a60b25b584e2f4ef175b29d3a83ba63b3a4df1b4c0605b826668d1b6be5"}, + {file = "bcrypt-3.1.7-cp35-cp35m-win_amd64.whl", hash = "sha256:a595c12c618119255c90deb4b046e1ca3bcfad64667c43d1166f2b04bc72db09"}, + {file = "bcrypt-3.1.7-cp36-cp36m-win32.whl", hash = "sha256:74a015102e877d0ccd02cdeaa18b32aa7273746914a6c5d0456dd442cb65b99c"}, + {file = "bcrypt-3.1.7-cp36-cp36m-win_amd64.whl", hash = "sha256:0258f143f3de96b7c14f762c770f5fc56ccd72f8a1857a451c1cd9a655d9ac89"}, + {file = "bcrypt-3.1.7-cp37-cp37m-win32.whl", hash = "sha256:19a4b72a6ae5bb467fea018b825f0a7d917789bcfe893e53f15c92805d187294"}, + {file = "bcrypt-3.1.7-cp37-cp37m-win_amd64.whl", hash = "sha256:ff032765bb8716d9387fd5376d987a937254b0619eff0972779515b5c98820bc"}, + {file = "bcrypt-3.1.7-cp38-cp38-win32.whl", hash = "sha256:ce4e4f0deb51d38b1611a27f330426154f2980e66582dc5f438aad38b5f24fc1"}, + {file = "bcrypt-3.1.7-cp38-cp38-win_amd64.whl", hash = "sha256:6305557019906466fc42dbc53b46da004e72fd7a551c044a827e572c82191752"}, + {file = "bcrypt-3.1.7.tar.gz", hash = "sha256:0b0069c752ec14172c5f78208f1863d7ad6755a6fae6fe76ec2c80d13be41e42"}, +] +billiard = [ + {file = "billiard-3.5.0.5.tar.gz", hash = "sha256:42d9a227401ac4fba892918bba0a0c409def5435c4b483267ebfe821afaaba0e"}, +] +bleach = [] +celery = [ + {file = "celery-4.2.1-py2.py3-none-any.whl", hash = "sha256:ad7a7411772b80a4d6c64f2f7f723200e39fb66cf614a7fdfab76d345acc7b13"}, + {file = "celery-4.2.1.tar.gz", hash = "sha256:77dab4677e24dc654d42dfbdfed65fa760455b6bb563a0877ecc35f4cfcfc678"}, +] +certifi = [ + {file = "certifi-2020.4.5.2-py2.py3-none-any.whl", hash = "sha256:9cd41137dc19af6a5e03b630eefe7d1f458d964d406342dd3edf625839b944cc"}, + {file = "certifi-2020.4.5.2.tar.gz", hash = "sha256:5ad7e9a056d25ffa5082862e36f119f7f7cec6457fa07ee2f8c339814b80c9b1"}, +] +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"}, +] +codecov = [ + {file = "codecov-2.1.4-py2.py3-none-any.whl", hash = "sha256:7378c4bec1809dde64031bf7d76c95266b0e6d60cfcd1d6a16ce96bfb6360ac3"}, + {file = "codecov-2.1.4-py3.8.egg", hash = "sha256:24c24a7c8d1231b83729c7a2a33655ce472a3ba05e0111d52701e3e3075657c9"}, + {file = "codecov-2.1.4.tar.gz", hash = "sha256:bf30a41f65e747b159e2a749d1f9c92042d358bba0905fd94d3def3a368e592c"}, +] +colorama = [ + {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, + {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, +] +coverage = [ + {file = "coverage-5.1-cp27-cp27m-macosx_10_12_x86_64.whl", hash = "sha256:0cb4be7e784dcdc050fc58ef05b71aa8e89b7e6636b99967fadbdba694cf2b65"}, + {file = "coverage-5.1-cp27-cp27m-macosx_10_13_intel.whl", hash = "sha256:c317eaf5ff46a34305b202e73404f55f7389ef834b8dbf4da09b9b9b37f76dd2"}, + {file = "coverage-5.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b83835506dfc185a319031cf853fa4bb1b3974b1f913f5bb1a0f3d98bdcded04"}, + {file = "coverage-5.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5f2294dbf7875b991c381e3d5af2bcc3494d836affa52b809c91697449d0eda6"}, + {file = "coverage-5.1-cp27-cp27m-win32.whl", hash = "sha256:de807ae933cfb7f0c7d9d981a053772452217df2bf38e7e6267c9cbf9545a796"}, + {file = "coverage-5.1-cp27-cp27m-win_amd64.whl", hash = "sha256:bf9cb9a9fd8891e7efd2d44deb24b86d647394b9705b744ff6f8261e6f29a730"}, + {file = "coverage-5.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:acf3763ed01af8410fc36afea23707d4ea58ba7e86a8ee915dfb9ceff9ef69d0"}, + {file = "coverage-5.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:dec5202bfe6f672d4511086e125db035a52b00f1648d6407cc8e526912c0353a"}, + {file = "coverage-5.1-cp35-cp35m-macosx_10_12_x86_64.whl", hash = "sha256:7a5bdad4edec57b5fb8dae7d3ee58622d626fd3a0be0dfceda162a7035885ecf"}, + {file = "coverage-5.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:1601e480b9b99697a570cea7ef749e88123c04b92d84cedaa01e117436b4a0a9"}, + {file = "coverage-5.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:dbe8c6ae7534b5b024296464f387d57c13caa942f6d8e6e0346f27e509f0f768"}, + {file = "coverage-5.1-cp35-cp35m-win32.whl", hash = "sha256:a027ef0492ede1e03a8054e3c37b8def89a1e3c471482e9f046906ba4f2aafd2"}, + {file = "coverage-5.1-cp35-cp35m-win_amd64.whl", hash = "sha256:0e61d9803d5851849c24f78227939c701ced6704f337cad0a91e0972c51c1ee7"}, + {file = "coverage-5.1-cp36-cp36m-macosx_10_13_x86_64.whl", hash = "sha256:2d27a3f742c98e5c6b461ee6ef7287400a1956c11421eb574d843d9ec1f772f0"}, + {file = "coverage-5.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:66460ab1599d3cf894bb6baee8c684788819b71a5dc1e8fa2ecc152e5d752019"}, + {file = "coverage-5.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5c542d1e62eece33c306d66fe0a5c4f7f7b3c08fecc46ead86d7916684b36d6c"}, + {file = "coverage-5.1-cp36-cp36m-win32.whl", hash = "sha256:2742c7515b9eb368718cd091bad1a1b44135cc72468c731302b3d641895b83d1"}, + {file = "coverage-5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:dead2ddede4c7ba6cb3a721870f5141c97dc7d85a079edb4bd8d88c3ad5b20c7"}, + {file = "coverage-5.1-cp37-cp37m-macosx_10_13_x86_64.whl", hash = "sha256:01333e1bd22c59713ba8a79f088b3955946e293114479bbfc2e37d522be03355"}, + {file = "coverage-5.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:e1ea316102ea1e1770724db01998d1603ed921c54a86a2efcb03428d5417e489"}, + {file = "coverage-5.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:adeb4c5b608574a3d647011af36f7586811a2c1197c861aedb548dd2453b41cd"}, + {file = "coverage-5.1-cp37-cp37m-win32.whl", hash = "sha256:782caea581a6e9ff75eccda79287daefd1d2631cc09d642b6ee2d6da21fc0a4e"}, + {file = "coverage-5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:00f1d23f4336efc3b311ed0d807feb45098fc86dee1ca13b3d6768cdab187c8a"}, + {file = "coverage-5.1-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:402e1744733df483b93abbf209283898e9f0d67470707e3c7516d84f48524f55"}, + {file = "coverage-5.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:a3f3654d5734a3ece152636aad89f58afc9213c6520062db3978239db122f03c"}, + {file = "coverage-5.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6402bd2fdedabbdb63a316308142597534ea8e1895f4e7d8bf7476c5e8751fef"}, + {file = "coverage-5.1-cp38-cp38-win32.whl", hash = "sha256:8fa0cbc7ecad630e5b0f4f35b0f6ad419246b02bc750de7ac66db92667996d24"}, + {file = "coverage-5.1-cp38-cp38-win_amd64.whl", hash = "sha256:79a3cfd6346ce6c13145731d39db47b7a7b859c0272f02cdb89a3bdcbae233a0"}, + {file = "coverage-5.1-cp39-cp39-win32.whl", hash = "sha256:a82b92b04a23d3c8a581fc049228bafde988abacba397d57ce95fe95e0338ab4"}, + {file = "coverage-5.1-cp39-cp39-win_amd64.whl", hash = "sha256:bb28a7245de68bf29f6fb199545d072d1036a1917dca17a1e75bbb919e14ee8e"}, + {file = "coverage-5.1.tar.gz", hash = "sha256:f90bfc4ad18450c80b024036eaf91e4a246ae287701aaa88eaebebf150868052"}, +] +cryptography = [ + {file = "cryptography-2.9.2-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:daf54a4b07d67ad437ff239c8a4080cfd1cc7213df57d33c97de7b4738048d5e"}, + {file = "cryptography-2.9.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:3b3eba865ea2754738616f87292b7f29448aec342a7c720956f8083d252bf28b"}, + {file = "cryptography-2.9.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:c447cf087cf2dbddc1add6987bbe2f767ed5317adb2d08af940db517dd704365"}, + {file = "cryptography-2.9.2-cp27-cp27m-win32.whl", hash = "sha256:f118a95c7480f5be0df8afeb9a11bd199aa20afab7a96bcf20409b411a3a85f0"}, + {file = "cryptography-2.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:c4fd17d92e9d55b84707f4fd09992081ba872d1a0c610c109c18e062e06a2e55"}, + {file = "cryptography-2.9.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d0d5aeaedd29be304848f1c5059074a740fa9f6f26b84c5b63e8b29e73dfc270"}, + {file = "cryptography-2.9.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e4014639d3d73fbc5ceff206049c5a9a849cefd106a49fa7aaaa25cc0ce35cf"}, + {file = "cryptography-2.9.2-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:96c080ae7118c10fcbe6229ab43eb8b090fccd31a09ef55f83f690d1ef619a1d"}, + {file = "cryptography-2.9.2-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:e993468c859d084d5579e2ebee101de8f5a27ce8e2159959b6673b418fd8c785"}, + {file = "cryptography-2.9.2-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:88c881dd5a147e08d1bdcf2315c04972381d026cdb803325c03fe2b4a8ed858b"}, + {file = "cryptography-2.9.2-cp35-cp35m-win32.whl", hash = "sha256:651448cd2e3a6bc2bb76c3663785133c40d5e1a8c1a9c5429e4354201c6024ae"}, + {file = "cryptography-2.9.2-cp35-cp35m-win_amd64.whl", hash = "sha256:726086c17f94747cedbee6efa77e99ae170caebeb1116353c6cf0ab67ea6829b"}, + {file = "cryptography-2.9.2-cp36-cp36m-win32.whl", hash = "sha256:091d31c42f444c6f519485ed528d8b451d1a0c7bf30e8ca583a0cac44b8a0df6"}, + {file = "cryptography-2.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:bb1f0281887d89617b4c68e8db9a2c42b9efebf2702a3c5bf70599421a8623e3"}, + {file = "cryptography-2.9.2-cp37-cp37m-win32.whl", hash = "sha256:18452582a3c85b96014b45686af264563e3e5d99d226589f057ace56196ec78b"}, + {file = "cryptography-2.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:22e91636a51170df0ae4dcbd250d318fd28c9f491c4e50b625a49964b24fe46e"}, + {file = "cryptography-2.9.2-cp38-cp38-win32.whl", hash = "sha256:844a76bc04472e5135b909da6aed84360f522ff5dfa47f93e3dd2a0b84a89fa0"}, + {file = "cryptography-2.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:1dfa985f62b137909496e7fc182dac687206d8d089dd03eaeb28ae16eec8e7d5"}, + {file = "cryptography-2.9.2.tar.gz", hash = "sha256:a0c30272fb4ddda5f5ffc1089d7405b7a71b0b0f51993cb4e5dbb4590b2fc229"}, +] +decorator = [ + {file = "decorator-4.4.2-py2.py3-none-any.whl", hash = "sha256:41fa54c2a0cc4ba648be4fd43cff00aedf5b9465c9bf18d64325bc225f08f760"}, + {file = "decorator-4.4.2.tar.gz", hash = "sha256:e3a62f0520172440ca0dcc823749319382e377f37f140a0b99ef45fecb84bfe7"}, +] +defusedxml = [ + {file = "defusedxml-0.6.0-py2.py3-none-any.whl", hash = "sha256:6687150770438374ab581bb7a1b327a847dd9c5749e396102de3fad4e8a3ef93"}, + {file = "defusedxml-0.6.0.tar.gz", hash = "sha256:f684034d135af4c6cbb949b8a4d2ed61634515257a67299e5f940fbaa34377f5"}, +] +django = [ + {file = "Django-3.0.7-py3-none-any.whl", hash = "sha256:e1630333248c9b3d4e38f02093a26f1e07b271ca896d73097457996e0fae12e8"}, + {file = "Django-3.0.7.tar.gz", hash = "sha256:5052b34b34b3425233c682e0e11d658fd6efd587d11335a0203d827224ada8f2"}, +] +django-appconf = [ + {file = "django-appconf-1.0.4.tar.gz", hash = "sha256:be58deb54a43d77d2e1621fe59f787681376d3cd0b8bd8e4758ef6c3a6453380"}, + {file = "django_appconf-1.0.4-py2.py3-none-any.whl", hash = "sha256:1b1d0e1069c843ebe8ae5aa48ec52403b1440402b320c3e3a206a0907e97bb06"}, +] +django-bootstrap3-datetimepicker-2 = [ + {file = "django-bootstrap3-datetimepicker-2-2.8.2.tar.gz", hash = "sha256:4cb4436c61d0a91a494e479ec16f53bf6655f5b9497c8765989f0210b60641db"}, +] +django-celery-results = [ + {file = "django_celery_results-1.0.1-py2.py3-none-any.whl", hash = "sha256:dfa240fb535a1a2d01c9e605ad71629909318eae6b893c5009eafd7265fde10b"}, + {file = "django_celery_results-1.0.1.tar.gz", hash = "sha256:8bca2605eeff4418be7ce428a6958d64bee0f5bdf1f8e563fbc09a9e2f3d990f"}, +] +django-codemirror-widget = [ + {file = "django-codemirror-widget-0.5.0.tar.gz", hash = "sha256:a2f7facf299f3f51dff7227cc9850905b899e08485698d3f4fad110a7ad628be"}, +] +django-crispy-forms = [ + {file = "django-crispy-forms-1.9.1.tar.gz", hash = "sha256:fbe9c2c9698b6590afe37940cb08194d1e722015f6bc5bee83f679362406ea30"}, + {file = "django_crispy_forms-1.9.1-py2.py3-none-any.whl", hash = "sha256:ad943285508f0ed0e271d00399b9399c22b8795a4f969029bce0fd29522a8e2d"}, +] +django-npm = [ + {file = "django-npm-1.0.0.tar.gz", hash = "sha256:2e6bba65e728fa18b9db3c8dc0d4490b70cb7f43bacf60eb3654d7dcb6424272"}, +] +django-select2 = [ + {file = "django-select2-7.4.2.tar.gz", hash = "sha256:9d3330fa0083a03fb69fceb5dcd2e78065cfd08e45c89d4fd727fce4673d3e08"}, + {file = "django_select2-7.4.2-py2.py3-none-any.whl", hash = "sha256:06531d563ce33c3133682ae2bb9e6d762103a863d0054ffef51bae8b4cfcca6c"}, +] +django-stubs = [ + {file = "django-stubs-1.5.0.tar.gz", hash = "sha256:b4c9042f2c2fcb89dc0fb37df070cce0f9bf93b39ae193847b6e5a392b13c430"}, + {file = "django_stubs-1.5.0-py3-none-any.whl", hash = "sha256:4a03df70e062f4133085efc461148d0934f36ccfd60a2b6d7bc35821f62008b6"}, +] +django-yamlfield = [] +djangosaml2 = [ + {file = "djangosaml2-0.19.0-py2.py3-none-any.whl", hash = "sha256:fa45289c631047d5fe585ffd8ac0a5335196f157475eb4307198e0089abb775e"}, + {file = "djangosaml2-0.19.0.tar.gz", hash = "sha256:f1df4b5b9d92c272fe07c6923d625908fa077df40afa7f2a18a89748e6bf60fc"}, +] +dnspython = [ + {file = "dnspython-1.16.0-py2.py3-none-any.whl", hash = "sha256:f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d"}, + {file = "dnspython-1.16.0.zip", hash = "sha256:36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01"}, +] +docker-py = [ + {file = "docker-py-1.10.6.tar.gz", hash = "sha256:4c2a75875764d38d67f87bc7d03f7443a3895704efc57962bdf6500b8d4bc415"}, + {file = "docker_py-1.10.6-py2.py3-none-any.whl", hash = "sha256:35b506e95861914fa5ad57a6707e3217b4082843b883be246190f57013948aba"}, +] +docker-pycreds = [ + {file = "docker-pycreds-0.4.0.tar.gz", hash = "sha256:6ce3270bcaf404cc4c3e27e4b6c70d3521deae82fb508767870fdbf772d584d4"}, + {file = "docker_pycreds-0.4.0-py2.py3-none-any.whl", hash = "sha256:7266112468627868005106ec19cd0d722702d2b7d5912a28e19b826c3d37af49"}, +] +dulwich = [ + {file = "dulwich-0.19.16-cp27-cp27m-win32.whl", hash = "sha256:267160904e9a1cb6c248c5efc53597a35d038ecc6f60bdc4546b3053bed11982"}, + {file = "dulwich-0.19.16-cp27-cp27m-win_amd64.whl", hash = "sha256:4e3aba5e4844e7c700721c1fc696987ea820ee3528a03604dc4e74eff4196826"}, + {file = "dulwich-0.19.16-cp35-cp35m-win_amd64.whl", hash = "sha256:60bb2c2c92f5025c1b53a556304008f0f624c98ae36f22d870e056b2d4236c11"}, + {file = "dulwich-0.19.16-cp36-cp36m-win_amd64.whl", hash = "sha256:f00d132082b8fcc2eb0d722abc773d4aeb5558c1475d7edd1f0f571146c29db9"}, + {file = "dulwich-0.19.16-py2-none-any.whl", hash = "sha256:10699277c6268d0c16febe141a5b1c1a6e9744f3144c2d2de1706f4b1adafe63"}, + {file = "dulwich-0.19.16-py3-none-any.whl", hash = "sha256:dddae02d372fc3b5cfb0046d0f62246ef281fa0c088df7601ab5916607add94b"}, + {file = "dulwich-0.19.16.tar.gz", hash = "sha256:f74561c448bfb6f04c07de731c1181ae4280017f759b0bb04fa5770aa84ca850"}, +] +ecdsa = [ + {file = "ecdsa-0.15-py2.py3-none-any.whl", hash = "sha256:867ec9cf6df0b03addc8ef66b56359643cb5d0c1dc329df76ba7ecfe256c8061"}, + {file = "ecdsa-0.15.tar.gz", hash = "sha256:8f12ac317f8a1318efa75757ef0a651abe12e51fc1af8838fb91079445227277"}, +] +entrypoints = [ + {file = "entrypoints-0.3-py2.py3-none-any.whl", hash = "sha256:589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19"}, + {file = "entrypoints-0.3.tar.gz", hash = "sha256:c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"}, +] +factory-boy = [ + {file = "factory_boy-2.12.0-py2.py3-none-any.whl", hash = "sha256:728df59b372c9588b83153facf26d3d28947fc750e8e3c95cefa9bed0e6394ee"}, + {file = "factory_boy-2.12.0.tar.gz", hash = "sha256:faf48d608a1735f0d0a3c9cbf536d64f9132b547dae7ba452c4d99a79e84a370"}, +] +faker = [ + {file = "Faker-4.1.0-py3-none-any.whl", hash = "sha256:34ae397aef03a0a17910452f1e8430d57fa59e2d67b20e9b637218e8f7dd22b3"}, + {file = "Faker-4.1.0.tar.gz", hash = "sha256:103c46b9701a151299c5bffe6fefcd4fb5fb04c3b5d06bee4952d36255d44ea2"}, +] +flake8 = [ + {file = "flake8-3.8.3-py2.py3-none-any.whl", hash = "sha256:15e351d19611c887e482fb960eae4d44845013cc142d42896e9862f775d8cf5c"}, + {file = "flake8-3.8.3.tar.gz", hash = "sha256:f04b9fcbac03b0a3e58c0ab3a0ecc462e023a9faf046d57794184028123aa208"}, +] +flake8-polyfill = [ + {file = "flake8-polyfill-1.0.2.tar.gz", hash = "sha256:e44b087597f6da52ec6393a709e7108b2905317d0c0b744cdca6208e670d8eda"}, + {file = "flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9"}, +] +future = [ + {file = "future-0.18.2.tar.gz", hash = "sha256:b1bead90b70cf6ec3f0710ae53a525360fa360d306a86583adc6bf83a4db537d"}, +] +html5lib = [ + {file = "html5lib-1.0.1-py2.py3-none-any.whl", hash = "sha256:20b159aa3badc9d5ee8f5c647e5efd02ed2a66ab8d354930bd9ff139fc1dc0a3"}, + {file = "html5lib-1.0.1.tar.gz", hash = "sha256:66cb0dcfdbbc4f9c3ba1a63fdb511ffdbd4f513b2b6d81b80cd26ce6b3fb3736"}, +] +idna = [ + {file = "idna-2.9-py2.py3-none-any.whl", hash = "sha256:a068a21ceac8a4d63dbfd964670474107f541babbd2250d61922f029858365fa"}, + {file = "idna-2.9.tar.gz", hash = "sha256:7588d1c14ae4c77d74036e8c22ff447b26d0fde8f007354fd48a7814db15b7cb"}, +] +importlib-metadata = [ + {file = "importlib_metadata-1.6.1-py2.py3-none-any.whl", hash = "sha256:15ec6c0fd909e893e3a08b3a7c76ecb149122fb14b7efe1199ddd4c7c57ea958"}, + {file = "importlib_metadata-1.6.1.tar.gz", hash = "sha256:0505dd08068cfec00f53a74a0ad927676d7757da81b7436a6eefe4c7cf75c545"}, +] +ipaddress = [ + {file = "ipaddress-1.0.23-py2.py3-none-any.whl", hash = "sha256:6e0f4a39e66cb5bb9a137b00276a2eff74f93b71dcbdad6f10ff7df9d3557fcc"}, + {file = "ipaddress-1.0.23.tar.gz", hash = "sha256:b7f8e0369580bb4a24d5ba1d7cc29660a4a6987763faf1d8a8046830e020e7e2"}, +] +ipython = [ + {file = "ipython-7.15.0-py3-none-any.whl", hash = "sha256:1b85d65632211bf5d3e6f1406f3393c8c429a47d7b947b9a87812aa5bce6595c"}, + {file = "ipython-7.15.0.tar.gz", hash = "sha256:0ef1433879816a960cd3ae1ae1dc82c64732ca75cec8dab5a4e29783fb571d0e"}, +] +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"}, +] +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"}, +] +jsonfield = [ + {file = "jsonfield-3.1.0-py3-none-any.whl", hash = "sha256:df857811587f252b97bafba42e02805e70a398a7a47870bc6358a0308dd689ed"}, + {file = "jsonfield-3.1.0.tar.gz", hash = "sha256:7e4e84597de21eeaeeaaa7cc5da08c61c48a9b64d0c446b2d71255d01812887a"}, +] +jsonschema = [ + {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, + {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, +] +jupyter-core = [ + {file = "jupyter_core-4.6.3-py2.py3-none-any.whl", hash = "sha256:a4ee613c060fe5697d913416fc9d553599c05e4492d58fac1192c9a6844abb21"}, + {file = "jupyter_core-4.6.3.tar.gz", hash = "sha256:394fd5dd787e7c8861741880bdf8a00ce39f95de5d18e579c74b882522219e7e"}, +] +kombu = [ + {file = "kombu-4.2.2.post1-py2.py3-none-any.whl", hash = "sha256:1ef049243aa05f29e988ab33444ec7f514375540eaa8e0b2e1f5255e81c5e56d"}, + {file = "kombu-4.2.2.post1.tar.gz", hash = "sha256:3c9dca2338c5d893f30c151f5d29bfb81196748ab426d33c362ab51f1e8dbf78"}, +] +markdown = [ + {file = "Markdown-2.6.11-py2.py3-none-any.whl", hash = "sha256:9ba587db9daee7ec761cfc656272be6aabe2ed300fece21208e4aab2e457bc8f"}, + {file = "Markdown-2.6.11.tar.gz", hash = "sha256:a856869c7ff079ad84a3e19cd87a64998350c2b94e9e08e44270faef33400f81"}, +] +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"}, +] +mccabe = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] +mistune = [ + {file = "mistune-0.8.4-py2.py3-none-any.whl", hash = "sha256:88a1051873018da288eee8538d476dffe1262495144b33ecb586c4ab266bb8d4"}, + {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, +] +more-itertools = [ + {file = "more-itertools-8.3.0.tar.gz", hash = "sha256:558bb897a2232f5e4f8e2399089e35aecb746e1f9191b6584a151647e89267be"}, + {file = "more_itertools-8.3.0-py3-none-any.whl", hash = "sha256:7818f596b1e87be009031c7653d01acc46ed422e6656b394b0f765ce66ed4982"}, +] +mpmath = [ + {file = "mpmath-1.1.0.tar.gz", hash = "sha256:fc17abe05fbab3382b61a123c398508183406fa132e0223874578e20946499f6"}, +] +mypy = [ + {file = "mypy-0.770-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:a34b577cdf6313bf24755f7a0e3f3c326d5c1f4fe7422d1d06498eb25ad0c600"}, + {file = "mypy-0.770-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:86c857510a9b7c3104cf4cde1568f4921762c8f9842e987bc03ed4f160925754"}, + {file = "mypy-0.770-cp35-cp35m-win_amd64.whl", hash = "sha256:a8ffcd53cb5dfc131850851cc09f1c44689c2812d0beb954d8138d4f5fc17f65"}, + {file = "mypy-0.770-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:7687f6455ec3ed7649d1ae574136835a4272b65b3ddcf01ab8704ac65616c5ce"}, + {file = "mypy-0.770-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3beff56b453b6ef94ecb2996bea101a08f1f8a9771d3cbf4988a61e4d9973761"}, + {file = "mypy-0.770-cp36-cp36m-win_amd64.whl", hash = "sha256:15b948e1302682e3682f11f50208b726a246ab4e6c1b39f9264a8796bb416aa2"}, + {file = "mypy-0.770-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:b90928f2d9eb2f33162405f32dde9f6dcead63a0971ca8a1b50eb4ca3e35ceb8"}, + {file = "mypy-0.770-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c56ffe22faa2e51054c5f7a3bc70a370939c2ed4de308c690e7949230c995913"}, + {file = "mypy-0.770-cp37-cp37m-win_amd64.whl", hash = "sha256:8dfb69fbf9f3aeed18afffb15e319ca7f8da9642336348ddd6cab2713ddcf8f9"}, + {file = "mypy-0.770-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:219a3116ecd015f8dca7b5d2c366c973509dfb9a8fc97ef044a36e3da66144a1"}, + {file = "mypy-0.770-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7ec45a70d40ede1ec7ad7f95b3c94c9cf4c186a32f6bacb1795b60abd2f9ef27"}, + {file = "mypy-0.770-cp38-cp38-win_amd64.whl", hash = "sha256:f91c7ae919bbc3f96cd5e5b2e786b2b108343d1d7972ea130f7de27fdd547cf3"}, + {file = "mypy-0.770-py3-none-any.whl", hash = "sha256:3b1fc683fb204c6b4403a1ef23f0b1fac8e4477091585e0c8c54cbdf7d7bb164"}, + {file = "mypy-0.770.tar.gz", hash = "sha256:8a627507ef9b307b46a1fea9513d5c98680ba09591253082b4c48697ba05a4ae"}, +] +mypy-extensions = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] +nbconvert = [ + {file = "nbconvert-5.6.1-py2.py3-none-any.whl", hash = "sha256:f0d6ec03875f96df45aa13e21fd9b8450c42d7e1830418cccc008c0df725fcee"}, + {file = "nbconvert-5.6.1.tar.gz", hash = "sha256:21fb48e700b43e82ba0e3142421a659d7739b65568cc832a13976a77be16b523"}, +] +nbformat = [ + {file = "nbformat-5.0.6-py3-none-any.whl", hash = "sha256:276343c78a9660ab2a63c28cc33da5f7c58c092b3f3a40b6017ae2ce6689320d"}, + {file = "nbformat-5.0.6.tar.gz", hash = "sha256:049af048ed76b95c3c44043620c17e56bc001329e07f83fec4f177f0e3d7b757"}, +] +numpy = [ + {file = "numpy-1.18.5-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:e91d31b34fc7c2c8f756b4e902f901f856ae53a93399368d9a0dc7be17ed2ca0"}, + {file = "numpy-1.18.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:7d42ab8cedd175b5ebcb39b5208b25ba104842489ed59fbb29356f671ac93583"}, + {file = "numpy-1.18.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:a78e438db8ec26d5d9d0e584b27ef25c7afa5a182d1bf4d05e313d2d6d515271"}, + {file = "numpy-1.18.5-cp35-cp35m-win32.whl", hash = "sha256:a87f59508c2b7ceb8631c20630118cc546f1f815e034193dc72390db038a5cb3"}, + {file = "numpy-1.18.5-cp35-cp35m-win_amd64.whl", hash = "sha256:965df25449305092b23d5145b9bdaeb0149b6e41a77a7d728b1644b3c99277c1"}, + {file = "numpy-1.18.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ac792b385d81151bae2a5a8adb2b88261ceb4976dbfaaad9ce3a200e036753dc"}, + {file = "numpy-1.18.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:ef627986941b5edd1ed74ba89ca43196ed197f1a206a3f18cc9faf2fb84fd675"}, + {file = "numpy-1.18.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:f718a7949d1c4f622ff548c572e0c03440b49b9531ff00e4ed5738b459f011e8"}, + {file = "numpy-1.18.5-cp36-cp36m-win32.whl", hash = "sha256:4064f53d4cce69e9ac613256dc2162e56f20a4e2d2086b1956dd2fcf77b7fac5"}, + {file = "numpy-1.18.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b03b2c0badeb606d1232e5f78852c102c0a7989d3a534b3129e7856a52f3d161"}, + {file = "numpy-1.18.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a7acefddf994af1aeba05bbbafe4ba983a187079f125146dc5859e6d817df824"}, + {file = "numpy-1.18.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:cd49930af1d1e49a812d987c2620ee63965b619257bd76eaaa95870ca08837cf"}, + {file = "numpy-1.18.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:b39321f1a74d1f9183bf1638a745b4fd6fe80efbb1f6b32b932a588b4bc7695f"}, + {file = "numpy-1.18.5-cp37-cp37m-win32.whl", hash = "sha256:cae14a01a159b1ed91a324722d746523ec757357260c6804d11d6147a9e53e3f"}, + {file = "numpy-1.18.5-cp37-cp37m-win_amd64.whl", hash = "sha256:0172304e7d8d40e9e49553901903dc5f5a49a703363ed756796f5808a06fc233"}, + {file = "numpy-1.18.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e15b382603c58f24265c9c931c9a45eebf44fe2e6b4eaedbb0d025ab3255228b"}, + {file = "numpy-1.18.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3676abe3d621fc467c4c1469ee11e395c82b2d6b5463a9454e37fe9da07cd0d7"}, + {file = "numpy-1.18.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:4674f7d27a6c1c52a4d1aa5f0881f1eff840d2206989bae6acb1c7668c02ebfb"}, + {file = "numpy-1.18.5-cp38-cp38-win32.whl", hash = "sha256:9c9d6531bc1886454f44aa8f809268bc481295cf9740827254f53c30104f074a"}, + {file = "numpy-1.18.5-cp38-cp38-win_amd64.whl", hash = "sha256:3dd6823d3e04b5f223e3e265b4a1eae15f104f4366edd409e5a5e413a98f911f"}, + {file = "numpy-1.18.5.zip", hash = "sha256:34e96e9dae65c4839bd80012023aadd6ee2ccb73ce7fdf3074c62f301e63120b"}, +] +packaging = [ + {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, + {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, +] +pandocfilters = [ + {file = "pandocfilters-1.4.2.tar.gz", hash = "sha256:b3dd70e169bb5449e6bc6ff96aea89c5eea8c5f6ab5e207fc2f521a2cf4a0da9"}, +] +paramiko = [ + {file = "paramiko-2.6.0-py2.py3-none-any.whl", hash = "sha256:99f0179bdc176281d21961a003ffdb2ec369daac1a1007241f53374e376576cf"}, + {file = "paramiko-2.6.0.tar.gz", hash = "sha256:f4b2edfa0d226b70bd4ca31ea7e389325990283da23465d572ed1f70a7583041"}, +] +parso = [ + {file = "parso-0.7.0-py2.py3-none-any.whl", hash = "sha256:158c140fc04112dc45bca311633ae5033c2c2a7b732fa33d0955bad8152a8dd0"}, + {file = "parso-0.7.0.tar.gz", hash = "sha256:908e9fae2144a076d72ae4e25539143d40b8e3eafbaeae03c1bfe226f4cdf12c"}, +] +pep8-naming = [ + {file = "pep8-naming-0.10.0.tar.gz", hash = "sha256:f3b4a5f9dd72b991bf7d8e2a341d2e1aa3a884a769b5aaac4f56825c1763bf3a"}, + {file = "pep8_naming-0.10.0-py2.py3-none-any.whl", hash = "sha256:5d9f1056cb9427ce344e98d1a7f5665710e2f20f748438e308995852cfa24164"}, +] +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"}, +] +ptyprocess = [ + {file = "ptyprocess-0.6.0-py2.py3-none-any.whl", hash = "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"}, + {file = "ptyprocess-0.6.0.tar.gz", hash = "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0"}, +] +py = [ + {file = "py-1.8.1-py2.py3-none-any.whl", hash = "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0"}, + {file = "py-1.8.1.tar.gz", hash = "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa"}, +] +pycodestyle = [ + {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, + {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, +] +pycparser = [ + {file = "pycparser-2.20-py2.py3-none-any.whl", hash = "sha256:7582ad22678f0fcd81102833f60ef8d0e57288b6b5fb00323d101be910e35705"}, + {file = "pycparser-2.20.tar.gz", hash = "sha256:2d475327684562c3a96cc71adf7dc8c4f0565175cf86b6d7a404ff4c771f15f0"}, +] +pyflakes = [ + {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, + {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, +] +pygments = [ + {file = "Pygments-2.6.1-py3-none-any.whl", hash = "sha256:ff7a40b4860b727ab48fad6360eb351cc1b33cbf9b15a0f689ca5353e9463324"}, + {file = "Pygments-2.6.1.tar.gz", hash = "sha256:647344a061c249a3b74e230c739f434d7ea4d8b1d5f3721bc0f3558049b38f44"}, +] +pymbolic = [ + {file = "pymbolic-2020.1.tar.gz", hash = "sha256:ca029399f9480f6d51fbac0349fddbb42d937620deb03befa0ba94ac08895e6b"}, +] +pynacl = [ + {file = "PyNaCl-1.4.0-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:ea6841bc3a76fa4942ce00f3bda7d436fda21e2d91602b9e21b7ca9ecab8f3ff"}, + {file = "PyNaCl-1.4.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:d452a6746f0a7e11121e64625109bc4468fc3100452817001dbe018bb8b08514"}, + {file = "PyNaCl-1.4.0-cp27-cp27m-win32.whl", hash = "sha256:2fe0fc5a2480361dcaf4e6e7cea00e078fcda07ba45f811b167e3f99e8cff574"}, + {file = "PyNaCl-1.4.0-cp27-cp27m-win_amd64.whl", hash = "sha256:f8851ab9041756003119368c1e6cd0b9c631f46d686b3904b18c0139f4419f80"}, + {file = "PyNaCl-1.4.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7757ae33dae81c300487591c68790dfb5145c7d03324000433d9a2c141f82af7"}, + {file = "PyNaCl-1.4.0-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:757250ddb3bff1eecd7e41e65f7f833a8405fede0194319f87899690624f2122"}, + {file = "PyNaCl-1.4.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:30f9b96db44e09b3304f9ea95079b1b7316b2b4f3744fe3aaecccd95d547063d"}, + {file = "PyNaCl-1.4.0-cp35-cp35m-win32.whl", hash = "sha256:06cbb4d9b2c4bd3c8dc0d267416aaed79906e7b33f114ddbf0911969794b1cc4"}, + {file = "PyNaCl-1.4.0-cp35-cp35m-win_amd64.whl", hash = "sha256:511d269ee845037b95c9781aa702f90ccc36036f95d0f31373a6a79bd8242e25"}, + {file = "PyNaCl-1.4.0-cp36-cp36m-win32.whl", hash = "sha256:11335f09060af52c97137d4ac54285bcb7df0cef29014a1a4efe64ac065434c4"}, + {file = "PyNaCl-1.4.0-cp36-cp36m-win_amd64.whl", hash = "sha256:cd401ccbc2a249a47a3a1724c2918fcd04be1f7b54eb2a5a71ff915db0ac51c6"}, + {file = "PyNaCl-1.4.0-cp37-cp37m-win32.whl", hash = "sha256:8122ba5f2a2169ca5da936b2e5a511740ffb73979381b4229d9188f6dcb22f1f"}, + {file = "PyNaCl-1.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:537a7ccbea22905a0ab36ea58577b39d1fa9b1884869d173b5cf111f006f689f"}, + {file = "PyNaCl-1.4.0-cp38-cp38-win32.whl", hash = "sha256:9c4a7ea4fb81536c1b1f5cc44d54a296f96ae78c1ebd2311bd0b60be45a48d96"}, + {file = "PyNaCl-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:7c6092102219f59ff29788860ccb021e80fffd953920c4a8653889c029b2d420"}, + {file = "PyNaCl-1.4.0.tar.gz", hash = "sha256:54e9a2c849c742006516ad56a88f5c74bf2ce92c9f67435187c3c5953b346505"}, +] +pyopenssl = [ + {file = "pyOpenSSL-19.1.0-py2.py3-none-any.whl", hash = "sha256:621880965a720b8ece2f1b2f54ea2071966ab00e2970ad2ce11d596102063504"}, + {file = "pyOpenSSL-19.1.0.tar.gz", hash = "sha256:9a24494b2602aaf402be5c9e30a0b82d4a5c67528fe8fb475e3f3bc00dd69507"}, +] +pyparsing = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] +pyrsistent = [ + {file = "pyrsistent-0.16.0.tar.gz", hash = "sha256:28669905fe725965daa16184933676547c5bb40a5153055a8dee2a4bd7933ad3"}, +] +pysaml2 = [ + {file = "pysaml2-5.0.0-py2.py3-none-any.whl", hash = "sha256:1800ef0ab3f5b3c1d18742dd8cc7afa6dd9760fc5a515fd37543003ff5ca9947"}, + {file = "pysaml2-5.0.0.tar.gz", hash = "sha256:deea75b252b5ead821f12ce01e9d88b0f6fbcde322c1595dcbb06f9660af0cc1"}, +] +pytest = [ + {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, + {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, +] +python-dateutil = [ + {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, + {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, +] +python-memcached = [ + {file = "python-memcached-1.59.tar.gz", hash = "sha256:a2e28637be13ee0bf1a8b6843e7490f9456fd3f2a4cb60471733c7b5d5557e4f"}, + {file = "python_memcached-1.59-py2.py3-none-any.whl", hash = "sha256:4dac64916871bd3550263323fc2ce18e1e439080a2d5670c594cf3118d99b594"}, +] +pytools = [ + {file = "pytools-2020.2.tar.gz", hash = "sha256:3cacefed54148aafb07502c7c907cae8d9327ea35df16e3366c883a706ed5601"}, +] +pytz = [ + {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, + {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, +] +pywin32 = [ + {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, + {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, + {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, + {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"}, + {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"}, + {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"}, + {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"}, + {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"}, + {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"}, + {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"}, + {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, + {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, +] +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.py3-none-any.whl", hash = "sha256:43999036bfa82904b6af1d99e4882b560e5e2c68e5c4b0aa03b655f3d7d73fee"}, + {file = "requests-2.23.0.tar.gz", hash = "sha256:b3f43d496c6daba4493e7c431722aeb7dbc6288f52a6e04e7b6023b0247817e6"}, +] +six = [ + {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, + {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, +] +sleekxmpp = [ + {file = "sleekxmpp-1.3.3.tar.gz", hash = "sha256:d213c1de71d92505f95ced0460ee0f84fdc4ddcacb7d7dd343739ed4028e5569"}, +] +sqlparse = [ + {file = "sqlparse-0.3.1-py2.py3-none-any.whl", hash = "sha256:022fb9c87b524d1f7862b3037e541f68597a730a8843245c349fc93e1643dc4e"}, + {file = "sqlparse-0.3.1.tar.gz", hash = "sha256:e162203737712307dfe78860cc56c8da8a852ab2ee33750e33aeadf38d12c548"}, +] +sympy = [ + {file = "sympy-1.6-py3-none-any.whl", hash = "sha256:7af1e11e9fcb72362c47a481dc010e518cfcb60a594d1ee8bd268f86ea7d6cbf"}, + {file = "sympy-1.6.tar.gz", hash = "sha256:9769e3d2952e211b1245f1d0dfdbfbdde1f7779a3953832b7dd2b88a21ca6cc6"}, +] +testpath = [ + {file = "testpath-0.4.4-py2.py3-none-any.whl", hash = "sha256:bfcf9411ef4bf3db7579063e0546938b1edda3d69f4e1fb8756991f5951f85d4"}, + {file = "testpath-0.4.4.tar.gz", hash = "sha256:60e0a3261c149755f4399a1fff7d37523179a70fdc3abdf78de9fc2604aeec7e"}, +] +text-unidecode = [ + {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, + {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, +] +traitlets = [ + {file = "traitlets-4.3.3-py2.py3-none-any.whl", hash = "sha256:70b4c6a1d9019d7b4f6846832288f86998aa3b9207c6821f3578a6a6a467fe44"}, + {file = "traitlets-4.3.3.tar.gz", hash = "sha256:d023ee369ddd2763310e4c3eae1ff649689440d4ae59d7485eb4cfbbe3e359f7"}, +] +typed-ast = [ + {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:73d785a950fc82dd2a25897d525d003f6378d1cb23ab305578394694202a58c3"}, + {file = "typed_ast-1.4.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:aaee9905aee35ba5905cfb3c62f3e83b3bec7b39413f0a7f19be4e547ea01ebb"}, + {file = "typed_ast-1.4.1-cp35-cp35m-win32.whl", hash = "sha256:0c2c07682d61a629b68433afb159376e24e5b2fd4641d35424e462169c0a7919"}, + {file = "typed_ast-1.4.1-cp35-cp35m-win_amd64.whl", hash = "sha256:4083861b0aa07990b619bd7ddc365eb7fa4b817e99cf5f8d9cf21a42780f6e01"}, + {file = "typed_ast-1.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:269151951236b0f9a6f04015a9004084a5ab0d5f19b57de779f908621e7d8b75"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:24995c843eb0ad11a4527b026b4dde3da70e1f2d8806c99b7b4a7cf491612652"}, + {file = "typed_ast-1.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:fe460b922ec15dd205595c9b5b99e2f056fd98ae8f9f56b888e7a17dc2b757e7"}, + {file = "typed_ast-1.4.1-cp36-cp36m-win32.whl", hash = "sha256:4e3e5da80ccbebfff202a67bf900d081906c358ccc3d5e3c8aea42fdfdfd51c1"}, + {file = "typed_ast-1.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:249862707802d40f7f29f6e1aad8d84b5aa9e44552d2cc17384b209f091276aa"}, + {file = "typed_ast-1.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8ce678dbaf790dbdb3eba24056d5364fb45944f33553dd5869b7580cdbb83614"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:c9e348e02e4d2b4a8b2eedb48210430658df6951fa484e59de33ff773fbd4b41"}, + {file = "typed_ast-1.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:bcd3b13b56ea479b3650b82cabd6b5343a625b0ced5429e4ccad28a8973f301b"}, + {file = "typed_ast-1.4.1-cp37-cp37m-win32.whl", hash = "sha256:d5d33e9e7af3b34a40dc05f498939f0ebf187f07c385fd58d591c533ad8562fe"}, + {file = "typed_ast-1.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:0666aa36131496aed8f7be0410ff974562ab7eeac11ef351def9ea6fa28f6355"}, + {file = "typed_ast-1.4.1-cp38-cp38-macosx_10_15_x86_64.whl", hash = "sha256:d205b1b46085271b4e15f670058ce182bd1199e56b317bf2ec004b6a44f911f6"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:6daac9731f172c2a22ade6ed0c00197ee7cc1221aa84cfdf9c31defeb059a907"}, + {file = "typed_ast-1.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:498b0f36cc7054c1fead3d7fc59d2150f4d5c6c56ba7fb150c013fbc683a8d2d"}, + {file = "typed_ast-1.4.1-cp38-cp38-win32.whl", hash = "sha256:715ff2f2df46121071622063fc7543d9b1fd19ebfc4f5c8895af64a77a8c852c"}, + {file = "typed_ast-1.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc0fea399acb12edbf8a628ba8d2312f583bdbdb3335635db062fa98cf71fca4"}, + {file = "typed_ast-1.4.1-cp39-cp39-macosx_10_15_x86_64.whl", hash = "sha256:d43943ef777f9a1c42bf4e552ba23ac77a6351de620aa9acf64ad54933ad4d34"}, + {file = "typed_ast-1.4.1.tar.gz", hash = "sha256:8c8aaad94455178e3187ab22c8b01a3837f8ee50e09cf31f1ba129eb293ec30b"}, +] +typing = [ + {file = "typing-3.7.4.1-py2-none-any.whl", hash = "sha256:c8cabb5ab8945cd2f54917be357d134db9cc1eb039e59d1606dc1e60cb1d9d36"}, + {file = "typing-3.7.4.1-py3-none-any.whl", hash = "sha256:f38d83c5a7a7086543a0f649564d661859c5146a85775ab90c0d2f93ffaa9714"}, + {file = "typing-3.7.4.1.tar.gz", hash = "sha256:91dfe6f3f706ee8cc32d38edbbf304e9b7583fb37108fef38229617f8b3eba23"}, +] +typing-extensions = [ + {file = "typing_extensions-3.7.4.2-py2-none-any.whl", hash = "sha256:f8d2bd89d25bc39dabe7d23df520442fa1d8969b82544370e03d88b5a591c392"}, + {file = "typing_extensions-3.7.4.2-py3-none-any.whl", hash = "sha256:6e95524d8a547a91e08f404ae485bbb71962de46967e1b71a0cb89af24e761c5"}, + {file = "typing_extensions-3.7.4.2.tar.gz", hash = "sha256:79ee589a3caca649a9bfd2a8de4709837400dfa00b6cc81962a1e6a1815969ae"}, +] +unicodecsv = [ + {file = "unicodecsv-0.14.1.tar.gz", hash = "sha256:018c08037d48649a0412063ff4eda26eaa81eff1546dbffa51fa5293276ff7fc"}, +] +urllib3 = [ + {file = "urllib3-1.25.9-py2.py3-none-any.whl", hash = "sha256:88206b0eb87e6d677d424843ac5209e3fb9d0190d0ee169599165ec25e9d9115"}, + {file = "urllib3-1.25.9.tar.gz", hash = "sha256:3018294ebefce6572a474f0604c2021e33b3fd8006ecd11d62107a5d2a963527"}, +] +vine = [ + {file = "vine-1.3.0-py2.py3-none-any.whl", hash = "sha256:ea4947cc56d1fd6f2095c8d543ee25dad966f78692528e68b4fada11ba3f98af"}, + {file = "vine-1.3.0.tar.gz", hash = "sha256:133ee6d7a9016f177ddeaf191c1f58421a1dcc6ee9a42c58b34bed40e1d2cd87"}, +] +wcwidth = [ + {file = "wcwidth-0.2.4-py2.py3-none-any.whl", hash = "sha256:79375666b9954d4a1a10739315816324c3e73110af9d0e102d906fdb0aec009f"}, + {file = "wcwidth-0.2.4.tar.gz", hash = "sha256:8c6b5b6ee1360b842645f336d9e5d68c55817c26d3050f46b235ef2bc650e48f"}, +] +webencodings = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] +websocket-client = [ + {file = "websocket_client-0.57.0-py2.py3-none-any.whl", hash = "sha256:0fc45c961324d79c781bab301359d5a1b00b13ad1b10415a4780229ef71a5549"}, + {file = "websocket_client-0.57.0.tar.gz", hash = "sha256:d735b91d6d1692a6a181f2a8c9e0238e5f6373356f561bb9dc4c7af36f452010"}, +] +zipp = [ + {file = "zipp-3.1.0-py3-none-any.whl", hash = "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b"}, + {file = "zipp-3.1.0.tar.gz", hash = "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"}, +] -- GitLab From 11bf1b4b026f8a62be5e05cf54dc0effa3f16788 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 18:18:40 -0500 Subject: [PATCH 09/39] Update poetry action and fix linter error --- .github/workflows/ci.yml | 14 ++++++++++---- relate/bin/relate.py | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 88408949..6198a3f2 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,9 @@ jobs: with: python-version: '3.x' - name: Install Poetry - uses: dschep/install-poetry-action@v1.2 + uses: dschep/install-poetry-action@v1.3 + with: + create_virtualenvs: true - uses: actions/cache@v1 id: cache with: @@ -35,7 +37,7 @@ jobs: run: poetry install if: steps.cache.outputs.cache-hit != 'true' - name: "Flake8" - run: poetry run flake8 relate course accounts tests bin + run: poetry run flake8 relate course accounts tests mypy: name: Mypy @@ -46,7 +48,9 @@ jobs: with: python-version: '3.x' - name: Install Poetry - uses: dschep/install-poetry-action@v1.2 + uses: dschep/install-poetry-action@v1.3 + with: + create_virtualenvs: true - uses: actions/cache@v1 id: cache with: @@ -73,7 +77,9 @@ jobs: with: python-version: '3.x' - name: Install Poetry - uses: dschep/install-poetry-action@v1.2 + uses: dschep/install-poetry-action@v1.3 + with: + create_virtualenvs: true - uses: actions/cache@v1 id: cache with: diff --git a/relate/bin/relate.py b/relate/bin/relate.py index c9468306..1df21764 100644 --- a/relate/bin/relate.py +++ b/relate/bin/relate.py @@ -194,7 +194,7 @@ def test_code_yml(yml_file, repo_root): return for page in pages: - test_code_question(page, repo_root) + test_code_question(page, repo_root) def test_code(args): -- GitLab From 82119aa9194b0ac22ca966e417c2ad42711d7bc4 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 18:27:50 -0500 Subject: [PATCH 10/39] Remove django-mypy plugin as it causes crashes --- setup.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/setup.cfg b/setup.cfg index 41ec1dd3..79d6c666 100644 --- a/setup.cfg +++ b/setup.cfg @@ -8,8 +8,8 @@ strict_optional = True ignore_missing_imports = True follow_imports=skip disallow_untyped_calls = True -plugins = - mypy_django_plugin.main +# plugins = + # mypy_django_plugin.main [mypy.plugins.django-stubs] django_settings_module = "local_settings_example" -- GitLab From c7933c85bbb6835b65a8319dc6db2ae135306641 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 18:30:45 -0500 Subject: [PATCH 11/39] Fixes python interpreter confusion --- .github/workflows/ci.yml | 24 +++++++++++------------- test-command-line-tool.sh | 6 +++--- 2 files changed, 14 insertions(+), 16 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6198a3f2..ebd8471f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -104,15 +104,14 @@ jobs: matrix: python-version: [3.6, 3.7, 3.8] steps: - - uses: actions/checkout@v2 - - - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: "Main Script" - run: | - sudo apt-get install gettext - PY_EXE=python3 RL_CI_TEST=test bash ./run-tests-for-ci.sh + - uses: actions/checkout@v2 + - uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + - name: "Main Script" + run: | + sudo apt-get install -y -qq gettext + PY_EXE=$(poetry run which python) RL_CI_TEST=test bash ./run-tests-for-ci.sh pytest_expensive: name: Pytest Expensive on Py${{ matrix.python-version }} @@ -122,14 +121,13 @@ jobs: python-version: [3.6, 3.7, 3.8] steps: - uses: actions/checkout@v2 - - - uses: actions/setup-python@v1 + - uses: actions/setup-python@v1 with: python-version: ${{ matrix.python-version }} - name: "Main Script" run: | - sudo apt-get install gettext - PY_EXE=python3 RL_CI_TEST=test_expensive bash ./run-tests-for-ci.sh + sudo apt-get install -y -qq gettext + PY_EXE=$(poetry run which python) RL_CI_TEST=test_expensive bash ./run-tests-for-ci.sh # vim: sw=4 diff --git a/test-command-line-tool.sh b/test-command-line-tool.sh index 4321482e..493d718e 100644 --- a/test-command-line-tool.sh +++ b/test-command-line-tool.sh @@ -43,7 +43,7 @@ poetry install git clone https://github.com/inducer/relate-sample cd relate-sample -relate validate . -relate test-code questions/autograded-python-example.yml -relate expand-yaml flows/quiz-test.yml > /dev/null +poetry run relate validate . +poetry run relate test-code questions/autograded-python-example.yml +poetry run relate expand-yaml flows/quiz-test.yml > /dev/null -- GitLab From d3f6b2204fdd30b4b19f2c8e815a155de7e894ec Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 18:50:47 -0500 Subject: [PATCH 12/39] Fix various CI issues --- .github/workflows/ci.yml | 52 +++++++++++++++++++++++++++++++++------- poetry.lock | 49 +++++++++++++------------------------ pyproject.toml | 3 +-- run-tests-for-ci.sh | 6 ++--- setup.cfg | 9 ++++--- 5 files changed, 70 insertions(+), 49 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ebd8471f..fae9e3e1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -108,6 +108,24 @@ jobs: - uses: actions/setup-python@v1 with: python-version: ${{ matrix.python-version }} + - name: Install Poetry + uses: dschep/install-poetry-action@v1.3 + with: + create_virtualenvs: true + - uses: actions/cache@v1 + id: cache + with: + path: ~/.virtualenvs + key: poetry-${{ hashFiles('**/poetry.lock') }} + restore-keys: | + poetry-${{ hashFiles('**/poetry.lock') }} + - name: Set Poetry config + run: | + poetry config virtualenvs.in-project false + poetry config virtualenvs.path ~/.virtualenvs + - name: Install Dependencies + run: poetry install + if: steps.cache.outputs.cache-hit != 'true' - name: "Main Script" run: | sudo apt-get install -y -qq gettext @@ -120,14 +138,32 @@ jobs: matrix: python-version: [3.6, 3.7, 3.8] steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: "Main Script" - run: | - sudo apt-get install -y -qq gettext - PY_EXE=$(poetry run which python) RL_CI_TEST=test_expensive bash ./run-tests-for-ci.sh + - uses: actions/checkout@v2 + - uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + - name: Install Poetry + uses: dschep/install-poetry-action@v1.3 + with: + create_virtualenvs: true + - uses: actions/cache@v1 + id: cache + with: + path: ~/.virtualenvs + key: poetry-${{ hashFiles('**/poetry.lock') }} + restore-keys: | + poetry-${{ hashFiles('**/poetry.lock') }} + - name: Set Poetry config + run: | + poetry config virtualenvs.in-project false + poetry config virtualenvs.path ~/.virtualenvs + - name: Install Dependencies + run: poetry install + if: steps.cache.outputs.cache-hit != 'true' + - name: "Main Script" + run: | + sudo apt-get install -y -qq gettext + PY_EXE=$(poetry run which python) RL_CI_TEST=test_expensive bash ./run-tests-for-ci.sh # vim: sw=4 diff --git a/poetry.lock b/poetry.lock index b95ea6c3..eb65529f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -329,19 +329,6 @@ django-appconf = ">=0.6.0" [package.extras] test = ["pytest", "pytest-cov", "pytest-django", "selenium"] -[[package]] -category = "dev" -description = "Mypy stubs for Django" -name = "django-stubs" -optional = false -python-versions = ">=3.6" -version = "1.5.0" - -[package.dependencies] -django = "*" -mypy = ">=0.770,<0.780" -typing-extensions = "*" - [[package]] category = "main" description = "A Django database field for storing YAML data" @@ -751,7 +738,7 @@ description = "Optional static typing for Python" name = "mypy" optional = false python-versions = ">=3.5" -version = "0.770" +version = "0.780" [package.dependencies] mypy-extensions = ">=0.4.3,<0.5.0" @@ -1329,7 +1316,7 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools", "func-timeout"] [metadata] -content-hash = "0c7f1788c370e47ac78278f773fa9780f51a1ae986fd0945e35896e768f84253" +content-hash = "f4b441ffe2f7c085aa47c134e478a08ece020c04fffaeb2e228f79b706de5157" python-versions = "^3.7" [metadata.files] @@ -1527,10 +1514,6 @@ django-select2 = [ {file = "django-select2-7.4.2.tar.gz", hash = "sha256:9d3330fa0083a03fb69fceb5dcd2e78065cfd08e45c89d4fd727fce4673d3e08"}, {file = "django_select2-7.4.2-py2.py3-none-any.whl", hash = "sha256:06531d563ce33c3133682ae2bb9e6d762103a863d0054ffef51bae8b4cfcca6c"}, ] -django-stubs = [ - {file = "django-stubs-1.5.0.tar.gz", hash = "sha256:b4c9042f2c2fcb89dc0fb37df070cce0f9bf93b39ae193847b6e5a392b13c430"}, - {file = "django_stubs-1.5.0-py3-none-any.whl", hash = "sha256:4a03df70e062f4133085efc461148d0934f36ccfd60a2b6d7bc35821f62008b6"}, -] django-yamlfield = [] djangosaml2 = [ {file = "djangosaml2-0.19.0-py2.py3-none-any.whl", hash = "sha256:fa45289c631047d5fe585ffd8ac0a5335196f157475eb4307198e0089abb775e"}, @@ -1687,20 +1670,20 @@ mpmath = [ {file = "mpmath-1.1.0.tar.gz", hash = "sha256:fc17abe05fbab3382b61a123c398508183406fa132e0223874578e20946499f6"}, ] mypy = [ - {file = "mypy-0.770-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:a34b577cdf6313bf24755f7a0e3f3c326d5c1f4fe7422d1d06498eb25ad0c600"}, - {file = "mypy-0.770-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:86c857510a9b7c3104cf4cde1568f4921762c8f9842e987bc03ed4f160925754"}, - {file = "mypy-0.770-cp35-cp35m-win_amd64.whl", hash = "sha256:a8ffcd53cb5dfc131850851cc09f1c44689c2812d0beb954d8138d4f5fc17f65"}, - {file = "mypy-0.770-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:7687f6455ec3ed7649d1ae574136835a4272b65b3ddcf01ab8704ac65616c5ce"}, - {file = "mypy-0.770-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:3beff56b453b6ef94ecb2996bea101a08f1f8a9771d3cbf4988a61e4d9973761"}, - {file = "mypy-0.770-cp36-cp36m-win_amd64.whl", hash = "sha256:15b948e1302682e3682f11f50208b726a246ab4e6c1b39f9264a8796bb416aa2"}, - {file = "mypy-0.770-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:b90928f2d9eb2f33162405f32dde9f6dcead63a0971ca8a1b50eb4ca3e35ceb8"}, - {file = "mypy-0.770-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c56ffe22faa2e51054c5f7a3bc70a370939c2ed4de308c690e7949230c995913"}, - {file = "mypy-0.770-cp37-cp37m-win_amd64.whl", hash = "sha256:8dfb69fbf9f3aeed18afffb15e319ca7f8da9642336348ddd6cab2713ddcf8f9"}, - {file = "mypy-0.770-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:219a3116ecd015f8dca7b5d2c366c973509dfb9a8fc97ef044a36e3da66144a1"}, - {file = "mypy-0.770-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7ec45a70d40ede1ec7ad7f95b3c94c9cf4c186a32f6bacb1795b60abd2f9ef27"}, - {file = "mypy-0.770-cp38-cp38-win_amd64.whl", hash = "sha256:f91c7ae919bbc3f96cd5e5b2e786b2b108343d1d7972ea130f7de27fdd547cf3"}, - {file = "mypy-0.770-py3-none-any.whl", hash = "sha256:3b1fc683fb204c6b4403a1ef23f0b1fac8e4477091585e0c8c54cbdf7d7bb164"}, - {file = "mypy-0.770.tar.gz", hash = "sha256:8a627507ef9b307b46a1fea9513d5c98680ba09591253082b4c48697ba05a4ae"}, + {file = "mypy-0.780-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:d3b4941de44341227ece1caaf5b08b23e42ad4eeb8b603219afb11e9d4cfb437"}, + {file = "mypy-0.780-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:1f3976a945ad7f0a0727aafdc5651c2d3278e3c88dee94e2bf75cd3386b7b2f4"}, + {file = "mypy-0.780-cp35-cp35m-win_amd64.whl", hash = "sha256:eadb865126da4e3c4c95bdb47fe1bb087a3e3ea14d39a3b13224b8a4d9f9a102"}, + {file = "mypy-0.780-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:75eed74d2faf2759f79c5f56f17388defd2fc994222312ec54ee921e37b31ad4"}, + {file = "mypy-0.780-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2f8c098f12b402c19b735aec724cc9105cc1a9eea405d08814eb4b14a6fb1a41"}, + {file = "mypy-0.780-cp36-cp36m-win_amd64.whl", hash = "sha256:62eb5dd4ea86bda8ce386f26684f7f26e4bfe6283c9f2b6ca6d17faf704dcfad"}, + {file = "mypy-0.780-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:00cb1964a7476e871d6108341ac9c1a857d6bd20bf5877f4773ac5e9d92cd3cd"}, + {file = "mypy-0.780-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:974bebe3699b9b46278a7f076635d219183da26e1a675c1f8243a69221758273"}, + {file = "mypy-0.780-cp37-cp37m-win_amd64.whl", hash = "sha256:64c36eb0936d0bfb7d8da49f92c18e312ad2e3ed46e5548ae4ca997b0d33bd59"}, + {file = "mypy-0.780-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d31291df31bafb997952dc0a17ebb2737f802c754aed31dd155a8bfe75112c57"}, + {file = "mypy-0.780-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a5e5bb12b7982b179af513dddb06fca12285f0316d74f3964078acbfcf4c68f2"}, + {file = "mypy-0.780-cp38-cp38-win_amd64.whl", hash = "sha256:5d142f219bf8c7894dfa79ebfb7d352c4c63a325e75f10dfb4c3db9417dcd135"}, + {file = "mypy-0.780-py3-none-any.whl", hash = "sha256:127de5a9b817a03a98c5ae8a0c46a20dc44442af6dcfa2ae7f96cb519b312efa"}, + {file = "mypy-0.780.tar.gz", hash = "sha256:4ef13b619a289aa025f2273e05e755f8049bb4eaba6d703a425de37d495d178d"}, ] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, diff --git a/pyproject.toml b/pyproject.toml index 8088eefb..823ab7e9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -98,5 +98,4 @@ codecov = "^2.1.4" factory_boy = "^2.12.0" flake8 = "^3.8.3" pep8-naming = "^0.10.0" -mypy = "*" -django-stubs = "^1.5.0" +mypy = "^0.780" diff --git a/run-tests-for-ci.sh b/run-tests-for-ci.sh index 8ff86878..05dc5503 100644 --- a/run-tests-for-ci.sh +++ b/run-tests-for-ci.sh @@ -51,9 +51,9 @@ git submodule update --init --recursive # export PATH=`pwd`/.env/local/bin:$PATH # PIP="${PY_EXE} $(which pip)" -${PY_EXE} -m ensurepip -${PY_EXE} -m pip install poetry -poetry install +# ${PY_EXE} -m ensurepip +# ${PY_EXE} -m pip install poetry +# poetry install diff --git a/setup.cfg b/setup.cfg index 79d6c666..29501ec1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -9,10 +9,13 @@ ignore_missing_imports = True follow_imports=skip disallow_untyped_calls = True # plugins = - # mypy_django_plugin.main +# mypy_django_plugin.main -[mypy.plugins.django-stubs] -django_settings_module = "local_settings_example" +# [mypy.plugins.django-stubs] +# django_settings_module = "local_settings_example" + +[mypy-course.migrations.*] +ignore_errors = True [coverage:run] source = . -- GitLab From 3bdc8869cc902f3744fbf7889920e02c1ef269e1 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 19:00:01 -0500 Subject: [PATCH 13/39] Fix linting and CI again --- pyproject.toml | 2 +- relate/bin/relate.py | 2 +- run-tests-for-ci.sh | 10 ++++++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 823ab7e9..25a39f7b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ packages = [ relate = "relate.bin.relate:main" [tool.poetry.dependencies] -python = "^3.7" +python = "^3.6" django = "^3.0.7" # Automatically renders Django forms in a pretty, Bootstrap-compatible way. django-crispy-forms = ">=1.5.1" diff --git a/relate/bin/relate.py b/relate/bin/relate.py index 1df21764..6be984ec 100644 --- a/relate/bin/relate.py +++ b/relate/bin/relate.py @@ -212,7 +212,7 @@ def expand_yaml_ui(args): print(expand_yaml(args.YAML_FILE, args.repo_root)) -def main(): +def main() -> None: pass import os import argparse diff --git a/run-tests-for-ci.sh b/run-tests-for-ci.sh index 05dc5503..11c64a03 100644 --- a/run-tests-for-ci.sh +++ b/run-tests-for-ci.sh @@ -56,7 +56,7 @@ git submodule update --init --recursive # poetry install - +echo "Local Settings" cp local_settings_example.py local_settings.py if [[ "$RL_CI_TEST" = "test_postgres" ]]; then @@ -75,6 +75,7 @@ if [[ "$RL_CI_TEST" = "test_postgres" ]]; then }" >> local_settings_example.py fi +echo "i18n" # Make sure i18n literals marked correctly poetry run manage.py makemessages --no-location --ignore=req.txt > output.txt @@ -87,9 +88,12 @@ fi poetry run manage.py compilemessages +echo "Coverage packages" poetry run pip install codecov factory_boy + if [[ "$RL_CI_TEST" = "test_expensive" ]]; then + echo "Expensive tests" poetry run coverage run manage.py test tests.test_tasks \ tests.test_admin \ tests.test_pages.test_code \ @@ -114,11 +118,13 @@ if [[ "$RL_CI_TEST" = "test_expensive" ]]; then tests.test_receivers.UpdateCouresOrUserSignalTest elif [[ "$RL_CI_TEST" = "test_postgres" ]]; then + echo "Database tests" poetry run coverage run manage.py test tests.test_postgres - else + echo "Base tests" poetry run coverage run manage.py test tests fi +echo "Upload coverage" poetry run coverage report -m poetry run codecov -- GitLab From 74cf3d9b5d5970b86bf4f314089e49d20675830b Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 19:05:09 -0500 Subject: [PATCH 14/39] Should fix CI - fingers crossed --- local_settings_example.py | 5 ++--- run-tests-for-ci.sh | 10 +++++----- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/local_settings_example.py b/local_settings_example.py index f40d4e90..358fcd9b 100644 --- a/local_settings_example.py +++ b/local_settings_example.py @@ -471,8 +471,7 @@ if RELATE_SIGN_IN_BY_SAML2_ENABLED: SAML_DJANGO_USER_MAIN_ATTRIBUTE = 'username' SAML_DJANGO_USER_MAIN_ATTRIBUTE_LOOKUP = '__iexact' - # The list of IdPs we talk to are defined - SAML_IDP = { + saml_idp = { # Find the entity ID of your IdP and make this the key here: 'urn:mace:incommon:uiuc.edu': { 'single_sign_on_service': { @@ -533,7 +532,7 @@ if RELATE_SIGN_IN_BY_SAML2_ENABLED: # attributes that may be useful to have but not required 'optional_attributes': ['eduPersonAffiliation'], - 'idp': SAML_IDP, + 'idp': saml_idp, }, }, diff --git a/run-tests-for-ci.sh b/run-tests-for-ci.sh index 11c64a03..6f8787c7 100644 --- a/run-tests-for-ci.sh +++ b/run-tests-for-ci.sh @@ -77,7 +77,7 @@ fi echo "i18n" # Make sure i18n literals marked correctly -poetry run manage.py makemessages --no-location --ignore=req.txt > output.txt +poetry run ./manage.py makemessages --no-location --ignore=req.txt > output.txt if [[ -n $(grep "msgid" output.txt) ]]; then echo "Command 'python manage.py makemessages' failed with the following info:" @@ -86,7 +86,7 @@ if [[ -n $(grep "msgid" output.txt) ]]; then exit 1; fi -poetry run manage.py compilemessages +poetry run ./manage.py compilemessages echo "Coverage packages" poetry run pip install codecov factory_boy @@ -94,7 +94,7 @@ poetry run pip install codecov factory_boy if [[ "$RL_CI_TEST" = "test_expensive" ]]; then echo "Expensive tests" - poetry run coverage run manage.py test tests.test_tasks \ + poetry run coverage run ./manage.py test tests.test_tasks \ tests.test_admin \ tests.test_pages.test_code \ tests.test_pages.test_generic \ @@ -119,10 +119,10 @@ if [[ "$RL_CI_TEST" = "test_expensive" ]]; then elif [[ "$RL_CI_TEST" = "test_postgres" ]]; then echo "Database tests" - poetry run coverage run manage.py test tests.test_postgres + poetry run coverage run ./manage.py test tests.test_postgres else echo "Base tests" - poetry run coverage run manage.py test tests + poetry run coverage run ./manage.py test tests fi echo "Upload coverage" -- GitLab From b41ca78698d99ff2f0da66b2bdc9e3ae98f40ea6 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 19:13:16 -0500 Subject: [PATCH 15/39] Fix proper settings copy order --- .github/workflows/ci.yml | 28 ---------------------------- run-tests-for-ci.sh | 13 +++++++------ 2 files changed, 7 insertions(+), 34 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fae9e3e1..fc68c364 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -110,22 +110,8 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install Poetry uses: dschep/install-poetry-action@v1.3 - with: - create_virtualenvs: true - - uses: actions/cache@v1 - id: cache - with: - path: ~/.virtualenvs - key: poetry-${{ hashFiles('**/poetry.lock') }} - restore-keys: | - poetry-${{ hashFiles('**/poetry.lock') }} - - name: Set Poetry config - run: | - poetry config virtualenvs.in-project false - poetry config virtualenvs.path ~/.virtualenvs - name: Install Dependencies run: poetry install - if: steps.cache.outputs.cache-hit != 'true' - name: "Main Script" run: | sudo apt-get install -y -qq gettext @@ -144,22 +130,8 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install Poetry uses: dschep/install-poetry-action@v1.3 - with: - create_virtualenvs: true - - uses: actions/cache@v1 - id: cache - with: - path: ~/.virtualenvs - key: poetry-${{ hashFiles('**/poetry.lock') }} - restore-keys: | - poetry-${{ hashFiles('**/poetry.lock') }} - - name: Set Poetry config - run: | - poetry config virtualenvs.in-project false - poetry config virtualenvs.path ~/.virtualenvs - name: Install Dependencies run: poetry install - if: steps.cache.outputs.cache-hit != 'true' - name: "Main Script" run: | sudo apt-get install -y -qq gettext diff --git a/run-tests-for-ci.sh b/run-tests-for-ci.sh index 6f8787c7..26f46174 100644 --- a/run-tests-for-ci.sh +++ b/run-tests-for-ci.sh @@ -9,9 +9,9 @@ echo "-----------------------------------------------" # {{{ clean up -rm -Rf .env -rm -Rf build -find . -name '*.pyc' -delete +# rm -Rf .env +# rm -Rf build +# find . -name '*.pyc' -delete # }}} @@ -57,7 +57,6 @@ git submodule update --init --recursive echo "Local Settings" -cp local_settings_example.py local_settings.py if [[ "$RL_CI_TEST" = "test_postgres" ]]; then poetry run pip install psycopg2-binary @@ -75,9 +74,11 @@ if [[ "$RL_CI_TEST" = "test_postgres" ]]; then }" >> local_settings_example.py fi +cp local_settings_example.py local_settings.py + echo "i18n" # Make sure i18n literals marked correctly -poetry run ./manage.py makemessages --no-location --ignore=req.txt > output.txt +poetry run python manage.py makemessages --no-location --ignore=req.txt > output.txt if [[ -n $(grep "msgid" output.txt) ]]; then echo "Command 'python manage.py makemessages' failed with the following info:" @@ -86,7 +87,7 @@ if [[ -n $(grep "msgid" output.txt) ]]; then exit 1; fi -poetry run ./manage.py compilemessages +poetry run python manage.py compilemessages echo "Coverage packages" poetry run pip install codecov factory_boy -- GitLab From 9a3e4c19dc4f8bf5a81479ab58b6ac1e94200fdb Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 8 Jun 2020 19:25:26 -0500 Subject: [PATCH 16/39] Add dep caching back to tests --- .github/workflows/ci.yml | 55 +++++++++++++++++++++++++++++++++------- run-tests-for-ci.sh | 5 +--- 2 files changed, 47 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fc68c364..25f69d91 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,11 +13,14 @@ jobs: flake8: name: Flake8 runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.7] steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v1 with: - python-version: '3.x' + python-version: ${{ matrix.python-version }} - name: Install Poetry uses: dschep/install-poetry-action@v1.3 with: @@ -26,9 +29,9 @@ jobs: id: cache with: path: ~/.virtualenvs - key: poetry-${{ hashFiles('**/poetry.lock') }} + key: poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} restore-keys: | - poetry-${{ hashFiles('**/poetry.lock') }} + poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - name: Set Poetry config run: | poetry config virtualenvs.in-project false @@ -42,11 +45,14 @@ jobs: mypy: name: Mypy runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.7] steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v1 with: - python-version: '3.x' + python-version: ${{ matrix.python-version }} - name: Install Poetry uses: dschep/install-poetry-action@v1.3 with: @@ -55,9 +61,9 @@ jobs: id: cache with: path: ~/.virtualenvs - key: poetry-${{ hashFiles('**/poetry.lock') }} + key: poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} restore-keys: | - poetry-${{ hashFiles('**/poetry.lock') }} + poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - name: Set Poetry config run: | poetry config virtualenvs.in-project false @@ -71,11 +77,14 @@ jobs: cmdline: name: Command Line runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.7] steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v1 with: - python-version: '3.x' + python-version: ${{ matrix.python-version }} - name: Install Poetry uses: dschep/install-poetry-action@v1.3 with: @@ -84,9 +93,9 @@ jobs: id: cache with: path: ~/.virtualenvs - key: poetry-${{ hashFiles('**/poetry.lock') }} + key: poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} restore-keys: | - poetry-${{ hashFiles('**/poetry.lock') }} + poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - name: Set Poetry config run: | poetry config virtualenvs.in-project false @@ -110,8 +119,22 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install Poetry uses: dschep/install-poetry-action@v1.3 + with: + create_virtualenvs: true + - uses: actions/cache@v1 + id: cache + with: + path: ~/.virtualenvs + key: poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + restore-keys: | + poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + - name: Set Poetry config + run: | + poetry config virtualenvs.in-project false + poetry config virtualenvs.path ~/.virtualenvs - name: Install Dependencies run: poetry install + if: steps.cache.outputs.cache-hit != 'true' - name: "Main Script" run: | sudo apt-get install -y -qq gettext @@ -130,8 +153,22 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install Poetry uses: dschep/install-poetry-action@v1.3 + with: + create_virtualenvs: true + - uses: actions/cache@v1 + id: cache + with: + path: ~/.virtualenvs + key: poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + restore-keys: | + poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + - name: Set Poetry config + run: | + poetry config virtualenvs.in-project false + poetry config virtualenvs.path ~/.virtualenvs - name: Install Dependencies run: poetry install + if: steps.cache.outputs.cache-hit != 'true' - name: "Main Script" run: | sudo apt-get install -y -qq gettext diff --git a/run-tests-for-ci.sh b/run-tests-for-ci.sh index 26f46174..6e2fe486 100644 --- a/run-tests-for-ci.sh +++ b/run-tests-for-ci.sh @@ -89,10 +89,7 @@ fi poetry run python manage.py compilemessages -echo "Coverage packages" -poetry run pip install codecov factory_boy - - +echo "Starts testing" if [[ "$RL_CI_TEST" = "test_expensive" ]]; then echo "Expensive tests" poetry run coverage run ./manage.py test tests.test_tasks \ -- GitLab From 9f2e127a7702a8790da5f6a9a4c0baef2ed57742 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Tue, 9 Jun 2020 09:42:58 -0500 Subject: [PATCH 17/39] Fixes broken import and coverage ignore --- local_settings_example.py | 2 +- relate/settings.py | 3 ++- setup.cfg | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/local_settings_example.py b/local_settings_example.py index 358fcd9b..cfa3fd85 100644 --- a/local_settings_example.py +++ b/local_settings_example.py @@ -11,7 +11,7 @@ ALLOWED_HOSTS = [ # Configure the following as url as above. RELATE_BASE_URL = "http://YOUR/RELATE/SITE/DOMAIN" -from django.conf.global_settings import gettext_noop # noqa +from django.utils.translation import gettext_noop # noqa # Uncomment this to configure the site name of your relate instance. # If not configured, "RELATE" will be used as default value. diff --git a/relate/settings.py b/relate/settings.py index 67e73663..497dabb0 100644 --- a/relate/settings.py +++ b/relate/settings.py @@ -9,7 +9,8 @@ from typing import Callable, Any, Union, Dict # noqa # Do not change this file. All these settings can be overridden in # local_settings.py. -from django.conf.global_settings import STATICFILES_FINDERS, gettext_noop +from django.conf.global_settings import STATICFILES_FINDERS +from django.utils.translation import gettext_noop # Build paths inside the project like this: os.path.join(BASE_DIR, ...) import sys diff --git a/setup.cfg b/setup.cfg index 29501ec1..2762487f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -38,7 +38,7 @@ omit = */tests/* */tests.py # FIXME: Temporary since this file is now picked up by coverage - bin/* + relate/bin/relate.py [coverage:report] exclude_lines = -- GitLab From 7acf3cc9e16061e18fcce6d371ebbbec954dba19 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Tue, 9 Jun 2020 12:11:01 -0500 Subject: [PATCH 18/39] Test using the native codecov action --- .github/workflows/ci.yml | 4 ++++ run-tests-for-ci.sh | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 25f69d91..0f361321 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -139,6 +139,8 @@ jobs: run: | sudo apt-get install -y -qq gettext PY_EXE=$(poetry run which python) RL_CI_TEST=test bash ./run-tests-for-ci.sh + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1 pytest_expensive: name: Pytest Expensive on Py${{ matrix.python-version }} @@ -173,6 +175,8 @@ jobs: run: | sudo apt-get install -y -qq gettext PY_EXE=$(poetry run which python) RL_CI_TEST=test_expensive bash ./run-tests-for-ci.sh + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1 # vim: sw=4 diff --git a/run-tests-for-ci.sh b/run-tests-for-ci.sh index 6e2fe486..26d17243 100644 --- a/run-tests-for-ci.sh +++ b/run-tests-for-ci.sh @@ -125,4 +125,4 @@ fi echo "Upload coverage" poetry run coverage report -m -poetry run codecov +# poetry run codecov -- GitLab From dc92d62f70d33013dbbacadee71661d7a1d684cf Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Tue, 9 Jun 2020 12:23:32 -0500 Subject: [PATCH 19/39] Explicitly produce coverage xml output --- .github/workflows/ci.yml | 4 ++-- .gitignore | 2 ++ run-tests-for-ci.sh | 1 + 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0f361321..d028e525 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -137,7 +137,7 @@ jobs: if: steps.cache.outputs.cache-hit != 'true' - name: "Main Script" run: | - sudo apt-get install -y -qq gettext + sudo apt-get -qq install -y gettext PY_EXE=$(poetry run which python) RL_CI_TEST=test bash ./run-tests-for-ci.sh - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 @@ -173,7 +173,7 @@ jobs: if: steps.cache.outputs.cache-hit != 'true' - name: "Main Script" run: | - sudo apt-get install -y -qq gettext + sudo apt-get -qq install -y gettext PY_EXE=$(poetry run which python) RL_CI_TEST=test_expensive bash ./run-tests-for-ci.sh - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 diff --git a/.gitignore b/.gitignore index edc7b5d6..bf6a3470 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,5 @@ git-roots /.idea /.env +/.coverage +/coverage.xml diff --git a/run-tests-for-ci.sh b/run-tests-for-ci.sh index 26d17243..56b77bec 100644 --- a/run-tests-for-ci.sh +++ b/run-tests-for-ci.sh @@ -124,5 +124,6 @@ else fi echo "Upload coverage" +poetry run coverage xml poetry run coverage report -m # poetry run codecov -- GitLab From c829cbb9ba1cb40c6904075ebbdc662a7f180e80 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Tue, 9 Jun 2020 12:56:32 -0500 Subject: [PATCH 20/39] Remove extraneous tests. Update appveyor config --- .github/workflows/ci.yml | 58 +++++++++++++++------------------------- appveyor.yml | 14 +++++----- run-tests-for-ci.sh | 4 +-- 3 files changed, 31 insertions(+), 45 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d028e525..dc4e11d3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,14 +28,10 @@ jobs: - uses: actions/cache@v1 id: cache with: - path: ~/.virtualenvs - key: poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + path: ~/.cache/pypoetry/virtualenvs + key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} restore-keys: | - poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - - name: Set Poetry config - run: | - poetry config virtualenvs.in-project false - poetry config virtualenvs.path ~/.virtualenvs + pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - name: Install Dependencies run: poetry install if: steps.cache.outputs.cache-hit != 'true' @@ -60,14 +56,10 @@ jobs: - uses: actions/cache@v1 id: cache with: - path: ~/.virtualenvs - key: poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + path: ~/.cache/pypoetry/virtualenvs + key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} restore-keys: | - poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - - name: Set Poetry config - run: | - poetry config virtualenvs.in-project false - poetry config virtualenvs.path ~/.virtualenvs + pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - name: Install Dependencies run: poetry install if: steps.cache.outputs.cache-hit != 'true' @@ -92,14 +84,10 @@ jobs: - uses: actions/cache@v1 id: cache with: - path: ~/.virtualenvs - key: poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + path: ~/.cache/pypoetry/virtualenvs + key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} restore-keys: | - poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - - name: Set Poetry config - run: | - poetry config virtualenvs.in-project false - poetry config virtualenvs.path ~/.virtualenvs + pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - name: Install Dependencies run: poetry install if: steps.cache.outputs.cache-hit != 'true' @@ -124,23 +112,21 @@ jobs: - uses: actions/cache@v1 id: cache with: - path: ~/.virtualenvs - key: poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + path: ~/.cache/pypoetry/virtualenvs + key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} restore-keys: | - poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - - name: Set Poetry config - run: | - poetry config virtualenvs.in-project false - poetry config virtualenvs.path ~/.virtualenvs + pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - name: Install Dependencies run: poetry install if: steps.cache.outputs.cache-hit != 'true' - name: "Main Script" run: | - sudo apt-get -qq install -y gettext + sudo DEBIAN_FRONTEND=noninteractive apt-get install -qq gettext PY_EXE=$(poetry run which python) RL_CI_TEST=test bash ./run-tests-for-ci.sh - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 + with: + fail_ci_if_error: true pytest_expensive: name: Pytest Expensive on Py${{ matrix.python-version }} @@ -160,23 +146,21 @@ jobs: - uses: actions/cache@v1 id: cache with: - path: ~/.virtualenvs - key: poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + path: ~/.cache/pypoetry/virtualenvs + key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} restore-keys: | - poetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - - name: Set Poetry config - run: | - poetry config virtualenvs.in-project false - poetry config virtualenvs.path ~/.virtualenvs + pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - name: Install Dependencies run: poetry install if: steps.cache.outputs.cache-hit != 'true' - name: "Main Script" run: | - sudo apt-get -qq install -y gettext + sudo DEBIAN_FRONTEND=noninteractive apt-get install -qq gettext PY_EXE=$(poetry run which python) RL_CI_TEST=test_expensive bash ./run-tests-for-ci.sh - name: Upload coverage to Codecov uses: codecov/codecov-action@v1 + with: + fail_ci_if_error: true # vim: sw=4 diff --git a/appveyor.yml b/appveyor.yml index 14c21ad9..1c84b243 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -57,19 +57,21 @@ install: # Update pip/setuptools/wheel to avoid an issue like # https://github.com/HearthSim/decrunch/issues/3 # e.g. https://ci.appveyor.com/project/inducer/relate/build/1.0.936 - - "%CMD_IN_ENV% python -m pip install --upgrade pip setuptools wheel" + - "%CMD_IN_ENV% python -m pip install --upgrade pip setuptools wheel poetry" # Install requirements - - "%CMD_IN_ENV% pip install -r requirements.txt" + - "%CMD_IN_ENV% poetry install" + + # - "%CMD_IN_ENV% pip install -r requirements.txt" before_test: - - "%CMD_IN_ENV% pip install coverage factory_boy" + - "%CMD_IN_ENV% poetry run pip install coverage factory_boy" test_script: # Run the project tests - - "%CMD_IN_ENV% coverage run manage.py test tests/" + - "%CMD_IN_ENV% poetry run coverage run manage.py test tests/" after_test: - - "%CMD_IN_ENV% pip install codecov" - - "%CMD_IN_ENV% codecov -X gcov" + - "%CMD_IN_ENV% poetry run pip install codecov" + - "%CMD_IN_ENV% poetry run codecov -X gcov" diff --git a/run-tests-for-ci.sh b/run-tests-for-ci.sh index 56b77bec..1a3798aa 100644 --- a/run-tests-for-ci.sh +++ b/run-tests-for-ci.sh @@ -123,7 +123,7 @@ else poetry run coverage run ./manage.py test tests fi -echo "Upload coverage" +echo "Generate coverage report" poetry run coverage xml -poetry run coverage report -m +# poetry run coverage report -m # poetry run codecov -- GitLab From e7a2fa1e11da5a6bdd7907b719e45fc4f7e662bd Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Tue, 9 Jun 2020 13:25:48 -0500 Subject: [PATCH 21/39] Add postgres tests to github actions --- .github/workflows/ci.yml | 45 ++++++++++++++++++++++++++++++++++++++++ appveyor.yml | 9 ++++---- run-tests-for-ci.sh | 5 ++++- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index dc4e11d3..a3d98e39 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -128,6 +128,51 @@ jobs: with: fail_ci_if_error: true + pytest-pg: + name: Pytest-postgres on Py${{ matrix.python-version }} + runs-on: ubuntu-latest + services: + postgres: + image: postgres + env: + POSTGRES_PASSWORD: relatepgpass + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + strategy: + matrix: + python-version: [3.6, 3.7, 3.8] + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + - name: Install Poetry + uses: dschep/install-poetry-action@v1.3 + with: + create_virtualenvs: true + - uses: actions/cache@v1 + id: cache + with: + path: ~/.cache/pypoetry/virtualenvs + key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + restore-keys: | + pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + - name: Install Dependencies + run: poetry install + if: steps.cache.outputs.cache-hit != 'true' + - name: "Main Script" + run: | + sudo DEBIAN_FRONTEND=noninteractive apt-get install -qq gettext + PY_EXE=$(poetry run which python) RL_CI_TEST=test_postgres bash ./run-tests-for-ci.sh + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1 + with: + fail_ci_if_error: true + + pytest_expensive: name: Pytest Expensive on Py${{ matrix.python-version }} runs-on: ubuntu-latest diff --git a/appveyor.yml b/appveyor.yml index 1c84b243..32705f44 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -57,7 +57,8 @@ install: # Update pip/setuptools/wheel to avoid an issue like # https://github.com/HearthSim/decrunch/issues/3 # e.g. https://ci.appveyor.com/project/inducer/relate/build/1.0.936 - - "%CMD_IN_ENV% python -m pip install --upgrade pip setuptools wheel poetry" + # - "%CMD_IN_ENV% python -m pip install --upgrade pip setuptools wheel poetry" + - "%CMD_IN_ENV% python -m pip install poetry" # Install requirements - "%CMD_IN_ENV% poetry install" @@ -65,13 +66,13 @@ install: # - "%CMD_IN_ENV% pip install -r requirements.txt" -before_test: - - "%CMD_IN_ENV% poetry run pip install coverage factory_boy" +# before_test: +# - "%CMD_IN_ENV% poetry run pip install coverage factory_boy" test_script: # Run the project tests - "%CMD_IN_ENV% poetry run coverage run manage.py test tests/" after_test: - - "%CMD_IN_ENV% poetry run pip install codecov" + # - "%CMD_IN_ENV% poetry run pip install codecov" - "%CMD_IN_ENV% poetry run codecov -X gcov" diff --git a/run-tests-for-ci.sh b/run-tests-for-ci.sh index 1a3798aa..961653f1 100644 --- a/run-tests-for-ci.sh +++ b/run-tests-for-ci.sh @@ -60,12 +60,15 @@ echo "Local Settings" if [[ "$RL_CI_TEST" = "test_postgres" ]]; then poetry run pip install psycopg2-binary - psql -c 'create database relate;' -U postgres + export PGPASSWORD=relatepgpass + psql -c 'create database relate;' -h postgres -U postgres echo "import psycopg2.extensions" >> local_settings_example.py echo "DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'HOST': 'postgres', 'USER': 'postgres', + 'PASSWORD': '${PGPASSWORD}', 'NAME': 'test_relate', 'OPTIONS': { 'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE, -- GitLab From 2ab713e66139900e187952f17a276bc65b2b56b4 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Tue, 9 Jun 2020 13:32:30 -0500 Subject: [PATCH 22/39] Fix port mapping for postgres tests --- .github/workflows/ci.yml | 5 ++++- run-tests-for-ci.sh | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a3d98e39..6f5fc4ed 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -129,18 +129,21 @@ jobs: fail_ci_if_error: true pytest-pg: - name: Pytest-postgres on Py${{ matrix.python-version }} + name: Pytest Postgres on Py${{ matrix.python-version }} runs-on: ubuntu-latest services: postgres: image: postgres env: POSTGRES_PASSWORD: relatepgpass + POSTGRES_DB: test_relate options: >- --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + ports: + - 5432:5432 strategy: matrix: python-version: [3.6, 3.7, 3.8] diff --git a/run-tests-for-ci.sh b/run-tests-for-ci.sh index 961653f1..c514580f 100644 --- a/run-tests-for-ci.sh +++ b/run-tests-for-ci.sh @@ -61,12 +61,12 @@ echo "Local Settings" if [[ "$RL_CI_TEST" = "test_postgres" ]]; then poetry run pip install psycopg2-binary export PGPASSWORD=relatepgpass - psql -c 'create database relate;' -h postgres -U postgres + # psql -c 'create database relate;' -U postgres echo "import psycopg2.extensions" >> local_settings_example.py echo "DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'HOST': 'postgres', + 'HOST': 'localhost', 'USER': 'postgres', 'PASSWORD': '${PGPASSWORD}', 'NAME': 'test_relate', -- GitLab From f53072ecd47dc80826275af60472d5e41ce80e93 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Wed, 10 Jun 2020 14:33:32 -0500 Subject: [PATCH 23/39] Move ci scripts to common directory and refactor --- .../build-validator-pyz.sh | 0 run-mypy.sh => .ci/run-mypy.sh | 0 .../run-tests-for-ci.sh | 66 +--- {appveyor => .ci}/run_with_env.cmd | 0 .../test-command-line-tool.sh | 1 + .github/workflows/ci.yml | 281 +++++------------- .travis.yml | 25 -- appveyor.yml | 13 +- requirements.txt | 118 -------- run-travis-ci.sh | 25 -- 10 files changed, 89 insertions(+), 440 deletions(-) rename build-validator-pyz.sh => .ci/build-validator-pyz.sh (100%) rename run-mypy.sh => .ci/run-mypy.sh (100%) rename run-tests-for-ci.sh => .ci/run-tests-for-ci.sh (69%) rename {appveyor => .ci}/run_with_env.cmd (100%) rename test-command-line-tool.sh => .ci/test-command-line-tool.sh (98%) delete mode 100644 .travis.yml delete mode 100644 requirements.txt delete mode 100644 run-travis-ci.sh diff --git a/build-validator-pyz.sh b/.ci/build-validator-pyz.sh similarity index 100% rename from build-validator-pyz.sh rename to .ci/build-validator-pyz.sh diff --git a/run-mypy.sh b/.ci/run-mypy.sh similarity index 100% rename from run-mypy.sh rename to .ci/run-mypy.sh diff --git a/run-tests-for-ci.sh b/.ci/run-tests-for-ci.sh similarity index 69% rename from run-tests-for-ci.sh rename to .ci/run-tests-for-ci.sh index c514580f..617d7809 100644 --- a/run-tests-for-ci.sh +++ b/.ci/run-tests-for-ci.sh @@ -2,63 +2,17 @@ set -e +PY_EXE=${PY_EXE:-$(poetry run which python)} + echo "-----------------------------------------------" echo "Current directory: $(pwd)" echo "Python executable: ${PY_EXE}" echo "-----------------------------------------------" -# {{{ clean up - -# rm -Rf .env -# rm -Rf build -# find . -name '*.pyc' -delete - -# }}} - -git submodule update --init --recursive - -# {{{ virtualenv - -# VENV_VERSION="virtualenv-15.2.0" -# rm -Rf "$VENV_VERSION" -# curl -k https://files.pythonhosted.org/packages/b1/72/2d70c5a1de409ceb3a27ff2ec007ecdd5cc52239e7c74990e32af57affe9/$VENV_VERSION.tar.gz | tar xfz - - -# VIRTUALENV="${PY_EXE} -m venv" -# ${VIRTUALENV} -h > /dev/null || VIRTUALENV="$VENV_VERSION/virtualenv.py --no-setuptools -p ${PY_EXE}" - -# if [ -d ".env" ]; then -# echo "**> virtualenv exists" -# else -# echo "**> creating virtualenv" -# ${VIRTUALENV} .env -# fi - -# . .env/bin/activate - -# }}} - -# {{{ setuptools - -#curl -k https://bitbucket.org/pypa/setuptools/raw/bootstrap-py24/ez_setup.py | python - -#curl -k https://ssl.tiker.net/software/ez_setup.py | python - -# curl -k https://bootstrap.pypa.io/ez_setup.py | python - - -# }}} - -# curl -k https://bootstrap.pypa.io/get-pip.py | python - - -# Not sure why pip ends up there, but in Py3.3, it sometimes does. -# export PATH=`pwd`/.env/local/bin:$PATH - -# PIP="${PY_EXE} $(which pip)" -# ${PY_EXE} -m ensurepip -# ${PY_EXE} -m pip install poetry -# poetry install - - -echo "Local Settings" +echo "\nLocal Settings" if [[ "$RL_CI_TEST" = "test_postgres" ]]; then + echo "Preparing database" poetry run pip install psycopg2-binary export PGPASSWORD=relatepgpass # psql -c 'create database relate;' -U postgres @@ -79,7 +33,7 @@ fi cp local_settings_example.py local_settings.py -echo "i18n" +echo "\ni18n" # Make sure i18n literals marked correctly poetry run python manage.py makemessages --no-location --ignore=req.txt > output.txt @@ -92,8 +46,8 @@ fi poetry run python manage.py compilemessages -echo "Starts testing" -if [[ "$RL_CI_TEST" = "test_expensive" ]]; then +echo "\nStarts testing" +if [[ "$RL_CI_TEST" = "expensive" ]]; then echo "Expensive tests" poetry run coverage run ./manage.py test tests.test_tasks \ tests.test_admin \ @@ -118,7 +72,7 @@ if [[ "$RL_CI_TEST" = "test_expensive" ]]; then tests.test_versioning.ParamikoSSHVendorTest \ tests.test_receivers.UpdateCouresOrUserSignalTest -elif [[ "$RL_CI_TEST" = "test_postgres" ]]; then +elif [[ "$RL_CI_TEST" = "postgres" ]]; then echo "Database tests" poetry run coverage run ./manage.py test tests.test_postgres else @@ -126,7 +80,5 @@ else poetry run coverage run ./manage.py test tests fi -echo "Generate coverage report" +echo "\nGenerate coverage report" poetry run coverage xml -# poetry run coverage report -m -# poetry run codecov diff --git a/appveyor/run_with_env.cmd b/.ci/run_with_env.cmd similarity index 100% rename from appveyor/run_with_env.cmd rename to .ci/run_with_env.cmd diff --git a/test-command-line-tool.sh b/.ci/test-command-line-tool.sh similarity index 98% rename from test-command-line-tool.sh rename to .ci/test-command-line-tool.sh index 493d718e..834b41b8 100644 --- a/test-command-line-tool.sh +++ b/.ci/test-command-line-tool.sh @@ -39,6 +39,7 @@ ${PY_EXE} -m pip install poetry # }}} poetry install +poetry shell git clone https://github.com/inducer/relate-sample cd relate-sample diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6f5fc4ed..f90a6b82 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,214 +1,83 @@ name: CI on: - push: - branches: - - master - pull_request: - paths-ignore: - - 'doc/*.rst' - schedule: - - cron: '17 3 * * 0' + push: + branches: + - master + pull_request: + paths-ignore: + - "doc/*.rst" + schedule: + - cron: "17 3 * * 0" jobs: - flake8: - name: Flake8 - runs-on: ubuntu-latest - strategy: - matrix: - python-version: [3.7] - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: Install Poetry - uses: dschep/install-poetry-action@v1.3 - with: - create_virtualenvs: true - - uses: actions/cache@v1 - id: cache - with: - path: ~/.cache/pypoetry/virtualenvs - key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - restore-keys: | - pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - - name: Install Dependencies - run: poetry install - if: steps.cache.outputs.cache-hit != 'true' - - name: "Flake8" - run: poetry run flake8 relate course accounts tests + lint: + name: Lint and typecheck + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v1 + with: + python-version: 3.7 + - name: Install Poetry + uses: dschep/install-poetry-action@v1.3 + - name: Install Dependencies + run: poetry install + - name: "Flake8" + run: poetry run flake8 relate course accounts tests + - name: "Mypy" + run: poetry run mypy relate course - mypy: - name: Mypy - runs-on: ubuntu-latest - strategy: - matrix: - python-version: [3.7] - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: Install Poetry - uses: dschep/install-poetry-action@v1.3 - with: - create_virtualenvs: true - - uses: actions/cache@v1 - id: cache - with: - path: ~/.cache/pypoetry/virtualenvs - key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - restore-keys: | - pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - - name: Install Dependencies - run: poetry install - if: steps.cache.outputs.cache-hit != 'true' - - name: "Mypy" - run: poetry run mypy relate course - cmdline: - name: Command Line - runs-on: ubuntu-latest - strategy: - matrix: - python-version: [3.7] - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: Install Poetry - uses: dschep/install-poetry-action@v1.3 - with: - create_virtualenvs: true - - uses: actions/cache@v1 - id: cache - with: - path: ~/.cache/pypoetry/virtualenvs - key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - restore-keys: | - pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - - name: Install Dependencies - run: poetry install - if: steps.cache.outputs.cache-hit != 'true' - - name: "Main Script" - run: PY_EXE=$(poetry run which python) bash ./test-command-line-tool.sh $(poetry run which python) + pytest: + name: Pytest-${{ matrix.suite }} on Py${{ matrix.python-version }} + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [3.6, 3.7, 3.8] + suite: ['base', 'postgres', 'expensive'] + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-python@v1 + with: + python-version: ${{ matrix.python-version }} + - name: Install Poetry + uses: dschep/install-poetry-action@v1.3 + with: + create_virtualenvs: true + - name: Cache python dependencies + uses: actions/cache@v1 + id: cache + with: + path: ~/.cache/pypoetry/virtualenvs + key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + restore-keys: | + pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} + - name: Install Dependencies + run: poetry install + if: steps.cache.outputs.cache-hit != 'true' + - name: Install OS dependencies + env: + DEBIAN_FRONTEND: noninteractive + run: | + apt-get install gettext + - name: Run test suite + env: + RL_CI_TEST: ${{ matrix.suite }} + run: | + bash ./.ci/run-tests-for-ci.sh + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v1 + with: + fail_ci_if_error: true + - name: Test command line tool + if: matrix.suite == "base" + run: | + git clone https://github.com/inducer/relate-sample + poetry shell + cd relate-sample - pytest: - name: Pytest on Py${{ matrix.python-version }} - runs-on: ubuntu-latest - strategy: - matrix: - python-version: [3.6, 3.7, 3.8] - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: Install Poetry - uses: dschep/install-poetry-action@v1.3 - with: - create_virtualenvs: true - - uses: actions/cache@v1 - id: cache - with: - path: ~/.cache/pypoetry/virtualenvs - key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - restore-keys: | - pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - - name: Install Dependencies - run: poetry install - if: steps.cache.outputs.cache-hit != 'true' - - name: "Main Script" - run: | - sudo DEBIAN_FRONTEND=noninteractive apt-get install -qq gettext - PY_EXE=$(poetry run which python) RL_CI_TEST=test bash ./run-tests-for-ci.sh - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 - with: - fail_ci_if_error: true - - pytest-pg: - name: Pytest Postgres on Py${{ matrix.python-version }} - runs-on: ubuntu-latest - services: - postgres: - image: postgres - env: - POSTGRES_PASSWORD: relatepgpass - POSTGRES_DB: test_relate - options: >- - --health-cmd pg_isready - --health-interval 10s - --health-timeout 5s - --health-retries 5 - ports: - - 5432:5432 - strategy: - matrix: - python-version: [3.6, 3.7, 3.8] - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: Install Poetry - uses: dschep/install-poetry-action@v1.3 - with: - create_virtualenvs: true - - uses: actions/cache@v1 - id: cache - with: - path: ~/.cache/pypoetry/virtualenvs - key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - restore-keys: | - pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - - name: Install Dependencies - run: poetry install - if: steps.cache.outputs.cache-hit != 'true' - - name: "Main Script" - run: | - sudo DEBIAN_FRONTEND=noninteractive apt-get install -qq gettext - PY_EXE=$(poetry run which python) RL_CI_TEST=test_postgres bash ./run-tests-for-ci.sh - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 - with: - fail_ci_if_error: true - - - pytest_expensive: - name: Pytest Expensive on Py${{ matrix.python-version }} - runs-on: ubuntu-latest - strategy: - matrix: - python-version: [3.6, 3.7, 3.8] - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-python@v1 - with: - python-version: ${{ matrix.python-version }} - - name: Install Poetry - uses: dschep/install-poetry-action@v1.3 - with: - create_virtualenvs: true - - uses: actions/cache@v1 - id: cache - with: - path: ~/.cache/pypoetry/virtualenvs - key: pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - restore-keys: | - pypoetry-${{ hashFiles('**/poetry.lock') }}-${{ matrix.python-version }} - - name: Install Dependencies - run: poetry install - if: steps.cache.outputs.cache-hit != 'true' - - name: "Main Script" - run: | - sudo DEBIAN_FRONTEND=noninteractive apt-get install -qq gettext - PY_EXE=$(poetry run which python) RL_CI_TEST=test_expensive bash ./run-tests-for-ci.sh - - name: Upload coverage to Codecov - uses: codecov/codecov-action@v1 - with: - fail_ci_if_error: true - -# vim: sw=4 + relate validate . + relate test-code questions/autograded-python-example.yml + relate expand-yaml flows/quiz-test.yml > /dev/null +# vim: sw=2 diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 3e02cadb..00000000 --- a/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -language: python -dist: xenial -cache: pip -install: true - -addons: - postgresql: "10" - -matrix: - include: - - python: "3.7" - env: RL_TRAVIS_TEST=test PY_EXE=python3.7 - - python: "3.7" - env: RL_TRAVIS_TEST=test_expensive PY_EXE=python3.7 - - python: "3.7" - env: RL_TRAVIS_TEST=test_postgres PY_EXE=python3.7 - - - python: "3.7" - env: RL_TRAVIS_TEST=cmdline PY_EXE=python3.7 - - python: "3.7" - env: RL_TRAVIS_TEST=flake8 PY_EXE=python3.7 - - python: "3.7" - env: RL_TRAVIS_TEST=mypy PY_EXE=python3.7 -script: - - bash ./run-travis-ci.sh diff --git a/appveyor.yml b/appveyor.yml index 32705f44..f1683151 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -16,7 +16,7 @@ environment: # SDK v7.0 MSVC Express 2008's SetEnv.cmd script will fail if the # /E:ON and /V:ON options are not enabled in the batch script intepreter # See: http://stackoverflow.com/a/13751649/163740 - CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\appveyor\\run_with_env.cmd" + CMD_IN_ENV: "cmd /E:ON /V:ON /C .\\.ci\\run_with_env.cmd" matrix: # Pre-installed Python versions, which Appveyor may upgrade to @@ -57,22 +57,17 @@ install: # Update pip/setuptools/wheel to avoid an issue like # https://github.com/HearthSim/decrunch/issues/3 # e.g. https://ci.appveyor.com/project/inducer/relate/build/1.0.936 - # - "%CMD_IN_ENV% python -m pip install --upgrade pip setuptools wheel poetry" + - "%CMD_IN_ENV% python -m pip install --upgrade pip setuptools wheel" + + # Install poetry for packaging - "%CMD_IN_ENV% python -m pip install poetry" # Install requirements - "%CMD_IN_ENV% poetry install" - # - "%CMD_IN_ENV% pip install -r requirements.txt" - - -# before_test: -# - "%CMD_IN_ENV% poetry run pip install coverage factory_boy" - test_script: # Run the project tests - "%CMD_IN_ENV% poetry run coverage run manage.py test tests/" after_test: - # - "%CMD_IN_ENV% poetry run pip install codecov" - "%CMD_IN_ENV% poetry run codecov -X gcov" diff --git a/requirements.txt b/requirements.txt deleted file mode 100644 index 5a7ecbdb..00000000 --- a/requirements.txt +++ /dev/null @@ -1,118 +0,0 @@ -django>=3.0.7 - -# Automatically renders Django forms in a pretty, Bootstrap-compatible way. -django-crispy-forms>=1.5.1 - -# Page data, answer data, ... all represented in JSON. This makes that editable -# in the Django admin. -jsonfield>=1.4.0 - -# /!\ Upstream is dead, using branch for Django 3.0 support -git+https://github.com/bakatrouble/django-yamlfield.git@c92d0373d12a02d1e52fb09b44010f156111d7ea#egg=django-yamlfield - -# For easy content formatting: -markdown>=2.6.3,<3.0 - -# For rendering macros in content: -jinja2 - -# For math/symbolic questions -pymbolic -sympy - -# Django timezone support -pytz - -# Course content is stored in YAML. -pyyaml - -# dulwich -dulwich>=0.19 -ecdsa - -# FIXME: 2.7.1 gives bogus 'incorrect padding' error on PEM parsing -paramiko<2.7 - -# A date picker widget -# https://github.com/tutorcruncher/django-bootstrap3-datetimepicker -django-bootstrap3-datetimepicker-2 - -# For in-class instant messaging -dnspython -SleekXMPP - -# To manage web dependencies -django-npm - - -# For comfortable code entry -django-codemirror-widget>=0.5 - -# Optional, used for caching, requires 'libmemcached-dev' (Debian package name) -# pylibmc - -# For code isolation in code questions -docker-py - -# For code highlighting, required via the CodeHilite extension to -# Python-Markdown -pygments - -# For grade export -unicodecsv - -# To support network matching for facility recognition -ipaddress - -# {{{ For interoperation with SAML2/Shibboleth - -# 4.6.1 suffers from https://github.com/IdentityPython/pysaml2/pull/543 -# 4.6.5 causes a 403 on /saml2/acs upon sign in with djangosaml2 -# upper bounds just out of caution -pysaml2>=5.0.0,<6 -djangosaml2>=0.19.0,<0.20 -# Explicit dependency decls to work around broken dep declaration in pysaml2 4.6.0 -pyOpenSSL -future - -# Try to avoid https://github.com/Julian/jsonschema/issues/449 -attrs>=19 - -python-memcached - -# }}} - -# {{{ A task queue, used to execute long-running tasks -celery==4.2.1 -kombu==4.2.2-post1 -django-celery-results==1.0.1 - -# }}} - -# For searchable select widgets -# <8 just out of caution -django_select2>=7.4.2,<8 - -# To sanitize HTML generated by user code -# for https://github.com/mozilla/bleach/pull/346 -git+https://github.com/inducer/bleach@prevent-attribute-value-filtering#egg=bleach -#bleach>=2.0,<3 - -# Custom user migration created using -# https://bitbucket.org/spookylukey/django_custom_user_migration -# (but this package no longer needs to be installed) - -# For query lexing -pytools - -# For mypy (static type checking) support -typing>=3.6.1 - -# For unittest by mock (only required for Py2) -# mock - -# For rendering ipython notebook -nbconvert>=5.2.1 -IPython - -# vim: foldmethod=marker diff --git a/run-travis-ci.sh b/run-travis-ci.sh deleted file mode 100644 index 19afd447..00000000 --- a/run-travis-ci.sh +++ /dev/null @@ -1,25 +0,0 @@ -#! /bin/bash - -export RL_CI_TEST="$RL_TRAVIS_TEST" - -# before_script -# if [[ $RL_TRAVIS_TEST == flake8 ]]; then -# curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-flake8.sh -# fi - -# if [[ $RL_TRAVIS_TEST == mypy ]]; then -# curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-mypy.sh -# fi - -# run ci according to env variables -if [[ $RL_TRAVIS_TEST == test* ]]; then - . ./run-tests-for-ci.sh -elif [[ $RL_TRAVIS_TEST == cmdline ]]; then - . ./test-command-line-tool.sh $PY_EXE -elif [[ $RL_TRAVIS_TEST == mypy ]]; then - # . ./prepare-and-run-mypy.sh $PY_EXE mypy==0.641 - poetry run mypy relate course -elif [[ $RL_TRAVIS_TEST == flake8 ]]; then - poetry run flake8 relate course accounts tests - # . ./prepare-and-run-flake8.sh relate course accounts tests bin -fi -- GitLab From 26f14964ca822a4473637127538526f628d56143 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Wed, 10 Jun 2020 14:40:58 -0500 Subject: [PATCH 24/39] Fix double quotes causing actions to fail --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f90a6b82..0375dc85 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -70,7 +70,7 @@ jobs: with: fail_ci_if_error: true - name: Test command line tool - if: matrix.suite == "base" + if: matrix.suite == 'base' run: | git clone https://github.com/inducer/relate-sample poetry shell -- GitLab From e5e486b1929bce482bc5116de847098e909108f6 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Wed, 10 Jun 2020 14:44:13 -0500 Subject: [PATCH 25/39] Fix missing sudo and titling --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0375dc85..a389e14e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: pytest: - name: Pytest-${{ matrix.suite }} on Py${{ matrix.python-version }} + name: Python ${{ matrix.python-version }} - ${{ matrix.suite }} runs-on: ubuntu-latest strategy: matrix: @@ -59,7 +59,7 @@ jobs: env: DEBIAN_FRONTEND: noninteractive run: | - apt-get install gettext + sudo apt-get install gettext - name: Run test suite env: RL_CI_TEST: ${{ matrix.suite }} -- GitLab From 059d8ee5949df90beca9fbac58ca52a255126467 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Wed, 10 Jun 2020 15:07:20 -0500 Subject: [PATCH 26/39] Update gitlab ci for poetry --- .gitlab-ci.yml | 111 +++++++++++++++++++++++++++++-------------------- 1 file changed, 67 insertions(+), 44 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index aba8b41a..442a7133 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,60 +1,83 @@ -Python 3: - script: - - "PY_EXE=python3 bash ./run-tests-for-ci.sh" +variables: + PIP_CACHE_DIR: "${CI_PROJECT_DIR}/.cache/pip" + +cache: + key: "${CI_JOB_NAME}" + paths: + - .cache/pip + - .venv + +stages: + - lint + - tests + - docs + +.install-deps-template: &install-deps + before_script: + - pip install poetry + - poetry --version + - poetry config settings.virtualenvs.in-project true + - poetry install -vv + +.quality-template: &quality + <<: *install-deps + image: python:3.7 + stage: quality tags: - - python3 - - linux + - python3 except: - - tags - coverage: '/TOTAL.+ ([0-9]{1,3}%)/' - variables: - CODECOV_TOKEN: "895e3bf2-cfd0-45f8-9a14-4b7bd148f76d" + - tags -Python 3 Expensive: +.test-template: &test + <<: *install-deps script: - - "PY_EXE=python3 RL_CI_TEST=test_expensive bash ./run-tests-for-ci.sh" + - "bash ./.ci/run-tests-for-ci.sh" + stage: tests tags: - - python3 - - linux + - python3 + - linux except: - - tags - coverage: '/TOTAL.+ ([0-9]{1,3}%)/' + - tags + coverage: "/TOTAL.+ ([0-9]{1,3}%)/" variables: CODECOV_TOKEN: "895e3bf2-cfd0-45f8-9a14-4b7bd148f76d" +flake8: + <<: *quality + script: poetry run flake8 relate course accounts tests + +mypy: + <<: *quality + script: poetry run mypy relate course + +Python 3: + <<: *test + image: python:3.6 + +Python 3 Expensive: + <<: *test + image: python:3.6 + variables: + RL_CI_TEST: expensive + Python 3 CLI Tool: + <<: *test script: - - "PY_EXE=python3 bash ./test-command-line-tool.sh python3" - tags: - - python3 - - linux - except: - - tags + - git clone https://github.com/inducer/relate-sample + - poetry shell + - cd relate-sample + - relate validate . + - relate test-code questions/autograded-python-example.yml + - relate expand-yaml flows/quiz-test.yml > /dev/null Documentation: + <<: *install-deps + variables: + RELATE_LOCAL_TEST_SETTINGS: './local_settings_example.py' script: - - curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/build-docs.sh - - export RELATE_LOCAL_TEST_SETTINGS=`pwd`/local_settings_example.py - - ". ./build-docs.sh" + - curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/build-docs.sh + - poetry run ./build-docs.sh tags: - - python3 + - python3 only: - - master - -Mypy: - script: - - curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-mypy.sh - - ". ./prepare-and-run-mypy.sh python3 mypy" - tags: - - python3 - except: - - tags - -Flake8: - script: - - curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/prepare-and-run-flake8.sh - - ". ./prepare-and-run-flake8.sh relate course accounts tests bin" - tags: - - python3 - except: - - tags + - master -- GitLab From fd591a42ce6eba6238c9bca91d984f2b8c5ba1fa Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Wed, 10 Jun 2020 15:08:12 -0500 Subject: [PATCH 27/39] Update install documentation --- doc/misc.rst | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/doc/misc.rst b/doc/misc.rst index 44569039..fd7f663e 100644 --- a/doc/misc.rst +++ b/doc/misc.rst @@ -6,10 +6,10 @@ RELATE requires Python 3. Install [Node.js](https://nodejs.org) and NPM, or [Yarn](https://yarnpkg.com) (alternative package manager) at your option. -(Optional) Make a virtualenv to install to:: +Install [poetry](https://python-poetry.org) to manage dependencies and virtual +environments:: - virtualenv my-relate-env - source my-relate-env/bin/activate + pip install poetry To install, clone the repository:: @@ -19,14 +19,18 @@ Enter the relate directory:: cd relate -Install the dependencies:: +Install the dependencies. This should not be done in an existing virtual environment:: - pip install -r requirements.txt + poetry install + +Activate the virtual environment:: + + poetry shell Copy (and, optionally, edit) the example configuration:: cp local_settings_example.py local_settings.py - vi local_settings.py + $EDITOR local_settings.py Initialize the database:: -- GitLab From bb73e4a97c89cdc22729cbd9333645f6b6546543 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Wed, 10 Jun 2020 15:16:25 -0500 Subject: [PATCH 28/39] CI does not have a TTY, so `poetry shell` fails --- .github/workflows/ci.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a389e14e..5870cf61 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -73,11 +73,10 @@ jobs: if: matrix.suite == 'base' run: | git clone https://github.com/inducer/relate-sample - poetry shell cd relate-sample - relate validate . - relate test-code questions/autograded-python-example.yml - relate expand-yaml flows/quiz-test.yml > /dev/null + poetry run relate validate . + poetry run relate test-code questions/autograded-python-example.yml + poetry run relate expand-yaml flows/quiz-test.yml > /dev/null # vim: sw=2 -- GitLab From a227cd709727022451e8496e2a7c5588e465247e Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Fri, 12 Jun 2020 09:54:37 -0500 Subject: [PATCH 29/39] Postgres tests weren't run --- .ci/run-tests-for-ci.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.ci/run-tests-for-ci.sh b/.ci/run-tests-for-ci.sh index 617d7809..edb5b440 100644 --- a/.ci/run-tests-for-ci.sh +++ b/.ci/run-tests-for-ci.sh @@ -11,7 +11,7 @@ echo "-----------------------------------------------" echo "\nLocal Settings" -if [[ "$RL_CI_TEST" = "test_postgres" ]]; then +if [[ "$RL_CI_TEST" = "postgres" ]]; then echo "Preparing database" poetry run pip install psycopg2-binary export PGPASSWORD=relatepgpass -- GitLab From 39bfea20f2023c449919d3b37c3cc3e7db346eac Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Fri, 12 Jun 2020 10:15:01 -0500 Subject: [PATCH 30/39] Starts postgres service properly --- .github/workflows/ci.yml | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5870cf61..1ce96edd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,6 +35,19 @@ jobs: matrix: python-version: [3.6, 3.7, 3.8] suite: ['base', 'postgres', 'expensive'] + services: + postgres: + image: postgres + env: + POSTGRES_PASSWORD: relatepgpass + POSTGRES_DB: test_relate + options: >- + --health-cmd pg_isready + --health-interval 10s + --health-timeout 5s + --health-retries 5 + ports: + - 5432:5432 steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v1 -- GitLab From 3a78089b9a8db529f104b9c720a4e786515b0fd6 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Fri, 12 Jun 2020 10:33:36 -0500 Subject: [PATCH 31/39] Expensive tests now run Sets env variable so that expensive tests run properly --- .ci/run-tests-for-ci.sh | 50 +++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/.ci/run-tests-for-ci.sh b/.ci/run-tests-for-ci.sh index edb5b440..e49420ef 100644 --- a/.ci/run-tests-for-ci.sh +++ b/.ci/run-tests-for-ci.sh @@ -9,31 +9,11 @@ echo "Current directory: $(pwd)" echo "Python executable: ${PY_EXE}" echo "-----------------------------------------------" -echo "\nLocal Settings" - -if [[ "$RL_CI_TEST" = "postgres" ]]; then - echo "Preparing database" - poetry run pip install psycopg2-binary - export PGPASSWORD=relatepgpass - # psql -c 'create database relate;' -U postgres - echo "import psycopg2.extensions" >> local_settings_example.py - echo "DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.postgresql_psycopg2', - 'HOST': 'localhost', - 'USER': 'postgres', - 'PASSWORD': '${PGPASSWORD}', - 'NAME': 'test_relate', - 'OPTIONS': { - 'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE, - }, - }, - }" >> local_settings_example.py -fi +echo "Copy local settings" cp local_settings_example.py local_settings.py -echo "\ni18n" +echo "i18n" # Make sure i18n literals marked correctly poetry run python manage.py makemessages --no-location --ignore=req.txt > output.txt @@ -46,9 +26,11 @@ fi poetry run python manage.py compilemessages -echo "\nStarts testing" +echo "Starts testing" + if [[ "$RL_CI_TEST" = "expensive" ]]; then echo "Expensive tests" + export RL_CI_TEST="test_expensive" poetry run coverage run ./manage.py test tests.test_tasks \ tests.test_admin \ tests.test_pages.test_code \ @@ -73,6 +55,26 @@ if [[ "$RL_CI_TEST" = "expensive" ]]; then tests.test_receivers.UpdateCouresOrUserSignalTest elif [[ "$RL_CI_TEST" = "postgres" ]]; then + export PGPASSWORD=relatepgpass + + echo "Preparing database" + echo "import psycopg2.extensions" >> local_settings.py + echo "DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.postgresql_psycopg2', + 'HOST': 'localhost', + 'USER': 'postgres', + 'PASSWORD': '${PGPASSWORD}', + 'NAME': 'test_relate', + 'OPTIONS': { + 'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE, + }, + }, + }" >> local_settings.py + + poetry run pip install psycopg2-binary + # psql -c 'create database relate;' -U postgres + echo "Database tests" poetry run coverage run ./manage.py test tests.test_postgres else @@ -80,5 +82,5 @@ else poetry run coverage run ./manage.py test tests fi -echo "\nGenerate coverage report" +echo "Generate coverage report" poetry run coverage xml -- GitLab From 82edceea08dc5a22d7d2a3df7aa4ea3f18b716e1 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Fri, 12 Jun 2020 10:51:47 -0500 Subject: [PATCH 32/39] Postgres tests now read settings file Tests read settings from the example file, so they are picked up correctly now --- .ci/run-tests-for-ci.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.ci/run-tests-for-ci.sh b/.ci/run-tests-for-ci.sh index e49420ef..6c78dfbc 100644 --- a/.ci/run-tests-for-ci.sh +++ b/.ci/run-tests-for-ci.sh @@ -11,7 +11,7 @@ echo "-----------------------------------------------" echo "Copy local settings" -cp local_settings_example.py local_settings.py +# cp local_settings_example.py local_settings.py echo "i18n" # Make sure i18n literals marked correctly @@ -58,7 +58,7 @@ elif [[ "$RL_CI_TEST" = "postgres" ]]; then export PGPASSWORD=relatepgpass echo "Preparing database" - echo "import psycopg2.extensions" >> local_settings.py + echo "import psycopg2.extensions" >> local_settings_example.py echo "DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql_psycopg2', @@ -70,7 +70,7 @@ elif [[ "$RL_CI_TEST" = "postgres" ]]; then 'isolation_level': psycopg2.extensions.ISOLATION_LEVEL_SERIALIZABLE, }, }, - }" >> local_settings.py + }" >> local_settings_example.py poetry run pip install psycopg2-binary # psql -c 'create database relate;' -U postgres -- GitLab From d456cb8f854dca8a40627dd07c5d7bd644960795 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Fri, 12 Jun 2020 10:58:34 -0500 Subject: [PATCH 33/39] Fix for i18n settings file --- .ci/run-tests-for-ci.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.ci/run-tests-for-ci.sh b/.ci/run-tests-for-ci.sh index 6c78dfbc..18bfb9e7 100644 --- a/.ci/run-tests-for-ci.sh +++ b/.ci/run-tests-for-ci.sh @@ -11,9 +11,12 @@ echo "-----------------------------------------------" echo "Copy local settings" -# cp local_settings_example.py local_settings.py echo "i18n" +# Testing i18n needs a local_settings file even though the rest of the tests +# don't use it +cp local_settings_example.py local_settings.py + # Make sure i18n literals marked correctly poetry run python manage.py makemessages --no-location --ignore=req.txt > output.txt -- GitLab From 36f38633fd128c6c25333627c3399e4a82d03473 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner Date: Sat, 13 Jun 2020 14:31:54 -0500 Subject: [PATCH 34/39] Add djangosaml2 fix (Closes #711) --- requirements.txt | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/requirements.txt b/requirements.txt index 5a7ecbdb..2bc3c113 100644 --- a/requirements.txt +++ b/requirements.txt @@ -66,14 +66,11 @@ ipaddress # {{{ For interoperation with SAML2/Shibboleth -# 4.6.1 suffers from https://github.com/IdentityPython/pysaml2/pull/543 -# 4.6.5 causes a 403 on /saml2/acs upon sign in with djangosaml2 # upper bounds just out of caution pysaml2>=5.0.0,<6 -djangosaml2>=0.19.0,<0.20 -# Explicit dependency decls to work around broken dep declaration in pysaml2 4.6.0 -pyOpenSSL -future + +# 0.19.0 + https://github.com/knaperek/djangosaml2/pull/197 +git+https://github.com/knaperek/djangosaml2.git@d9359816c76dad9092f6580cf88845fcc39a711f#egg=djangosaml2 # Try to avoid https://github.com/Julian/jsonschema/issues/449 attrs>=19 -- GitLab From e272f23e66c77299710dca3fcff8415e362ddb79 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 15 Jun 2020 10:19:03 -0500 Subject: [PATCH 35/39] Bump version of djangosaml2 --- poetry.lock | 87 +++++++++++++++++++++++++------------------------- pyproject.toml | 2 +- 2 files changed, 45 insertions(+), 44 deletions(-) diff --git a/poetry.lock b/poetry.lock index eb65529f..57ec465d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -66,7 +66,7 @@ description = "Specifications for callback functions passed in to an API" name = "backcall" optional = false python-versions = "*" -version = "0.1.0" +version = "0.2.0" [[package]] category = "main" @@ -180,7 +180,7 @@ description = "Hosted coverage reports for GitHub, Bitbucket and Gitlab" name = "codecov" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.1.4" +version = "2.1.7" [package.dependencies] coverage = "*" @@ -358,6 +358,10 @@ Django = ">=2.2" defusedxml = ">=0.4.1" pysaml2 = ">=5.0.0" +[package.source] +reference = "dcabea21c3ebf0f7b31db361d960acded16e20b8" +type = "git" +url = "https://github.com/knaperek/djangosaml2.git" [[package]] category = "main" description = "DNS toolkit" @@ -722,7 +726,7 @@ description = "More routines for operating on iterables, beyond itertools" name = "more-itertools" optional = false python-versions = ">=3.5" -version = "8.3.0" +version = "8.4.0" [[package]] category = "main" @@ -790,7 +794,7 @@ description = "The Jupyter Notebook format" name = "nbformat" optional = false python-versions = ">=3.5" -version = "5.0.6" +version = "5.0.7" [package.dependencies] ipython-genutils = "*" @@ -799,7 +803,7 @@ jupyter-core = "*" traitlets = ">=4.1" [package.extras] -test = ["testpath", "pytest", "pytest-cov"] +test = ["pytest", "pytest-cov", "testpath"] [[package]] category = "main" @@ -908,8 +912,8 @@ 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" +python-versions = ">=3.6" +version = "3.0.3" [package.dependencies] wcwidth = "*" @@ -929,7 +933,7 @@ description = "library with cross-python path, ini-parsing, io, code, log facili name = "py" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.8.1" +version = "1.8.2" [[package]] category = "dev" @@ -1033,7 +1037,7 @@ description = "Python implementation of SAML Version 2 Standard" name = "pysaml2" optional = false python-versions = "*" -version = "5.0.0" +version = "5.1.0" [package.dependencies] cryptography = ">=1.4" @@ -1124,7 +1128,7 @@ marker = "sys_platform == \"win32\"" name = "pywin32" optional = false python-versions = "*" -version = "227" +version = "228" [[package]] category = "main" @@ -1316,8 +1320,8 @@ docs = ["sphinx", "jaraco.packaging (>=3.2)", "rst.linker (>=1.9)"] testing = ["jaraco.itertools", "func-timeout"] [metadata] -content-hash = "f4b441ffe2f7c085aa47c134e478a08ece020c04fffaeb2e228f79b706de5157" -python-versions = "^3.7" +content-hash = "d553b7af1037e9714cc0217bc00432e3f96fbcd4fb6a78db7d9c3622f03e58ee" +python-versions = "^3.6" [metadata.files] amqp = [ @@ -1345,8 +1349,8 @@ attrs = [ {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"}, + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, ] bcrypt = [ {file = "bcrypt-3.1.7-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:d7bdc26475679dd073ba0ed2766445bb5b20ca4793ca0db32b399dccc6bc84b7"}, @@ -1415,9 +1419,9 @@ chardet = [ {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, ] codecov = [ - {file = "codecov-2.1.4-py2.py3-none-any.whl", hash = "sha256:7378c4bec1809dde64031bf7d76c95266b0e6d60cfcd1d6a16ce96bfb6360ac3"}, - {file = "codecov-2.1.4-py3.8.egg", hash = "sha256:24c24a7c8d1231b83729c7a2a33655ce472a3ba05e0111d52701e3e3075657c9"}, - {file = "codecov-2.1.4.tar.gz", hash = "sha256:bf30a41f65e747b159e2a749d1f9c92042d358bba0905fd94d3def3a368e592c"}, + {file = "codecov-2.1.7-py2.py3-none-any.whl", hash = "sha256:b67bb8029e8340a7bf22c71cbece5bd18c96261fdebc2f105ee4d5a005bc8728"}, + {file = "codecov-2.1.7-py3.8.egg", hash = "sha256:d8b8109f44edad03b24f5f189dac8de9b1e3dc3c791fa37eeaf8c7381503ec34"}, + {file = "codecov-2.1.7.tar.gz", hash = "sha256:491938ad774ea94a963d5d16354c7299e90422a33a353ba0d38d0943ed1d5091"}, ] colorama = [ {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, @@ -1515,10 +1519,7 @@ django-select2 = [ {file = "django_select2-7.4.2-py2.py3-none-any.whl", hash = "sha256:06531d563ce33c3133682ae2bb9e6d762103a863d0054ffef51bae8b4cfcca6c"}, ] django-yamlfield = [] -djangosaml2 = [ - {file = "djangosaml2-0.19.0-py2.py3-none-any.whl", hash = "sha256:fa45289c631047d5fe585ffd8ac0a5335196f157475eb4307198e0089abb775e"}, - {file = "djangosaml2-0.19.0.tar.gz", hash = "sha256:f1df4b5b9d92c272fe07c6923d625908fa077df40afa7f2a18a89748e6bf60fc"}, -] +djangosaml2 = [] dnspython = [ {file = "dnspython-1.16.0-py2.py3-none-any.whl", hash = "sha256:f69c21288a962f4da86e56c4905b49d11aba7938d3d740e80d9e366ee4f1632d"}, {file = "dnspython-1.16.0.zip", hash = "sha256:36c5e8e38d4369a08b6780b7f27d790a292b2b08eea01607865bf0936c558e01"}, @@ -1663,8 +1664,8 @@ mistune = [ {file = "mistune-0.8.4.tar.gz", hash = "sha256:59a3429db53c50b5c6bcc8a07f8848cb00d7dc8bdb431a4ab41920d201d4756e"}, ] more-itertools = [ - {file = "more-itertools-8.3.0.tar.gz", hash = "sha256:558bb897a2232f5e4f8e2399089e35aecb746e1f9191b6584a151647e89267be"}, - {file = "more_itertools-8.3.0-py3-none-any.whl", hash = "sha256:7818f596b1e87be009031c7653d01acc46ed422e6656b394b0f765ce66ed4982"}, + {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, + {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, ] mpmath = [ {file = "mpmath-1.1.0.tar.gz", hash = "sha256:fc17abe05fbab3382b61a123c398508183406fa132e0223874578e20946499f6"}, @@ -1694,8 +1695,8 @@ nbconvert = [ {file = "nbconvert-5.6.1.tar.gz", hash = "sha256:21fb48e700b43e82ba0e3142421a659d7739b65568cc832a13976a77be16b523"}, ] nbformat = [ - {file = "nbformat-5.0.6-py3-none-any.whl", hash = "sha256:276343c78a9660ab2a63c28cc33da5f7c58c092b3f3a40b6017ae2ce6689320d"}, - {file = "nbformat-5.0.6.tar.gz", hash = "sha256:049af048ed76b95c3c44043620c17e56bc001329e07f83fec4f177f0e3d7b757"}, + {file = "nbformat-5.0.7-py3-none-any.whl", hash = "sha256:ea55c9b817855e2dfcd3f66d74857342612a60b1f09653440f4a5845e6e3523f"}, + {file = "nbformat-5.0.7.tar.gz", hash = "sha256:54d4d6354835a936bad7e8182dcd003ca3dc0cedfee5a306090e04854343b340"}, ] numpy = [ {file = "numpy-1.18.5-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:e91d31b34fc7c2c8f756b4e902f901f856ae53a93399368d9a0dc7be17ed2ca0"}, @@ -1752,16 +1753,16 @@ pluggy = [ {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"}, + {file = "prompt_toolkit-3.0.3-py3-none-any.whl", hash = "sha256:c93e53af97f630f12f5f62a3274e79527936ed466f038953dfa379d4941f651a"}, + {file = "prompt_toolkit-3.0.3.tar.gz", hash = "sha256:a402e9bf468b63314e37460b68ba68243d55b2f8c4d0192f85a019af3945050e"}, ] ptyprocess = [ {file = "ptyprocess-0.6.0-py2.py3-none-any.whl", hash = "sha256:d7cc528d76e76342423ca640335bd3633420dc1366f258cb31d05e865ef5ca1f"}, {file = "ptyprocess-0.6.0.tar.gz", hash = "sha256:923f299cc5ad920c68f2bc0bc98b75b9f838b93b599941a6b63ddbc2476394c0"}, ] py = [ - {file = "py-1.8.1-py2.py3-none-any.whl", hash = "sha256:c20fdd83a5dbc0af9efd622bee9a5564e278f6380fffcacc43ba6f43db2813b0"}, - {file = "py-1.8.1.tar.gz", hash = "sha256:5e27081401262157467ad6e7f851b7aa402c5852dbcb3dae06768434de5752aa"}, + {file = "py-1.8.2-py2.py3-none-any.whl", hash = "sha256:a673fa23d7000440cc885c17dbd34fafcb7d7a6e230b29f6766400de36a33c44"}, + {file = "py-1.8.2.tar.gz", hash = "sha256:f3b3a4c36512a4c4f024041ab51866f11761cc169670204b235f6b20523d4e6b"}, ] pycodestyle = [ {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, @@ -1812,8 +1813,8 @@ pyrsistent = [ {file = "pyrsistent-0.16.0.tar.gz", hash = "sha256:28669905fe725965daa16184933676547c5bb40a5153055a8dee2a4bd7933ad3"}, ] pysaml2 = [ - {file = "pysaml2-5.0.0-py2.py3-none-any.whl", hash = "sha256:1800ef0ab3f5b3c1d18742dd8cc7afa6dd9760fc5a515fd37543003ff5ca9947"}, - {file = "pysaml2-5.0.0.tar.gz", hash = "sha256:deea75b252b5ead821f12ce01e9d88b0f6fbcde322c1595dcbb06f9660af0cc1"}, + {file = "pysaml2-5.1.0-py2.py3-none-any.whl", hash = "sha256:80eddb2dd5fcb51b15b918a5db95a19472814f00195dbe351084687bd4341972"}, + {file = "pysaml2-5.1.0.tar.gz", hash = "sha256:cfba5d15f175edd23e6b17f428a54f509b16c1e9e7772e8f024ddd35fc90df15"}, ] pytest = [ {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, @@ -1835,18 +1836,18 @@ pytz = [ {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, ] pywin32 = [ - {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, - {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, - {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, - {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"}, - {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"}, - {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"}, - {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"}, - {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"}, - {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"}, - {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"}, - {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, - {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, + {file = "pywin32-228-cp27-cp27m-win32.whl", hash = "sha256:37dc9935f6a383cc744315ae0c2882ba1768d9b06700a70f35dc1ce73cd4ba9c"}, + {file = "pywin32-228-cp27-cp27m-win_amd64.whl", hash = "sha256:11cb6610efc2f078c9e6d8f5d0f957620c333f4b23466931a247fb945ed35e89"}, + {file = "pywin32-228-cp35-cp35m-win32.whl", hash = "sha256:1f45db18af5d36195447b2cffacd182fe2d296849ba0aecdab24d3852fbf3f80"}, + {file = "pywin32-228-cp35-cp35m-win_amd64.whl", hash = "sha256:6e38c44097a834a4707c1b63efa9c2435f5a42afabff634a17f563bc478dfcc8"}, + {file = "pywin32-228-cp36-cp36m-win32.whl", hash = "sha256:ec16d44b49b5f34e99eb97cf270806fdc560dff6f84d281eb2fcb89a014a56a9"}, + {file = "pywin32-228-cp36-cp36m-win_amd64.whl", hash = "sha256:a60d795c6590a5b6baeacd16c583d91cce8038f959bd80c53bd9a68f40130f2d"}, + {file = "pywin32-228-cp37-cp37m-win32.whl", hash = "sha256:af40887b6fc200eafe4d7742c48417529a8702dcc1a60bf89eee152d1d11209f"}, + {file = "pywin32-228-cp37-cp37m-win_amd64.whl", hash = "sha256:00eaf43dbd05ba6a9b0080c77e161e0b7a601f9a3f660727a952e40140537de7"}, + {file = "pywin32-228-cp38-cp38-win32.whl", hash = "sha256:fa6ba028909cfc64ce9e24bcf22f588b14871980d9787f1e2002c99af8f1850c"}, + {file = "pywin32-228-cp38-cp38-win_amd64.whl", hash = "sha256:9b3466083f8271e1a5eb0329f4e0d61925d46b40b195a33413e0905dccb285e8"}, + {file = "pywin32-228-cp39-cp39-win32.whl", hash = "sha256:ed74b72d8059a6606f64842e7917aeee99159ebd6b8d6261c518d002837be298"}, + {file = "pywin32-228-cp39-cp39-win_amd64.whl", hash = "sha256:8319bafdcd90b7202c50d6014efdfe4fde9311b3ff15fd6f893a45c0868de203"}, ] pyyaml = [ {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, diff --git a/pyproject.toml b/pyproject.toml index 25a39f7b..9acf6174 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -68,7 +68,7 @@ ipaddress = "^1.0.23" # 4.6.5 causes a 403 on /saml2/acs upon sign in with djangosaml2 # upper bounds just out of caution pysaml2 = ">=5.0.0,<6" -djangosaml2 = ">=0.19.0,<0.20" +djangosaml2 = {git = "https://github.com/knaperek/djangosaml2.git", rev = "v0.19.1"} # Explicit dependency decls to work around broken dep declaration in pysaml2 4.6.0 pyOpenSSL = "^19.1.0" future = "^0.18.2" -- GitLab From c8351ffe6d33bf3e5951cdc5a86a17a87dde2157 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 15 Jun 2020 18:44:21 +0200 Subject: [PATCH 36/39] Fix malformed yaml in CI config --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 442a7133..bd0a7df7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -22,7 +22,7 @@ stages: .quality-template: &quality <<: *install-deps image: python:3.7 - stage: quality + stage: lint tags: - python3 except: @@ -72,6 +72,7 @@ Python 3 CLI Tool: Documentation: <<: *install-deps + stage: docs variables: RELATE_LOCAL_TEST_SETTINGS: './local_settings_example.py' script: -- GitLab From f0fd5df0edb0a6d2f686f8a18796dc1a4e631025 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 15 Jun 2020 18:48:48 +0200 Subject: [PATCH 37/39] Add local bin dir to $PATH --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index bd0a7df7..6e1cb3f7 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -14,7 +14,8 @@ stages: .install-deps-template: &install-deps before_script: - - pip install poetry + - export PATH="/var/lib/gitlab-runner/.local/bin:$PATH" + - pip3 install poetry - poetry --version - poetry config settings.virtualenvs.in-project true - poetry install -vv -- GitLab From 4ea512c8ae49fcb76d6c52301dd5f325d0c843aa Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 15 Jun 2020 18:53:58 +0200 Subject: [PATCH 38/39] Fix poetry config and python interpreter --- .gitlab-ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 6e1cb3f7..2195c7e8 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -17,7 +17,7 @@ stages: - export PATH="/var/lib/gitlab-runner/.local/bin:$PATH" - pip3 install poetry - poetry --version - - poetry config settings.virtualenvs.in-project true + - poetry config virtualenvs.in-project true - poetry install -vv .quality-template: &quality @@ -78,6 +78,7 @@ Documentation: RELATE_LOCAL_TEST_SETTINGS: './local_settings_example.py' script: - curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/master/build-docs.sh + - export PY_EXE="$(poetry run which python)" - poetry run ./build-docs.sh tags: - python3 -- GitLab From 46cc6170915d12894943f944fac27395bb67fb08 Mon Sep 17 00:00:00 2001 From: Josh Asplund Date: Mon, 15 Jun 2020 19:37:12 +0200 Subject: [PATCH 39/39] Drop use of poetry shell --- .gitlab-ci.yml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 2195c7e8..d849fa36 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -65,11 +65,10 @@ Python 3 CLI Tool: <<: *test script: - git clone https://github.com/inducer/relate-sample - - poetry shell - cd relate-sample - - relate validate . - - relate test-code questions/autograded-python-example.yml - - relate expand-yaml flows/quiz-test.yml > /dev/null + - poetry run relate validate . + - poetry run relate test-code questions/autograded-python-example.yml + - poetry run relate expand-yaml flows/quiz-test.yml > /dev/null Documentation: <<: *install-deps -- GitLab