From 54c059de767ae6fe6cfc29fe7b4f3266cc989584 Mon Sep 17 00:00:00 2001 From: Javed Gouri Date: Fri, 12 Feb 2021 02:39:38 +0530 Subject: [PATCH 1/6] added long pooling support for sqs broker --- django_q/brokers/aws_sqs.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/django_q/brokers/aws_sqs.py b/django_q/brokers/aws_sqs.py index 4004af41..07c7b701 100644 --- a/django_q/brokers/aws_sqs.py +++ b/django_q/brokers/aws_sqs.py @@ -4,7 +4,6 @@ from django_q.brokers import Broker from django_q.conf import Conf - QUEUE_DOES_NOT_EXIST = "AWS.SimpleQueueService.NonExistentQueue" @@ -27,9 +26,18 @@ def dequeue(self): # sqs supports max 10 messages in bulk if Conf.BULK > 10: Conf.BULK = 10 - tasks = self.queue.receive_messages( - MaxNumberOfMessages=Conf.BULK, VisibilityTimeout=Conf.RETRY - ) + + params = {'MaxNumberOfMessages': Conf.BULK, 'VisibilityTimeout': Conf.RETRY} + + # sqs long pooling + sqs_config = Conf.SQS + if 'sqs_receive_message_wait_time_seconds' in sqs_config: + wait_time_second = sqs_config.get('sqs_receive_message_wait_time_seconds', 20) + if not isinstance(wait_time_second, int): + raise ValueError('sqs_receive_message_wait_time_seconds should be int') + params.update({'WaitTimeSeconds': wait_time_second}) + + tasks = self.queue.receive_messages(**params) if tasks: return [(t.receipt_handle, t.body) for t in tasks] @@ -67,6 +75,7 @@ def get_connection(list_key: str = Conf.PREFIX) -> Session: if "aws_region" in config: config["region_name"] = config["aws_region"] del config["aws_region"] + return Session(**config) def get_queue(self): From c7602130651b2391987be4885feaaa9f4900088f Mon Sep 17 00:00:00 2001 From: Javed Gouri Date: Fri, 12 Feb 2021 02:46:22 +0530 Subject: [PATCH 2/6] changed the parameter name --- django_q/brokers/aws_sqs.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/django_q/brokers/aws_sqs.py b/django_q/brokers/aws_sqs.py index 07c7b701..0df0b312 100644 --- a/django_q/brokers/aws_sqs.py +++ b/django_q/brokers/aws_sqs.py @@ -31,10 +31,10 @@ def dequeue(self): # sqs long pooling sqs_config = Conf.SQS - if 'sqs_receive_message_wait_time_seconds' in sqs_config: - wait_time_second = sqs_config.get('sqs_receive_message_wait_time_seconds', 20) + if 'receive_message_wait_time_seconds' in sqs_config: + wait_time_second = sqs_config.get('receive_message_wait_time_seconds', 20) if not isinstance(wait_time_second, int): - raise ValueError('sqs_receive_message_wait_time_seconds should be int') + raise ValueError('receive_message_wait_time_seconds should be int') params.update({'WaitTimeSeconds': wait_time_second}) tasks = self.queue.receive_messages(**params) From db3b65babf7e8a83ef423dab661fafd9cb6fd364 Mon Sep 17 00:00:00 2001 From: Javed Gouri Date: Fri, 12 Feb 2021 13:03:57 +0530 Subject: [PATCH 3/6] added long polling support , introduce new parameter in broker sqs block parameter for long polling is receive_message_wait_time_seconds eg : Q_CLUSTER = { 'name': 'test-queue', 'sqs': { 'aws_region': AWS_S3_REGION_NAME, 'aws_access_key_id': AWS_ACCESS_KEY_ID, 'aws_secret_access_key': AWS_SECRET_ACCESS_KEY, 'receive_message_wait_time_seconds':20 } } --- django_q/brokers/aws_sqs.py | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/django_q/brokers/aws_sqs.py b/django_q/brokers/aws_sqs.py index 0df0b312..256813b5 100644 --- a/django_q/brokers/aws_sqs.py +++ b/django_q/brokers/aws_sqs.py @@ -27,15 +27,19 @@ def dequeue(self): if Conf.BULK > 10: Conf.BULK = 10 - params = {'MaxNumberOfMessages': Conf.BULK, 'VisibilityTimeout': Conf.RETRY} + params = {"MaxNumberOfMessages": Conf.BULK, "VisibilityTimeout": Conf.RETRY} - # sqs long pooling + # sqs long polling sqs_config = Conf.SQS - if 'receive_message_wait_time_seconds' in sqs_config: - wait_time_second = sqs_config.get('receive_message_wait_time_seconds', 20) + if "receive_message_wait_time_seconds" in sqs_config: + wait_time_second = sqs_config.get("receive_message_wait_time_seconds", 20) + + # validation of parameter if not isinstance(wait_time_second, int): - raise ValueError('receive_message_wait_time_seconds should be int') - params.update({'WaitTimeSeconds': wait_time_second}) + raise ValueError("receive_message_wait_time_seconds should be int") + if wait_time_second > 20: + raise ValueError("receive_message_wait_time_seconds is invalid. Reason: Must be >= 0 and <= 20") + params.update({"WaitTimeSeconds": wait_time_second}) tasks = self.queue.receive_messages(**params) if tasks: @@ -76,6 +80,9 @@ def get_connection(list_key: str = Conf.PREFIX) -> Session: config["region_name"] = config["aws_region"] del config["aws_region"] + if 'receive_message_wait_time_seconds' in config: + del config["receive_message_wait_time_seconds"] + return Session(**config) def get_queue(self): From 5e61244256a9c6966567b2fe96c9f22a257e61ff Mon Sep 17 00:00:00 2001 From: Javed Gouri Date: Fri, 26 Feb 2021 19:21:45 +0530 Subject: [PATCH 4/6] added receive_message_wait_time_seconds parameter in test_broker.py --- django_q/tests/test_brokers.py | 1 + 1 file changed, 1 insertion(+) diff --git a/django_q/tests/test_brokers.py b/django_q/tests/test_brokers.py index 064ecf19..ee9bd8ad 100644 --- a/django_q/tests/test_brokers.py +++ b/django_q/tests/test_brokers.py @@ -194,6 +194,7 @@ def canceled_sqs(monkeypatch): "aws_region": os.getenv("AWS_REGION"), "aws_access_key_id": os.getenv("AWS_ACCESS_KEY_ID"), "aws_secret_access_key": os.getenv("AWS_SECRET_ACCESS_KEY"), + "receive_message_wait_time_seconds": 20 }, ) # check broker From ad39ca813fe2ce7e91cac4c6eed5d4c28663c0fb Mon Sep 17 00:00:00 2001 From: javedgouri Date: Tue, 14 Sep 2021 01:15:20 +0530 Subject: [PATCH 5/6] changes --- .github/workflows/codeql-analysis.yml | 71 + .github/workflows/test.yml | 60 + .gitignore | 2 + .readthedocs.yml | 2 +- .travis.yml | 49 - CHANGELOG.md | 100 +- Dockerfile.dev | 40 + LICENSE | 2 +- MANIFEST.in | 9 - README.rst | 18 +- django_q/__init__.py | 6 +- django_q/admin.py | 11 +- django_q/apps.py | 1 + django_q/brokers/__init__.py | 2 +- django_q/brokers/aws_sqs.py | 8 +- django_q/brokers/disque.py | 3 +- django_q/brokers/mongo.py | 4 +- django_q/cluster.py | 129 +- django_q/conf.py | 14 +- django_q/core_signing.py | 13 +- django_q/humanhash.py | 311 +- django_q/management/commands/qcluster.py | 10 +- django_q/management/commands/qinfo.py | 2 +- django_q/management/commands/qmemory.py | 31 + django_q/migrations/0001_initial.py | 4 +- .../migrations/0002_auto_20150630_1624.py | 2 +- .../migrations/0003_auto_20150708_1326.py | 2 +- .../migrations/0004_auto_20150710_1043.py | 2 +- .../migrations/0005_auto_20150718_1506.py | 2 +- .../migrations/0006_auto_20150805_1817.py | 2 +- django_q/migrations/0007_ormq.py | 2 +- .../migrations/0010_auto_20200610_0856.py | 2 +- .../migrations/0012_auto_20200702_1608.py | 1 + django_q/migrations/0014_schedule_cluster.py | 18 + django_q/models.py | 1 + django_q/monitor.py | 210 +- django_q/queues.py | 14 +- django_q/signals.py | 6 +- django_q/status.py | 4 +- django_q/tasks.py | 12 +- django_q/tests/settings.py | 95 +- django_q/tests/test_admin.py | 82 +- django_q/tests/test_brokers.py | 18 +- django_q/tests/test_cached.py | 110 +- django_q/tests/test_cluster.py | 488 ++- django_q/tests/test_commands.py | 16 +- django_q/tests/test_monitor.py | 19 +- django_q/tests/test_scheduler.py | 343 +- django_q/tests/testing_utilities/__init__.py | 0 .../multiple_database_routers.py | 38 + django_q/tests/urls.py | 4 +- docs/conf.py | 8 +- docs/configure.rst | 14 +- docs/examples.rst | 80 + docs/index.rst | 3 +- docs/install.rst | 4 +- docs/schedules.rst | 19 +- docs/signals.rst | 21 +- poetry.lock | 1322 +++++-- pyproject.toml | 85 +- requirements.in | 11 - requirements.txt | 74 +- runtests.py | 3447 ----------------- setup.cfg | 2 - setup.py | 69 - 65 files changed, 3018 insertions(+), 4536 deletions(-) create mode 100644 .github/workflows/codeql-analysis.yml create mode 100644 .github/workflows/test.yml delete mode 100644 .travis.yml create mode 100644 Dockerfile.dev delete mode 100644 MANIFEST.in create mode 100644 django_q/management/commands/qmemory.py create mode 100644 django_q/migrations/0014_schedule_cluster.py create mode 100644 django_q/tests/testing_utilities/__init__.py create mode 100644 django_q/tests/testing_utilities/multiple_database_routers.py delete mode 100644 requirements.in delete mode 100644 runtests.py delete mode 100644 setup.cfg delete mode 100644 setup.py diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 00000000..7647c76b --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,71 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ master ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ master ] + schedule: + - cron: '32 0 * * 5' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ 'python' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # ℹī¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..8384aae9 --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,60 @@ +name: tests +on: [ push, pull_request ] +jobs: + build: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [ 3.7, 3.8, 3.9 ] + django: [ "2.2", "3.2" ] + services: + disque: + image: efrecon/disque:1.0-rc1 + ports: + - '7711:7711/tcp' + mongodb: + image: mongo + ports: + - 27017:27017 + postgres: + image: postgres + env: + POSTGRES_USER: postgres + POSTGRES_PASSWORD: postgres + POSTGRES_DB: postgres + ports: + - 5432:5432 + # needed because the postgres container does not provide a health check + options: --health-cmd pg_isready --health-interval 10s --health-timeout 5s --health-retries 5 + redis: + image: redis + ports: + - 6379:6379 + options: --entrypoint redis-server + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies with Django ${{ matrix.django }} + run: | + python -m pip install --upgrade pip + pip install poetry + poetry add "django==${{ matrix.django }}" + poetry install -E testing + - name: Run Tests + run: | + poetry run pytest --cov=./django_q --cov-report=xml + - name: Upload coverage + uses: codecov/codecov-action@v1 + env: + PYTHON: ${{ matrix.python-version }} + DJANGO: ${{ matrix.django }} + with: + token: ${{ secrets.CODECOV_TOKEN }} + env_vars: PYTHON, DJANGO + fail_ci_if_error: true + - name: Build docs + run: | + poetry run sphinx-build -b html -d docs/_build/doctrees -nW docs docs/_build/html diff --git a/.gitignore b/.gitignore index d540666f..1077fc36 100644 --- a/.gitignore +++ b/.gitignore @@ -70,3 +70,5 @@ djq node_modules /c.cache/ /dq +/venv/ +.local \ No newline at end of file diff --git a/.readthedocs.yml b/.readthedocs.yml index 9b172987..19082735 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -2,5 +2,5 @@ build: image: latest python: - version: 3.6 + version: 3.8 setup_py_install: true \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 1f8988bd..00000000 --- a/.travis.yml +++ /dev/null @@ -1,49 +0,0 @@ -language: python - -services: - - redis - - mongodb - -python: - - "3.7" - - "3.8" - -env: - - DJANGO=3.1.2 - - DJANGO=2.2.16 - -sudo: true -dist: xenial - -addons: - apt: - packages: - - tcl8.5 - -before_script: - - git clone https://github.com/antirez/disque.git disque_server - - "cd disque_server/src && make && PREFIX=../ make install && cd -" - - "./disque_server/bin/disque-server &" - - ./disque_server/bin/disque PING - -install: - - pip install -q django==$DJANGO - - pip install -r requirements.txt - - pip install pytest --upgrade - - pip install pytest-django codecov sphinx poetry - - poetry install - -script: - - coverage run --source=django_q -m py.test - - sphinx-build -b html -d docs/_build/doctrees -nW docs docs/_build/html - -after_success: - - codecov - -notifications: - webhooks: - urls: - - https://webhooks.gitter.im/e/cbcff78c4be241602332 - on_success: change - on_failure: always - on_start: never diff --git a/CHANGELOG.md b/CHANGELOG.md index 2542888a..72045557 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,103 @@ # Changelog +## [Unreleased](https://github.com/koed00/django-q/tree/HEAD) + +[Full Changelog](https://github.com/koed00/django-q/compare/v1.3.9...HEAD) + +**Closed issues:** + +- Upgrade to 1.3.6 stops the cluster from working [\#565](https://github.com/Koed00/django-q/issues/565) +- Feature request: override retry for individual tasks [\#551](https://github.com/Koed00/django-q/issues/551) + +**Merged pull requests:** + +- Post execute signal and tests [\#580](https://github.com/Koed00/django-q/pull/580) ([Koed00](https://github.com/Koed00)) + +## [v1.3.9](https://github.com/koed00/django-q/tree/v1.3.9) (2021-06-10) + +[Full Changelog](https://github.com/koed00/django-q/compare/v1.3.8...v1.3.9) + +**Closed issues:** + +- Version 1.3.7 rolled back Arrow to old 0.15.6 [\#571](https://github.com/Koed00/django-q/issues/571) +- Migration XYZ dependencies reference nonexistent parent node \('django\_q', '0014\_auto\_20210502\_1221'\) [\#570](https://github.com/Koed00/django-q/issues/570) + +**Merged pull requests:** + +- Autofield [\#574](https://github.com/Koed00/django-q/pull/574) ([Koed00](https://github.com/Koed00)) +- Fix RemovedInDjango41Warning [\#572](https://github.com/Koed00/django-q/pull/572) ([nurettin](https://github.com/nurettin)) + +## [v1.3.8](https://github.com/koed00/django-q/tree/v1.3.8) (2021-06-08) + +[Full Changelog](https://github.com/koed00/django-q/compare/v1.3.7...v1.3.8) + +## [v1.3.7](https://github.com/koed00/django-q/tree/v1.3.7) (2021-06-03) + +[Full Changelog](https://github.com/koed00/django-q/compare/v1.3.6...v1.3.7) + +**Closed issues:** + +- Q configured to use redis but keeps a continuous connection to db [\#559](https://github.com/Koed00/django-q/issues/559) +- \[Error\] select\_for\_update happening when using replica\(read-only\) and default\(write-only\) DB. [\#558](https://github.com/Koed00/django-q/issues/558) + +**Merged pull requests:** + +- Build improvements [\#569](https://github.com/Koed00/django-q/pull/569) ([Koed00](https://github.com/Koed00)) +- Create codeql-analysis.yml [\#564](https://github.com/Koed00/django-q/pull/564) ([Koed00](https://github.com/Koed00)) +- Fix docs error [\#563](https://github.com/Koed00/django-q/pull/563) ([aken830806](https://github.com/aken830806)) +- Codecov\_fixes [\#562](https://github.com/Koed00/django-q/pull/562) ([Koed00](https://github.com/Koed00)) +- Feature/improves multiple databases support [\#561](https://github.com/Koed00/django-q/pull/561) ([abxsantos](https://github.com/abxsantos)) + +## [v1.3.6](https://github.com/koed00/django-q/tree/v1.3.6) (2021-05-14) + +[Full Changelog](https://github.com/koed00/django-q/compare/v1.3.5...v1.3.6) + +**Closed issues:** + +- Chain of Task [\#547](https://github.com/Koed00/django-q/issues/547) +- Queued tasks \(OrmQ\) are not always acknowledged [\#545](https://github.com/Koed00/django-q/issues/545) +- Auto-created primary key used when not defining a primary key type [\#543](https://github.com/Koed00/django-q/issues/543) +- Tasks are "processing" but hooks are not called and cluster don't recgonize they are finished and "processed" [\#540](https://github.com/Koed00/django-q/issues/540) +- Django Q is still a young project. [\#528](https://github.com/Koed00/django-q/issues/528) +- SSL errors after upgrading to qcluster version 1.1.0 [\#422](https://github.com/Koed00/django-q/issues/422) +- \[Enhancement\] Add Systemd sample template [\#420](https://github.com/Koed00/django-q/issues/420) +- Not enough values to unpack \(expected 2, got 1\) [\#314](https://github.com/Koed00/django-q/issues/314) +- Successful tasks grow beyond save\_limit [\#225](https://github.com/Koed00/django-q/issues/225) + +**Merged pull requests:** + +- Fix for SSL errors in \#422 [\#556](https://github.com/Koed00/django-q/pull/556) ([nittolese](https://github.com/nittolese)) +- Allow tasks to be scheduled on a specific cluster [\#555](https://github.com/Koed00/django-q/pull/555) ([midse](https://github.com/midse)) +- Fixes \#314 - Convert func to its import path str so that resubmitting failed task works [\#554](https://github.com/Koed00/django-q/pull/554) ([kennyhei](https://github.com/kennyhei)) +- Add "qmemory" command [\#553](https://github.com/Koed00/django-q/pull/553) ([kennyhei](https://github.com/kennyhei)) +- Fixes \#225 - Successful tasks grow beyond SAVE\_LIMIT [\#552](https://github.com/Koed00/django-q/pull/552) ([kennyhei](https://github.com/kennyhei)) +- Fixes deprecated count method [\#549](https://github.com/Koed00/django-q/pull/549) ([Koed00](https://github.com/Koed00)) +- Updates testing to python 3.9 [\#548](https://github.com/Koed00/django-q/pull/548) ([Koed00](https://github.com/Koed00)) +- Update documentation for new retry time default [\#538](https://github.com/Koed00/django-q/pull/538) ([amo13](https://github.com/amo13)) +- Use 'timezone.localtime\(\)' when calculating the next run time [\#520](https://github.com/Koed00/django-q/pull/520) ([wy-z](https://github.com/wy-z)) +- added long polling support [\#506](https://github.com/Koed00/django-q/pull/506) ([Javedgouri](https://github.com/Javedgouri)) + +## [v1.3.5](https://github.com/koed00/django-q/tree/v1.3.5) (2021-02-26) + +[Full Changelog](https://github.com/koed00/django-q/compare/v1.3.4...v1.3.5) + +**Closed issues:** + +- Tasks piling up on a slower machine while the fast one has no tasks queued. Help. [\#500](https://github.com/Koed00/django-q/issues/500) +- SQL errors when running tasks and viewing successful/failed tasks [\#496](https://github.com/Koed00/django-q/issues/496) +- Prevent retry in case of failure \(max\_attempts\) [\#495](https://github.com/Koed00/django-q/issues/495) +- How to use with test cases? Scheduled tasks are not being queued when running `python manage.py test`. [\#490](https://github.com/Koed00/django-q/issues/490) +- Question: Running django-q in the background. [\#487](https://github.com/Koed00/django-q/issues/487) + +**Merged pull requests:** + +- Add a warning for misconfiguration. [\#509](https://github.com/Koed00/django-q/pull/509) ([icfly2](https://github.com/icfly2)) +- Migrate to Github Action CI [\#507](https://github.com/Koed00/django-q/pull/507) ([Koed00](https://github.com/Koed00)) +- Add example of http health check [\#504](https://github.com/Koed00/django-q/pull/504) ([pysean3](https://github.com/pysean3)) +- Add broker name in Schedule and enhanced Queued Tasks list display admin [\#502](https://github.com/Koed00/django-q/pull/502) ([telmobarros](https://github.com/telmobarros)) +- Added german translation [\#499](https://github.com/Koed00/django-q/pull/499) ([jonaswinkler](https://github.com/jonaswinkler)) +- Update brokers.rst [\#497](https://github.com/Koed00/django-q/pull/497) ([MaximilianKindshofer](https://github.com/MaximilianKindshofer)) + ## [v1.3.4](https://github.com/koed00/django-q/tree/v1.3.4) (2020-10-26) [Full Changelog](https://github.com/koed00/django-q/compare/v1.3.3...v1.3.4) @@ -68,7 +166,7 @@ - Support for Cron expressions [\#452](https://github.com/Koed00/django-q/pull/452) ([Koed00](https://github.com/Koed00)) - Updates packages [\#450](https://github.com/Koed00/django-q/pull/450) ([Koed00](https://github.com/Koed00)) - Adds hint, some linting and a release drafter [\#449](https://github.com/Koed00/django-q/pull/449) ([Koed00](https://github.com/Koed00)) -- Use 'force\_str' instead of deprecated 'force\_text' [\#448](https://github.com/Koed00/django-q/pull/448) ([edouardtheron](https://github.com/edouardtheron)) +- Use 'force\_str' instead of deprecated 'force\_text' [\#448](https://github.com/Koed00/django-q/pull/448) ([edthrn](https://github.com/edthrn)) - \[cleanup\] Few cleanup commit for linting and migrations [\#447](https://github.com/Koed00/django-q/pull/447) ([Djailla](https://github.com/Djailla)) ## [v1.2.4](https://github.com/koed00/django-q/tree/v1.2.4) (2020-06-10) diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 00000000..ebe8e7a3 --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,40 @@ +# Sets the python version +FROM python:3.9.5-slim + +# Allows the logs generated by python apps to be rendered in the terminal +ENV PYTHONUNBUFFERED 1 + +# Sets the default shell to bash +ENV SHELL /bin/bash + +# Creates a non-root user +RUN adduser --disabled-password docker + +# Upgrades pip +RUN pip install --upgrade pip + +# Poetry project setup for development +# Copies poetry requirements files +COPY --chown=docker Dockerfile.dev requirements.txt* setup.py* ./ + +RUN pip install -r requirements.txt + +RUN pip install pytest pytest-django codecov poetry + +# Clean up +RUN apt-get autoremove -y \ + && apt-get clean -y \ + && rm -rf /var/lib/apt/lists/* + +WORKDIR /home/docker + +# Sets the binaries to path +ENV PATH="/home/docker/.local/bin:${PATH}" + +# Copy in as non-root user, so permissions match what we need +COPY --chown=docker:docker . . + +RUN python setup.py develop + +# Applies the container user to be non-root +USER docker \ No newline at end of file diff --git a/LICENSE b/LICENSE index e12eb80b..6d2037f9 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2015 Ilan Steemers +Copyright (c) 2015 - 2021 Ilan Steemers Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 3c28bd69..00000000 --- a/MANIFEST.in +++ /dev/null @@ -1,9 +0,0 @@ -include LICENSE -include README.rst -include CHANGELOG. -recursive-include django_q/locale * -include django_q/management/*.py -include django_q/management/commands/*.py -include django_q/migrations/*.py -include django_q/brokers/*.py -include django_q/tests/*.py diff --git a/README.rst b/README.rst index 18c9c009..1a635410 100644 --- a/README.rst +++ b/README.rst @@ -31,7 +31,7 @@ Requirements - `Arrow `__ - `Blessed `__ -Tested with: Python 3.7, 3.8 Django 2.2.X and 3.1.X +Tested with: Python 3.7, 3.8, 3.9 Django 2.2.X and 3.2.X .. warning:: Since Python 3.7 `async` became a reserved keyword and was refactored to `async_task` @@ -105,6 +105,10 @@ Monitor your clusters with:: $ python manage.py qmonitor +Monitor your clusters' memory usage with:: + + $ python manage.py qmemory + Check overall statistics with:: $ python manage.py qinfo @@ -196,10 +200,12 @@ To run the tests you will need the following in addition to install requirements * `py.test `__ * `pytest-django `__ -* disque from https://github.com/antirez/disque.git +* Disque from https://github.com/antirez/disque.git * Redis * MongoDB +Or you can use the included Docker Compose file. + The following commands can be used to run the tests: .. code:: bash @@ -228,7 +234,7 @@ The following commands can be used to run the tests: Locale ~~~~~~ -Currently available in English and French. +Currently available in English, German and French. Translation pull requests are always welcome. Todo @@ -247,8 +253,10 @@ Acknowledgements `HumanHash `__ - Redditors feedback at `r/django `__ -.. |image0| image:: https://travis-ci.org/Koed00/django-q.svg?branch=master - :target: https://travis-ci.org/Koed00/django-q +- JetBrains for their `Open Source Support Program `__ + +.. |image0| image:: https://github.com/koed00/django-q/workflows/Tests/badge.svg?branche=master + :target: https://github.com/Koed00/django-q/actions?query=workflow%3Atests .. |image1| image:: http://codecov.io/github/Koed00/django-q/coverage.svg?branch=master :target: http://codecov.io/github/Koed00/django-q?branch=master .. |image2| image:: http://badges.gitter.im/Join%20Chat.svg diff --git a/django_q/__init__.py b/django_q/__init__.py index 702cbe05..57212dc6 100644 --- a/django_q/__init__.py +++ b/django_q/__init__.py @@ -1,6 +1,8 @@ -VERSION = (1, 3, 4) +VERSION = (1, 3, 9) -default_app_config = "django_q.apps.DjangoQConfig" +import django +if django.VERSION < (3, 2): + default_app_config = "django_q.apps.DjangoQConfig" __all__ = ["conf", "cluster", "models", "tasks"] diff --git a/django_q/admin.py b/django_q/admin.py index a7484ce1..53aaa16f 100644 --- a/django_q/admin.py +++ b/django_q/admin.py @@ -3,7 +3,7 @@ from django.utils.translation import gettext_lazy as _ from django_q.conf import Conf, croniter -from django_q.models import Success, Failure, Schedule, OrmQ +from django_q.models import Failure, OrmQ, Schedule, Success from django_q.tasks import async_task @@ -60,7 +60,7 @@ def get_readonly_fields(self, request, obj=None): class ScheduleAdmin(admin.ModelAdmin): - """ model admin for schedules """ + """model admin for schedules""" list_display = ( "id", @@ -68,6 +68,7 @@ class ScheduleAdmin(admin.ModelAdmin): "func", "schedule_type", "repeats", + "cluster", "next_run", "last_run", "success", @@ -77,13 +78,13 @@ class ScheduleAdmin(admin.ModelAdmin): if not croniter: readonly_fields = ("cron",) - list_filter = ("next_run", "schedule_type") + list_filter = ("next_run", "schedule_type", "cluster") search_fields = ("func",) list_display_links = ("id", "name") class QueueAdmin(admin.ModelAdmin): - """ queue admin for ORM broker """ + """queue admin for ORM broker""" list_display = ("id", "key", "task_id", "name", "func", "lock") @@ -100,6 +101,8 @@ def has_add_permission(self, request): """Don't allow adds.""" return False + list_filter = ("key",) + admin.site.register(Schedule, ScheduleAdmin) admin.site.register(Success, TaskAdmin) diff --git a/django_q/apps.py b/django_q/apps.py index 1f277595..abfb0b22 100644 --- a/django_q/apps.py +++ b/django_q/apps.py @@ -6,6 +6,7 @@ class DjangoQConfig(AppConfig): name = "django_q" verbose_name = Conf.LABEL + default_auto_field = "django.db.models.AutoField" def ready(self): from django_q.signals import call_hook diff --git a/django_q/brokers/__init__.py b/django_q/brokers/__init__.py index 511332a1..d978d99c 100644 --- a/django_q/brokers/__init__.py +++ b/django_q/brokers/__init__.py @@ -1,7 +1,7 @@ import importlib from typing import Optional -from django.core.cache import caches, InvalidCacheBackendError +from django.core.cache import InvalidCacheBackendError, caches from django_q.conf import Conf diff --git a/django_q/brokers/aws_sqs.py b/django_q/brokers/aws_sqs.py index 256813b5..6e6da73c 100644 --- a/django_q/brokers/aws_sqs.py +++ b/django_q/brokers/aws_sqs.py @@ -38,7 +38,9 @@ def dequeue(self): if not isinstance(wait_time_second, int): raise ValueError("receive_message_wait_time_seconds should be int") if wait_time_second > 20: - raise ValueError("receive_message_wait_time_seconds is invalid. Reason: Must be >= 0 and <= 20") + raise ValueError( + "receive_message_wait_time_seconds is invalid. Reason: Must be >= 0 and <= 20" + ) params.update({"WaitTimeSeconds": wait_time_second}) tasks = self.queue.receive_messages(**params) @@ -80,7 +82,7 @@ def get_connection(list_key: str = Conf.PREFIX) -> Session: config["region_name"] = config["aws_region"] del config["aws_region"] - if 'receive_message_wait_time_seconds' in config: + if "receive_message_wait_time_seconds" in config: del config["receive_message_wait_time_seconds"] return Session(**config) @@ -93,7 +95,7 @@ def get_queue(self): # exist try to create it. return self.sqs.get_queue_by_name(QueueName=self.list_key) except ClientError as exp: - if not exp.response["Error"]["Code"] == QUEUE_DOES_NOT_EXIST: + if exp.response["Error"]["Code"] != QUEUE_DOES_NOT_EXIST: raise exp return self.sqs.create_queue(QueueName=self.list_key) diff --git a/django_q/brokers/disque.py b/django_q/brokers/disque.py index 9a81abf3..d4775276 100644 --- a/django_q/brokers/disque.py +++ b/django_q/brokers/disque.py @@ -2,10 +2,11 @@ # External import redis -from redis import Redis # Django from django.utils.translation import gettext_lazy as _ +from redis import Redis + from django_q.brokers import Broker from django_q.conf import Conf diff --git a/django_q/brokers/mongo.py b/django_q/brokers/mongo.py index a4857bda..ef42ac2e 100644 --- a/django_q/brokers/mongo.py +++ b/django_q/brokers/mongo.py @@ -36,10 +36,10 @@ def get_collection(self): return self.connection[Conf.MONGO_DB][self.list_key] def queue_size(self): - return self.collection.count({"lock": {"$lte": _timeout()}}) + return self.collection.count_documents({"lock": {"$lte": _timeout()}}) def lock_size(self): - return self.collection.count({"lock": {"$gt": _timeout()}}) + return self.collection.count_documents({"lock": {"$gt": _timeout()}}) def purge_queue(self): return self.delete_queue() diff --git a/django_q/cluster.py b/django_q/cluster.py index 5fc437ed..9bce4f5e 100644 --- a/django_q/cluster.py +++ b/django_q/cluster.py @@ -1,10 +1,12 @@ # Standard import ast -import importlib +import inspect +import pydoc import signal import socket import traceback import uuid +from datetime import datetime from multiprocessing import Event, Process, Value, current_process from time import sleep @@ -12,13 +14,14 @@ import arrow # Django -from django import db, core +from django import core, db from django.apps.registry import apps try: apps.check_apps_ready() except core.exceptions.AppRegistryNotReady: import django + django.setup() from django.conf import settings @@ -27,21 +30,21 @@ # Local import django_q.tasks -from django_q.brokers import get_broker, Broker +from django_q.brokers import Broker, get_broker from django_q.conf import ( Conf, + croniter, + error_reporter, + get_ppid, logger, psutil, - get_ppid, - error_reporter, - croniter, resource, ) from django_q.humanhash import humanize -from django_q.models import Task, Success, Schedule +from django_q.models import Schedule, Success, Task from django_q.queues import Queue -from django_q.signals import pre_execute -from django_q.signing import SignedPackage, BadSignature +from django_q.signals import post_execute, pre_execute +from django_q.signing import BadSignature, SignedPackage from django_q.status import Stat, Status @@ -210,7 +213,8 @@ def reincarnate(self, process): :param process: the process to reincarnate :type process: Process or None """ - close_old_django_connections() + if not Conf.SYNC: + db.connections.close_all() # Close any old connections if process == self.monitor: self.monitor = self.spawn_monitor() logger.error(_(f"reincarnated monitor {process.name} after sudden death")) @@ -234,7 +238,8 @@ def reincarnate(self, process): def spawn_cluster(self): self.pool = [] Stat(self).save() - close_old_django_connections() + if not Conf.SYNC: + db.connection.close() # spawn worker pool for __ in range(self.pool_size): self.spawn_worker() @@ -381,6 +386,8 @@ def monitor(result_queue: Queue, broker: Broker = None): ack_id = task.pop("ack_id", False) if ack_id and (task["success"] or task.get("ack_failure", False)): broker.acknowledge(ack_id) + # signal execution done + post_execute.send(sender="django_q", task=task) # log the result if task["success"]: # log success @@ -416,31 +423,22 @@ def worker( f = task["func"] # if it's not an instance try to get it from the string if not callable(task["func"]): - try: - module, func = f.rsplit(".", 1) - m = importlib.import_module(module) - f = getattr(m, func) - except (ValueError, ImportError, AttributeError) as e: - result = (e, False) - if error_reporter: - error_reporter.report() - # We're still going - if not result: - close_old_django_connections() - timer_value = task.pop("timeout", timeout) - # signal execution - pre_execute.send(sender="django_q", func=f, task=task) - # execute the payload - timer.value = timer_value # Busy - try: - res = f(*task["args"], **task["kwargs"]) - result = (res, True) - except Exception as e: - result = (f"{e} : {traceback.format_exc()}", False) - if error_reporter: - error_reporter.report() - if task.get("sync", False): - raise + f = pydoc.locate(f) + close_old_django_connections() + timer_value = task.pop("timeout", timeout) + # signal execution + pre_execute.send(sender="django_q", func=f, task=task) + # execute the payload + timer.value = timer_value # Busy + try: + res = f(*task["args"], **task["kwargs"]) + result = (res, True) + except Exception as e: + result = (f"{e} : {traceback.format_exc()}", False) + if error_reporter: + error_reporter.report() + if task.get("sync", False): + raise with timer.get_lock(): # Process result task["result"] = result[0] @@ -476,8 +474,10 @@ def save_task(task, broker: Broker): # SAVE LIMIT > 0: Prune database, SAVE_LIMIT 0: No pruning close_old_django_connections() try: - if task["success"] and 0 < Conf.SAVE_LIMIT <= Success.objects.count(): - Success.objects.last().delete() + with db.transaction.atomic(): + last = Success.objects.select_for_update().last() + if task["success"] and 0 < Conf.SAVE_LIMIT <= Success.objects.count(): + last.delete() # check if this task has previous results if Task.objects.filter(id=task["id"], name=task["name"]).exists(): existing_task = Task.objects.get(id=task["id"], name=task["name"]) @@ -489,14 +489,26 @@ def save_task(task, broker: Broker): existing_task.attempt_count = existing_task.attempt_count + 1 existing_task.save() - if Conf.MAX_ATTEMPTS > 0 and existing_task.attempt_count >= Conf.MAX_ATTEMPTS: - broker.acknowledge(task['ack_id']) + if ( + Conf.MAX_ATTEMPTS > 0 + and existing_task.attempt_count >= Conf.MAX_ATTEMPTS + ): + broker.acknowledge(task["ack_id"]) else: + func = task["func"] + # convert func to string + if inspect.isfunction(func): + func = f"{func.__module__}.{func.__name__}" + elif inspect.ismethod(func): + func = ( + f"{func.__self__.__module__}." + f"{func.__self__.__name__}.{func.__name__}" + ) Task.objects.create( id=task["id"], name=task["name"], - func=task["func"], + func=func, hook=task.get("hook"), args=task["args"], kwargs=task["kwargs"], @@ -505,7 +517,7 @@ def save_task(task, broker: Broker): result=task["result"], group=task.get("group"), success=task["success"], - attempt_count=1 + attempt_count=1, ) except Exception as e: logger.error(e) @@ -571,11 +583,15 @@ def scheduler(broker: Broker = None): broker = get_broker() close_old_django_connections() try: - with db.transaction.atomic(using=Schedule.objects.db): + database_to_use = {"using": Conf.ORM} if not Conf.HAS_REPLICA else {} + with db.transaction.atomic(**database_to_use): for s in ( Schedule.objects.select_for_update() .exclude(repeats=0) .filter(next_run__lt=timezone.now()) + .filter( + db.models.Q(cluster__isnull=True) | db.models.Q(cluster=Conf.PREFIX) + ) ): args = () kwargs = {} @@ -595,7 +611,7 @@ def scheduler(broker: Broker = None): if s.hook: q_options["hook"] = s.hook # set up the next run time - if not s.schedule_type == s.ONCE: + if s.schedule_type != s.ONCE: next_run = arrow.get(s.next_run) while True: if s.schedule_type == s.MINUTES: @@ -620,7 +636,7 @@ def scheduler(broker: Broker = None): ) ) next_run = arrow.get( - croniter(s.cron, timezone.now()).get_next() + croniter(s.cron, localtime()).get_next() ) if Conf.CATCH_UP or next_run > arrow.utcnow(): break @@ -633,7 +649,12 @@ def scheduler(broker: Broker = None): ) s.repeats += -1 # send it to the cluster - q_options["broker"] = broker + scheduled_broker = broker + try: + scheduled_broker = get_broker(q_options["broker_name"]) + except: # invalid broker_name or non existing broker with broker_name + pass + q_options["broker"] = scheduled_broker q_options["group"] = q_options.get("group", s.name or s.id) kwargs["q_options"] = q_options s.task = django_q.tasks.async_task(s.func, *args, **kwargs) @@ -717,8 +738,16 @@ def set_cpu_affinity(n: int, process_ids: list, actual: bool = not Conf.TESTING) def rss_check(): - if Conf.MAX_RSS and resource: - return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss >= Conf.MAX_RSS - elif Conf.MAX_RSS and psutil: - return psutil.Process().memory_info().rss >= Conf.MAX_RSS * 1024 + if Conf.MAX_RSS: + if resource: + return resource.getrusage(resource.RUSAGE_SELF).ru_maxrss >= Conf.MAX_RSS + elif psutil: + return psutil.Process().memory_info().rss >= Conf.MAX_RSS * 1024 return False + + +def localtime() -> datetime: + """Override for timezone.localtime to deal with naive times and local times""" + if settings.USE_TZ: + return timezone.localtime() + return datetime.now() diff --git a/django_q/conf.py b/django_q/conf.py index ba7e3709..3a8f3982 100644 --- a/django_q/conf.py +++ b/django_q/conf.py @@ -3,6 +3,7 @@ from copy import deepcopy from multiprocessing import cpu_count from signal import signal +from warnings import warn import pkg_resources from django.conf import settings @@ -62,6 +63,9 @@ class Conf: # ORM broker ORM = conf.get("orm", None) + # ORM support for read/write replicas + HAS_REPLICA = conf.get("has_replica", False) + # Custom broker class BROKER_CLASS = conf.get("broker_class", None) @@ -130,6 +134,14 @@ class Conf: # Only works with brokers that guarantee delivery. Defaults to 60 seconds. RETRY = conf.get("retry", 60) + # Verify if retry and timeout settings are correct + if not TIMEOUT or (TIMEOUT > RETRY): + warn( + """Retry and timeout are misconfigured. Set retry larger than timeout, + failure to do so will cause the tasks to be retriggered before completion. + See https://django-q.readthedocs.io/en/latest/configure.html#retry for details.""" + ) + # Sets the amount of tasks the cluster will try to pop off the broker. # If it supports bulk gets. BULK = conf.get("bulk", 1) @@ -165,7 +177,7 @@ class Conf: ERROR_REPORTER = conf.get("error_reporter", {}) # Optional attempt count. set to 0 for infinite attempts - MAX_ATTEMPTS = conf.get('max_attempts', 0) + MAX_ATTEMPTS = conf.get("max_attempts", 0) # OSX doesn't implement qsize because of missing sem_getvalue() try: diff --git a/django_q/core_signing.py b/django_q/core_signing.py index 923ea289..03e83a4c 100644 --- a/django_q/core_signing.py +++ b/django_q/core_signing.py @@ -2,15 +2,10 @@ import time import zlib -from django.core.signing import ( - BadSignature, - SignatureExpired, - b64_decode, - JSONSerializer, - Signer as Sgnr, - TimestampSigner as TsS, - dumps, -) +from django.core.signing import BadSignature, JSONSerializer, SignatureExpired +from django.core.signing import Signer as Sgnr +from django.core.signing import TimestampSigner as TsS +from django.core.signing import b64_decode, dumps from django.utils import baseconv from django.utils.crypto import constant_time_compare from django.utils.encoding import force_bytes, force_str diff --git a/django_q/humanhash.py b/django_q/humanhash.py index a7ba1600..72238c1b 100644 --- a/django_q/humanhash.py +++ b/django_q/humanhash.py @@ -4,50 +4,269 @@ The simplest ways to use this module are the :func:`humanize` and :func:`uuid` functions. For tighter control over the output, see :class:`HumanHasher`. """ -from argparse import ArgumentError - import operator import uuid as uuidlib +from argparse import ArgumentError from functools import reduce - DEFAULT_WORDLIST = ( - 'ack', 'alabama', 'alanine', 'alaska', 'alpha', 'angel', 'apart', 'april', - 'arizona', 'arkansas', 'artist', 'asparagus', 'aspen', 'august', 'autumn', - 'avocado', 'bacon', 'bakerloo', 'batman', 'beer', 'berlin', 'beryllium', - 'black', 'blossom', 'blue', 'bluebird', 'bravo', 'bulldog', 'burger', - 'butter', 'california', 'carbon', 'cardinal', 'carolina', 'carpet', 'cat', - 'ceiling', 'charlie', 'chicken', 'coffee', 'cola', 'cold', 'colorado', - 'comet', 'connecticut', 'crazy', 'cup', 'dakota', 'december', 'delaware', - 'delta', 'diet', 'don', 'double', 'early', 'earth', 'east', 'echo', - 'edward', 'eight', 'eighteen', 'eleven', 'emma', 'enemy', 'equal', - 'failed', 'fanta', 'fifteen', 'fillet', 'finch', 'fish', 'five', 'fix', - 'floor', 'florida', 'football', 'four', 'fourteen', 'foxtrot', 'freddie', - 'friend', 'fruit', 'gee', 'georgia', 'glucose', 'golf', 'green', 'grey', - 'hamper', 'happy', 'harry', 'hawaii', 'helium', 'high', 'hot', 'hotel', - 'hydrogen', 'idaho', 'illinois', 'india', 'indigo', 'ink', 'iowa', - 'island', 'item', 'jersey', 'jig', 'johnny', 'juliet', 'july', 'jupiter', - 'kansas', 'kentucky', 'kilo', 'king', 'kitten', 'lactose', 'lake', 'lamp', - 'lemon', 'leopard', 'lima', 'lion', 'lithium', 'london', 'louisiana', - 'low', 'magazine', 'magnesium', 'maine', 'mango', 'march', 'mars', - 'maryland', 'massachusetts', 'may', 'mexico', 'michigan', 'mike', - 'minnesota', 'mirror', 'mississippi', 'missouri', 'mobile', 'mockingbird', - 'monkey', 'montana', 'moon', 'mountain', 'muppet', 'music', 'nebraska', - 'neptune', 'network', 'nevada', 'nine', 'nineteen', 'nitrogen', 'north', - 'november', 'nuts', 'october', 'ohio', 'oklahoma', 'one', 'orange', - 'oranges', 'oregon', 'oscar', 'oven', 'oxygen', 'papa', 'paris', 'pasta', - 'pennsylvania', 'pip', 'pizza', 'pluto', 'potato', 'princess', 'purple', - 'quebec', 'queen', 'quiet', 'red', 'river', 'robert', 'robin', 'romeo', - 'rugby', 'sad', 'salami', 'saturn', 'september', 'seven', 'seventeen', - 'shade', 'sierra', 'single', 'sink', 'six', 'sixteen', 'skylark', 'snake', - 'social', 'sodium', 'solar', 'south', 'spaghetti', 'speaker', 'spring', - 'stairway', 'steak', 'stream', 'summer', 'sweet', 'table', 'tango', 'ten', - 'tennessee', 'tennis', 'texas', 'thirteen', 'three', 'timing', 'triple', - 'twelve', 'twenty', 'two', 'uncle', 'undress', 'uniform', 'uranus', 'utah', - 'vegan', 'venus', 'vermont', 'victor', 'video', 'violet', 'virginia', - 'washington', 'west', 'whiskey', 'white', 'william', 'winner', 'winter', - 'wisconsin', 'wolfram', 'wyoming', 'xray', 'yankee', 'yellow', 'zebra', - 'zulu') + "ack", + "alabama", + "alanine", + "alaska", + "alpha", + "angel", + "apart", + "april", + "arizona", + "arkansas", + "artist", + "asparagus", + "aspen", + "august", + "autumn", + "avocado", + "bacon", + "bakerloo", + "batman", + "beer", + "berlin", + "beryllium", + "black", + "blossom", + "blue", + "bluebird", + "bravo", + "bulldog", + "burger", + "butter", + "california", + "carbon", + "cardinal", + "carolina", + "carpet", + "cat", + "ceiling", + "charlie", + "chicken", + "coffee", + "cola", + "cold", + "colorado", + "comet", + "connecticut", + "crazy", + "cup", + "dakota", + "december", + "delaware", + "delta", + "diet", + "don", + "double", + "early", + "earth", + "east", + "echo", + "edward", + "eight", + "eighteen", + "eleven", + "emma", + "enemy", + "equal", + "failed", + "fanta", + "fifteen", + "fillet", + "finch", + "fish", + "five", + "fix", + "floor", + "florida", + "football", + "four", + "fourteen", + "foxtrot", + "freddie", + "friend", + "fruit", + "gee", + "georgia", + "glucose", + "golf", + "green", + "grey", + "hamper", + "happy", + "harry", + "hawaii", + "helium", + "high", + "hot", + "hotel", + "hydrogen", + "idaho", + "illinois", + "india", + "indigo", + "ink", + "iowa", + "island", + "item", + "jersey", + "jig", + "johnny", + "juliet", + "july", + "jupiter", + "kansas", + "kentucky", + "kilo", + "king", + "kitten", + "lactose", + "lake", + "lamp", + "lemon", + "leopard", + "lima", + "lion", + "lithium", + "london", + "louisiana", + "low", + "magazine", + "magnesium", + "maine", + "mango", + "march", + "mars", + "maryland", + "massachusetts", + "may", + "mexico", + "michigan", + "mike", + "minnesota", + "mirror", + "mississippi", + "missouri", + "mobile", + "mockingbird", + "monkey", + "montana", + "moon", + "mountain", + "muppet", + "music", + "nebraska", + "neptune", + "network", + "nevada", + "nine", + "nineteen", + "nitrogen", + "north", + "november", + "nuts", + "october", + "ohio", + "oklahoma", + "one", + "orange", + "oranges", + "oregon", + "oscar", + "oven", + "oxygen", + "papa", + "paris", + "pasta", + "pennsylvania", + "pip", + "pizza", + "pluto", + "potato", + "princess", + "purple", + "quebec", + "queen", + "quiet", + "red", + "river", + "robert", + "robin", + "romeo", + "rugby", + "sad", + "salami", + "saturn", + "september", + "seven", + "seventeen", + "shade", + "sierra", + "single", + "sink", + "six", + "sixteen", + "skylark", + "snake", + "social", + "sodium", + "solar", + "south", + "spaghetti", + "speaker", + "spring", + "stairway", + "steak", + "stream", + "summer", + "sweet", + "table", + "tango", + "ten", + "tennessee", + "tennis", + "texas", + "thirteen", + "three", + "timing", + "triple", + "twelve", + "twenty", + "two", + "uncle", + "undress", + "uniform", + "uranus", + "utah", + "vegan", + "venus", + "vermont", + "victor", + "video", + "violet", + "virginia", + "washington", + "west", + "whiskey", + "white", + "william", + "winner", + "winter", + "wisconsin", + "wolfram", + "wyoming", + "xray", + "yankee", + "yellow", + "zebra", + "zulu", +) class HumanHasher: @@ -70,7 +289,7 @@ def __init__(self, wordlist=DEFAULT_WORDLIST): raise ArgumentError("Wordlist must have exactly 256 items") self.wordlist = wordlist - def humanize(self, hexdigest, words=4, separator='-'): + def humanize(self, hexdigest, words=4, separator="-"): """ Humanize a given hexadecimal digest. @@ -84,7 +303,10 @@ def humanize(self, hexdigest, words=4, separator='-'): """ # Gets a list of byte values between 0-255. - bytes = [int(x, 16) for x in list(map(''.join, list(zip(hexdigest[::2], hexdigest[1::2]))))] + bytes = [ + int(x, 16) + for x in list(map("".join, list(zip(hexdigest[::2], hexdigest[1::2])))) + ] # Compress an arbitrary number of bytes to `words`. compressed = self.compress(bytes, words) # Map the compressed byte values through the word list. @@ -115,10 +337,9 @@ def compress(bytes, target): # Split `bytes` into `target` segments. seg_size = length // target - segments = [bytes[i * seg_size:(i + 1) * seg_size] - for i in range(target)] + segments = [bytes[i * seg_size : (i + 1) * seg_size] for i in range(target)] # Catch any left-over bytes in the last segment. - segments[-1].extend(bytes[target * seg_size:]) + segments[-1].extend(bytes[target * seg_size :]) # Use a simple XOR checksum-like function for compression. checksum = lambda bytes: reduce(operator.xor, bytes, 0) @@ -134,7 +355,7 @@ def uuid(self, **params): as :meth:`humanize` (they'll be passed straight through). """ - digest = str(uuidlib.uuid4()).replace('-', '') + digest = str(uuidlib.uuid4()).replace("-", "") return self.humanize(digest, **params), digest diff --git a/django_q/management/commands/qcluster.py b/django_q/management/commands/qcluster.py index 5759fe90..1972bdce 100644 --- a/django_q/management/commands/qcluster.py +++ b/django_q/management/commands/qcluster.py @@ -10,15 +10,15 @@ class Command(BaseCommand): def add_arguments(self, parser): parser.add_argument( - '--run-once', - action='store_true', - dest='run_once', + "--run-once", + action="store_true", + dest="run_once", default=False, - help='Run once and then stop.', + help="Run once and then stop.", ) def handle(self, *args, **options): q = Cluster() q.start() - if options.get('run_once', False): + if options.get("run_once", False): q.stop() diff --git a/django_q/management/commands/qinfo.py b/django_q/management/commands/qinfo.py index 40a25403..2efe131b 100644 --- a/django_q/management/commands/qinfo.py +++ b/django_q/management/commands/qinfo.py @@ -3,7 +3,7 @@ from django_q import VERSION from django_q.conf import Conf -from django_q.monitor import info, get_ids +from django_q.monitor import get_ids, info class Command(BaseCommand): diff --git a/django_q/management/commands/qmemory.py b/django_q/management/commands/qmemory.py new file mode 100644 index 00000000..e7f84ceb --- /dev/null +++ b/django_q/management/commands/qmemory.py @@ -0,0 +1,31 @@ +from django.core.management.base import BaseCommand +from django.utils.translation import gettext as _ + +from django_q.monitor import memory + + +class Command(BaseCommand): + # Translators: help text for qmemory management command + help = _("Monitors Q Cluster memory usage") + + def add_arguments(self, parser): + parser.add_argument( + "--run-once", + action="store_true", + dest="run_once", + default=False, + help="Run once and then stop.", + ) + parser.add_argument( + "--workers", + action="store_true", + dest="workers", + default=False, + help="Show each worker's memory usage.", + ) + + def handle(self, *args, **options): + memory( + run_once=options.get("run_once", False), + workers=options.get("workers", False), + ) diff --git a/django_q/migrations/0001_initial.py b/django_q/migrations/0001_initial.py index f2503da9..63c0ec49 100644 --- a/django_q/migrations/0001_initial.py +++ b/django_q/migrations/0001_initial.py @@ -1,6 +1,6 @@ -from django.db import models, migrations -import picklefield.fields import django.utils.timezone +import picklefield.fields +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/django_q/migrations/0002_auto_20150630_1624.py b/django_q/migrations/0002_auto_20150630_1624.py index 2ed95d7b..5dd37e56 100644 --- a/django_q/migrations/0002_auto_20150630_1624.py +++ b/django_q/migrations/0002_auto_20150630_1624.py @@ -1,4 +1,4 @@ -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/django_q/migrations/0003_auto_20150708_1326.py b/django_q/migrations/0003_auto_20150708_1326.py index b3ef155f..2aa5279c 100644 --- a/django_q/migrations/0003_auto_20150708_1326.py +++ b/django_q/migrations/0003_auto_20150708_1326.py @@ -1,4 +1,4 @@ -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/django_q/migrations/0004_auto_20150710_1043.py b/django_q/migrations/0004_auto_20150710_1043.py index 06cae509..0197cfa7 100644 --- a/django_q/migrations/0004_auto_20150710_1043.py +++ b/django_q/migrations/0004_auto_20150710_1043.py @@ -1,4 +1,4 @@ -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/django_q/migrations/0005_auto_20150718_1506.py b/django_q/migrations/0005_auto_20150718_1506.py index b318ead9..105c5d68 100644 --- a/django_q/migrations/0005_auto_20150718_1506.py +++ b/django_q/migrations/0005_auto_20150718_1506.py @@ -1,4 +1,4 @@ -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/django_q/migrations/0006_auto_20150805_1817.py b/django_q/migrations/0006_auto_20150805_1817.py index 93a4daae..5c74bb6c 100644 --- a/django_q/migrations/0006_auto_20150805_1817.py +++ b/django_q/migrations/0006_auto_20150805_1817.py @@ -1,4 +1,4 @@ -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/django_q/migrations/0007_ormq.py b/django_q/migrations/0007_ormq.py index 29f59e87..dfc4cd3a 100644 --- a/django_q/migrations/0007_ormq.py +++ b/django_q/migrations/0007_ormq.py @@ -1,4 +1,4 @@ -from django.db import models, migrations +from django.db import migrations, models class Migration(migrations.Migration): diff --git a/django_q/migrations/0010_auto_20200610_0856.py b/django_q/migrations/0010_auto_20200610_0856.py index 7ae70d45..b87e08a1 100644 --- a/django_q/migrations/0010_auto_20200610_0856.py +++ b/django_q/migrations/0010_auto_20200610_0856.py @@ -1,5 +1,5 @@ -from django.db import migrations import picklefield.fields +from django.db import migrations class Migration(migrations.Migration): diff --git a/django_q/migrations/0012_auto_20200702_1608.py b/django_q/migrations/0012_auto_20200702_1608.py index 2162f4e4..397631f7 100644 --- a/django_q/migrations/0012_auto_20200702_1608.py +++ b/django_q/migrations/0012_auto_20200702_1608.py @@ -1,6 +1,7 @@ # Generated by Django 3.0.8 on 2020-07-02 16:08 from django.db import migrations, models + import django_q.models diff --git a/django_q/migrations/0014_schedule_cluster.py b/django_q/migrations/0014_schedule_cluster.py new file mode 100644 index 00000000..a2ce1093 --- /dev/null +++ b/django_q/migrations/0014_schedule_cluster.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.2 on 2021-05-11 05:59 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('django_q', '0013_task_attempt_count'), + ] + + operations = [ + migrations.AddField( + model_name='schedule', + name='cluster', + field=models.CharField(blank=True, default=None, max_length=100, null=True), + ), + ] diff --git a/django_q/models.py b/django_q/models.py index 4311f997..d83e0392 100644 --- a/django_q/models.py +++ b/django_q/models.py @@ -200,6 +200,7 @@ class Schedule(models.Model): help_text=_("Cron expression"), ) task = models.CharField(max_length=100, null=True, editable=False) + cluster = models.CharField(max_length=100, default=None, null=True, blank=True) def success(self): if self.task and Task.objects.filter(id=self.task): diff --git a/django_q/monitor.py b/django_q/monitor.py index 488eda85..97404187 100644 --- a/django_q/monitor.py +++ b/django_q/monitor.py @@ -5,15 +5,31 @@ # django from django.db import connection -from django.db.models import Sum, F +from django.db.models import F, Sum from django.utils import timezone from django.utils.translation import gettext as _ +from django_q import VERSION, models +from django_q.brokers import get_broker + # local from django_q.conf import Conf from django_q.status import Stat -from django_q.brokers import get_broker -from django_q import models, VERSION + +# optional +try: + import psutil +except ImportError: + psutil = None + + +def get_process_mb(pid): + try: + process = psutil.Process(pid) + mb_used = round(process.memory_info().rss / 1024 ** 2, 2) + except psutil.NoSuchProcess: + mb_used = "NO_PROCESS_FOUND" + return mb_used def monitor(run_once=False, broker=None): @@ -24,7 +40,10 @@ def monitor(run_once=False, broker=None): with term.fullscreen(), term.hidden_cursor(), term.cbreak(): val = None start_width = int(term.width / 8) - while val not in ("q", "Q",): + while val not in ( + "q", + "Q", + ): col_width = int(term.width / 8) # In case of resize if col_width != start_width: @@ -196,7 +215,7 @@ def info(broker=None): tasks_per_day = last_tasks.count() if tasks_per_day > 0: # average execution time over the last 24 hours - if not connection.vendor == "sqlite": + if connection.vendor != "sqlite": exec_time = last_tasks.aggregate( time_taken=Sum(F("stopped") - F("started")) ) @@ -272,6 +291,187 @@ def info(broker=None): return True +def memory(run_once=False, workers=False, broker=None): + if not broker: + broker = get_broker() + term = Terminal() + broker.ping() + if not psutil: + print(term.clear_eos()) + print( + term.white_on_red( + 'Cannot start "qmemory" command. Missing "psutil" library.' + ) + ) + return + with term.fullscreen(), term.hidden_cursor(), term.cbreak(): + MEMORY_AVAILABLE_LOWEST_PERCENTAGE = 100.0 + MEMORY_AVAILABLE_LOWEST_PERCENTAGE_AT = timezone.now() + cols = 8 + val = None + start_width = int(term.width / cols) + while val not in ["q", "Q"]: + col_width = int(term.width / cols) + # In case of resize + if col_width != start_width: + print(term.clear()) + start_width = col_width + # sentinel, monitor and workers memory usage + print( + term.move(0, 0 * col_width) + + term.black_on_green(term.center(_("Host"), width=col_width - 1)) + ) + print( + term.move(0, 1 * col_width) + + term.black_on_green(term.center(_("Id"), width=col_width - 1)) + ) + print( + term.move(0, 2 * col_width) + + term.black_on_green( + term.center(_("Available (%)"), width=col_width - 1) + ) + ) + print( + term.move(0, 3 * col_width) + + term.black_on_green( + term.center(_("Available (MB)"), width=col_width - 1) + ) + ) + print( + term.move(0, 4 * col_width) + + term.black_on_green(term.center(_("Total (MB)"), width=col_width - 1)) + ) + print( + term.move(0, 5 * col_width) + + term.black_on_green( + term.center(_("Sentinel (MB)"), width=col_width - 1) + ) + ) + print( + term.move(0, 6 * col_width) + + term.black_on_green( + term.center(_("Monitor (MB)"), width=col_width - 1) + ) + ) + print( + term.move(0, 7 * col_width) + + term.black_on_green( + term.center(_("Workers (MB)"), width=col_width - 1) + ) + ) + row = 2 + stats = Stat.get_all(broker=broker) + print(term.clear_eos()) + for stat in stats: + # memory available (%) + memory_available_percentage = round( + psutil.virtual_memory().available + * 100 + / psutil.virtual_memory().total, + 2, + ) + # memory available (MB) + memory_available = round( + psutil.virtual_memory().available / 1024 ** 2, 2 + ) + if memory_available_percentage < MEMORY_AVAILABLE_LOWEST_PERCENTAGE: + MEMORY_AVAILABLE_LOWEST_PERCENTAGE = memory_available_percentage + MEMORY_AVAILABLE_LOWEST_PERCENTAGE_AT = timezone.now() + print( + term.move(row, 0 * col_width) + + term.center(stat.host[: col_width - 1], width=col_width - 1) + ) + print( + term.move(row, 1 * col_width) + + term.center(str(stat.cluster_id)[-8:], width=col_width - 1) + ) + print( + term.move(row, 2 * col_width) + + term.center(memory_available_percentage, width=col_width - 1) + ) + print( + term.move(row, 3 * col_width) + + term.center(memory_available, width=col_width - 1) + ) + print( + term.move(row, 4 * col_width) + + term.center( + round(psutil.virtual_memory().total / 1024 ** 2, 2), + width=col_width - 1, + ) + ) + print( + term.move(row, 5 * col_width) + + term.center(get_process_mb(stat.sentinel), width=col_width - 1) + ) + print( + term.move(row, 6 * col_width) + + term.center( + get_process_mb(getattr(stat, "monitor", None)), + width=col_width - 1, + ) + ) + workers_mb = 0 + for worker_pid in stat.workers: + result = get_process_mb(worker_pid) + if isinstance(result, str): + result = 0 + workers_mb += result + print( + term.move(row, 7 * col_width) + + term.center( + workers_mb or "NO_PROCESSES_FOUND", width=col_width - 1 + ) + ) + row += 1 + # each worker's memory usage + if workers: + row += 2 + col_width = int(term.width / (1 + Conf.WORKERS)) + print( + term.move(row, 0 * col_width) + + term.black_on_cyan(term.center(_("Id"), width=col_width - 1)) + ) + for worker_num in range(Conf.WORKERS): + print( + term.move(row, (worker_num + 1) * col_width) + + term.black_on_cyan( + term.center( + "Worker #{} (MB)".format(worker_num + 1), + width=col_width - 1, + ) + ) + ) + row += 2 + for stat in stats: + print( + term.move(row, 0 * col_width) + + term.center(str(stat.cluster_id)[-8:], width=col_width - 1) + ) + for idx, worker_pid in enumerate(stat.workers): + mb_used = get_process_mb(worker_pid) + print( + term.move(row, (idx + 1) * col_width) + + term.center(mb_used, width=col_width - 1) + ) + row += 1 + row += 1 + print( + term.move(row, 0) + + _("Available lowest (%): {} ({})").format( + str(MEMORY_AVAILABLE_LOWEST_PERCENTAGE), + MEMORY_AVAILABLE_LOWEST_PERCENTAGE_AT.strftime( + "%Y-%m-%d %H:%M:%S+00:00" + ), + ) + ) + # for testing + if run_once: + return Stat.get_all(broker=broker) + print(term.move(row + 2, 0) + term.center("[Press q to quit]")) + val = term.inkey(timeout=1) + + def get_ids(): # prints id (PID) of running clusters stat = Stat.get_all() diff --git a/django_q/queues.py b/django_q/queues.py index 346ccecb..ef3ea714 100644 --- a/django_q/queues.py +++ b/django_q/queues.py @@ -7,7 +7,7 @@ class SharedCounter: - """ A synchronized shared counter. + """A synchronized shared counter. The locking done by multiprocessing.Value ensures that only a single process or thread may read or write the in-memory ctypes object. However, @@ -24,18 +24,18 @@ def __init__(self, n=0): self.count = multiprocessing.Value("i", n) def increment(self, n=1): - """ Increment the counter by n (default = 1) """ + """Increment the counter by n (default = 1)""" with self.count.get_lock(): self.count.value += n @property def value(self): - """ Return the value of the counter """ + """Return the value of the counter""" return self.count.value class Queue(multiprocessing.queues.Queue): - """ A portable implementation of multiprocessing.Queue. + """A portable implementation of multiprocessing.Queue. Because of multithreading / multiprocessing semantics, Queue.qsize() may raise the NotImplementedError exception on Unix platforms like Mac OS X @@ -57,7 +57,7 @@ def __init__(self, *args, **kwargs): self.size = SharedCounter(0) def __getstate__(self): - return super(Queue, self).__getstate__() + (self.size, ) + return super(Queue, self).__getstate__() + (self.size,) def __setstate__(self, state): super(Queue, self).__setstate__(state[:-1]) @@ -73,9 +73,9 @@ def get(self, *args, **kwargs): return x def qsize(self) -> int: - """ Reliable implementation of multiprocessing.Queue.qsize() """ + """Reliable implementation of multiprocessing.Queue.qsize()""" return self.size.value def empty(self) -> bool: - """ Reliable implementation of multiprocessing.Queue.empty() """ + """Reliable implementation of multiprocessing.Queue.empty()""" return not self.qsize() > 0 diff --git a/django_q/signals.py b/django_q/signals.py index 80833073..109b473b 100644 --- a/django_q/signals.py +++ b/django_q/signals.py @@ -1,7 +1,7 @@ import importlib from django.db.models.signals import post_save -from django.dispatch import receiver, Signal +from django.dispatch import Signal, receiver from django.utils.translation import gettext_lazy as _ from django_q.conf import logger @@ -31,8 +31,12 @@ def call_hook(sender, instance, **kwargs): ) ) + # args: task pre_enqueue = Signal() # args: func, task pre_execute = Signal() + +# args: task +post_execute = Signal() diff --git a/django_q/status.py b/django_q/status.py index 00eefa90..7ac01ef9 100644 --- a/django_q/status.py +++ b/django_q/status.py @@ -3,9 +3,9 @@ from django.utils import timezone -from django_q.brokers import get_broker, Broker +from django_q.brokers import Broker, get_broker from django_q.conf import Conf, logger -from django_q.signing import SignedPackage, BadSignature +from django_q.signing import BadSignature, SignedPackage class Status: diff --git a/django_q/tasks.py b/django_q/tasks.py index 1e6ca3c8..a6694e16 100644 --- a/django_q/tasks.py +++ b/django_q/tasks.py @@ -1,11 +1,11 @@ """Provides task functionality.""" # Standard +from multiprocessing import Value from time import sleep, time # django from django.db import IntegrityError from django.utils import timezone -from multiprocessing import Value # local from django_q.brokers import get_broker @@ -88,6 +88,7 @@ def schedule(func, *args, **kwargs): :param repeats: how many times to repeat. 0=never, -1=always. :param next_run: Next scheduled run. :type next_run: datetime.datetime + :param cluster: optional cluster name. :param cron: optional cron expression :param kwargs: function keyword arguments. :return: the schedule object. @@ -100,6 +101,7 @@ def schedule(func, *args, **kwargs): repeats = kwargs.pop("repeats", -1) next_run = kwargs.pop("next_run", timezone.now()) cron = kwargs.pop("cron", None) + cluster = kwargs.pop("cluster", None) # check for name duplicates instead of am unique constraint if name and Schedule.objects.filter(name=name).exists(): @@ -117,6 +119,7 @@ def schedule(func, *args, **kwargs): repeats=repeats, next_run=next_run, cron=cron, + cluster=cluster, ) # make sure we trigger validation s.full_clean() @@ -150,7 +153,7 @@ def result(task_id, wait=0, cached=Conf.CACHED): def result_cached(task_id, wait=0, broker=None): """ - Return the result from the cache backend + Return the result from the cache backend """ if not broker: broker = get_broker() @@ -260,7 +263,7 @@ def fetch_cached(task_id, wait=0, broker=None): r = broker.cache.get(f"{broker.list_key}:{task_id}") if r: task = SignedPackage.loads(r) - t = Task( + return Task( id=task["id"], name=task["name"], func=task["func"], @@ -272,7 +275,6 @@ def fetch_cached(task_id, wait=0, broker=None): result=task["result"], success=task["success"], ) - return t if (time() - start) * 1000 >= wait >= 0: break sleep(0.01) @@ -753,7 +755,7 @@ def fetch_group(self, failures=True, wait=0, count=None): def _sync(pack): """Simulate a package travelling through the cluster.""" - from django_q.cluster import worker, monitor + from django_q.cluster import monitor, worker task_queue = Queue() result_queue = Queue() diff --git a/django_q/tests/settings.py b/django_q/tests/settings.py index 40e43959..3749d2ec 100644 --- a/django_q/tests/settings.py +++ b/django_q/tests/settings.py @@ -1,4 +1,5 @@ import os + import django BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -8,7 +9,7 @@ # See https://docs.djangoproject.com/en/2.2/howto/deployment/checklist/ # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = ')cqmpi+p@n&!u&fu@!m@9h&1bz9mwmstsahe)nf!ms+c$uc=x7' +SECRET_KEY = ")cqmpi+p@n&!u&fu@!m@9h&1bz9mwmstsahe)nf!ms+c$uc=x7" # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True @@ -19,41 +20,41 @@ # Application definition INSTALLED_APPS = ( - 'django.contrib.admin', - 'django.contrib.auth', - 'django.contrib.contenttypes', - 'django.contrib.sessions', - 'django.contrib.messages', - 'django.contrib.staticfiles', - 'django_q', - 'django_redis' + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + "django_q", + "django_redis", ) MIDDLEWARE_CLASSES = ( - 'django.contrib.sessions.middleware.SessionMiddleware', - 'django.middleware.common.CommonMiddleware', - 'django.middleware.csrf.CsrfViewMiddleware', - 'django.contrib.auth.middleware.AuthenticationMiddleware', - 'django.contrib.messages.middleware.MessageMiddleware', - 'django.middleware.clickjacking.XFrameOptionsMiddleware', + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", ) MIDDLEWARE = MIDDLEWARE_CLASSES -ROOT_URLCONF = 'tests.urls' +ROOT_URLCONF = "tests.urls" TEMPLATES = [ { - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [], - 'APP_DIRS': True, - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.debug', - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", ], }, }, @@ -64,9 +65,9 @@ # https://docs.djangoproject.com/en/2.2/ref/settings/#databases DATABASES = { - 'default': { - 'ENGINE': 'django.db.backends.sqlite3', - 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": os.path.join(BASE_DIR, "db.sqlite3"), } } @@ -74,9 +75,9 @@ # Internationalization # https://docs.djangoproject.com/en/2.2/topics/i18n/ -LANGUAGE_CODE = 'en-us' +LANGUAGE_CODE = "en-us" -TIME_ZONE = 'UTC' +TIME_ZONE = "UTC" USE_I18N = True @@ -85,17 +86,17 @@ USE_TZ = True LOGGING = { - 'version': 1, - 'disable_existing_loggers': False, - 'handlers': { - 'console': { - 'class': 'logging.StreamHandler', + "version": 1, + "disable_existing_loggers": False, + "handlers": { + "console": { + "class": "logging.StreamHandler", }, }, - 'loggers': { - 'django_q': { - 'handlers': ['console'], - 'level': 'INFO', + "loggers": { + "django_q": { + "handlers": ["console"], + "level": "INFO", }, }, } @@ -103,7 +104,7 @@ # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.2/howto/static-files/ -STATIC_URL = '/static/' +STATIC_URL = "/static/" # Django Redis CACHES = { @@ -113,13 +114,15 @@ "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", "PARSER_CLASS": "redis.connection.HiredisParser", - } + }, } } # Django Q specific -Q_CLUSTER = {'name': 'django_q_test', - 'cpu_affinity': 1, - 'testing': True, - 'log_level': 'DEBUG', - 'django_redis': 'default'} +Q_CLUSTER = { + "name": "django_q_test", + "cpu_affinity": 1, + "testing": True, + "log_level": "DEBUG", + "django_redis": "default", +} diff --git a/django_q/tests/test_admin.py b/django_q/tests/test_admin.py index 52e8d410..959e180b 100644 --- a/django_q/tests/test_admin.py +++ b/django_q/tests/test_admin.py @@ -1,80 +1,86 @@ +import pytest from django.urls import reverse from django.utils import timezone -import pytest - -from django_q.tasks import schedule -from django_q.models import Task, Failure, OrmQ -from django_q.humanhash import uuid from django_q.conf import Conf +from django_q.humanhash import uuid +from django_q.models import Failure, OrmQ, Task from django_q.signing import SignedPackage +from django_q.tasks import schedule @pytest.mark.django_db def test_admin_views(admin_client, monkeypatch): - monkeypatch.setattr(Conf, 'ORM', 'default') - s = schedule('schedule.test') + monkeypatch.setattr(Conf, "ORM", "default") + s = schedule("schedule.test") tag = uuid() f = Task.objects.create( id=tag[1], name=tag[0], - func='test.fail', + func="test.fail", started=timezone.now(), stopped=timezone.now(), - success=False) + success=False, + ) tag = uuid() t = Task.objects.create( id=tag[1], name=tag[0], - func='test.success', + func="test.success", started=timezone.now(), stopped=timezone.now(), - success=True) + success=True, + ) q = OrmQ.objects.create( - key='test', - payload=SignedPackage.dumps({'id': 1, 'func': 'test', 'name': 'test'})) + key="test", + payload=SignedPackage.dumps({"id": 1, "func": "test", "name": "test"}), + ) admin_urls = ( # schedule - reverse('admin:django_q_schedule_changelist'), - reverse('admin:django_q_schedule_add'), - reverse('admin:django_q_schedule_change', args=(s.id,)), - reverse('admin:django_q_schedule_history', args=(s.id,)), - reverse('admin:django_q_schedule_delete', args=(s.id,)), + reverse("admin:django_q_schedule_changelist"), + reverse("admin:django_q_schedule_add"), + reverse("admin:django_q_schedule_change", args=(s.id,)), + reverse("admin:django_q_schedule_history", args=(s.id,)), + reverse("admin:django_q_schedule_delete", args=(s.id,)), # success - reverse('admin:django_q_success_changelist'), - reverse('admin:django_q_success_change', args=(t.id,)), - reverse('admin:django_q_success_history', args=(t.id,)), - reverse('admin:django_q_success_delete', args=(t.id,)), + reverse("admin:django_q_success_changelist"), + reverse("admin:django_q_success_change", args=(t.id,)), + reverse("admin:django_q_success_history", args=(t.id,)), + reverse("admin:django_q_success_delete", args=(t.id,)), # failure - reverse('admin:django_q_failure_changelist'), - reverse('admin:django_q_failure_change', args=(f.id,)), - reverse('admin:django_q_failure_history', args=(f.id,)), - reverse('admin:django_q_failure_delete', args=(f.id,)), + reverse("admin:django_q_failure_changelist"), + reverse("admin:django_q_failure_change", args=(f.id,)), + reverse("admin:django_q_failure_history", args=(f.id,)), + reverse("admin:django_q_failure_delete", args=(f.id,)), # orm queue - reverse('admin:django_q_ormq_changelist'), - reverse('admin:django_q_ormq_change', args=(q.id,)), - reverse('admin:django_q_ormq_history', args=(q.id,)), - reverse('admin:django_q_ormq_delete', args=(q.id,)), - + reverse("admin:django_q_ormq_changelist"), + reverse("admin:django_q_ormq_change", args=(q.id,)), + reverse("admin:django_q_ormq_history", args=(q.id,)), + reverse("admin:django_q_ormq_delete", args=(q.id,)), ) for url in admin_urls: response = admin_client.get(url) assert response.status_code == 200 # resubmit the failure - url = reverse('admin:django_q_failure_changelist') - data = {'action': 'retry_failed', - '_selected_action': [f.pk]} + url = reverse("admin:django_q_failure_changelist") + data = {"action": "retry_failed", "_selected_action": [f.pk]} response = admin_client.post(url, data) assert response.status_code == 302 assert Failure.objects.filter(name=f.id).exists() is False # change q - url = reverse('admin:django_q_ormq_change', args=(q.id,)) - data = {'key': 'default', 'payload': 'test', 'lock_0': '2015-09-17', 'lock_1': '14:31:51', '_save': 'Save'} + url = reverse("admin:django_q_ormq_change", args=(q.id,)) + data = { + "key": "default", + "payload": "test", + "lock_0": "2015-09-17", + "lock_1": "14:31:51", + "_save": "Save", + } response = admin_client.post(url, data) assert response.status_code == 302 # delete q - url = reverse('admin:django_q_ormq_delete', args=(q.id,)) - data = {'post': 'yes'} + url = reverse("admin:django_q_ormq_delete", args=(q.id,)) + data = {"post": "yes"} response = admin_client.post(url, data) assert response.status_code == 302 diff --git a/django_q/tests/test_brokers.py b/django_q/tests/test_brokers.py index ee9bd8ad..9abb43b6 100644 --- a/django_q/tests/test_brokers.py +++ b/django_q/tests/test_brokers.py @@ -4,7 +4,7 @@ import pytest import redis -from django_q.brokers import get_broker, Broker +from django_q.brokers import Broker, get_broker from django_q.conf import Conf from django_q.humanhash import uuid @@ -95,7 +95,7 @@ def test_disque(monkeypatch): task_id = broker.enqueue("test") broker.fail(task_id) # bulk test - for i in range(5): + for _ in range(5): broker.enqueue("test") monkeypatch.setattr(Conf, "BULK", 5) monkeypatch.setattr(Conf, "DISQUE_FASTACK", True) @@ -166,7 +166,7 @@ def test_ironmq(monkeypatch): task_id = broker.enqueue("test") broker.fail(task_id) # bulk test - for i in range(5): + for _ in range(5): broker.enqueue("test") monkeypatch.setattr(Conf, "BULK", 5) tasks = broker.dequeue() @@ -194,7 +194,7 @@ def canceled_sqs(monkeypatch): "aws_region": os.getenv("AWS_REGION"), "aws_access_key_id": os.getenv("AWS_ACCESS_KEY_ID"), "aws_secret_access_key": os.getenv("AWS_SECRET_ACCESS_KEY"), - "receive_message_wait_time_seconds": 20 + "receive_message_wait_time_seconds": 20, }, ) # check broker @@ -237,7 +237,7 @@ def canceled_sqs(monkeypatch): task = broker.dequeue()[0] broker.fail(task[0]) # bulk test - for i in range(10): + for _ in range(10): broker.enqueue("test") monkeypatch.setattr(Conf, "BULK", 12) tasks = broker.dequeue() @@ -291,7 +291,7 @@ def test_orm(monkeypatch): task_id = broker.enqueue("test") broker.fail(task_id) # bulk test - for i in range(5): + for _ in range(5): broker.enqueue("test") monkeypatch.setattr(Conf, "BULK", 5) tasks = broker.dequeue() @@ -348,11 +348,9 @@ def test_mongo(monkeypatch): task_id = broker.enqueue("test") broker.fail(task_id) # bulk test - for i in range(5): + for _ in range(5): broker.enqueue("test") - tasks = [] - for i in range(5): - tasks.append(broker.dequeue()[0]) + tasks = [broker.dequeue()[0] for _ in range(5)] assert broker.lock_size() == 5 for task in tasks: assert task is not None diff --git a/django_q/tests/test_cached.py b/django_q/tests/test_cached.py index 8c618c9a..ad480c65 100644 --- a/django_q/tests/test_cached.py +++ b/django_q/tests/test_cached.py @@ -2,17 +2,30 @@ import pytest -from django_q.cluster import pusher, worker, monitor -from django_q.conf import Conf -from django_q.tasks import async_task, result, fetch, count_group, result_group, fetch_group, delete_group, delete_cached, \ - async_iter, Chain, async_chain, Iter, AsyncTask from django_q.brokers import get_broker +from django_q.cluster import monitor, pusher, worker +from django_q.conf import Conf from django_q.queues import Queue +from django_q.tasks import ( + AsyncTask, + Chain, + Iter, + async_chain, + async_iter, + async_task, + count_group, + delete_cached, + delete_group, + fetch, + fetch_group, + result, + result_group, +) @pytest.fixture def broker(monkeypatch): - monkeypatch.setattr(Conf, 'DJANGO_REDIS', 'default') + monkeypatch.setattr(Conf, "DJANGO_REDIS", "default") return get_broker() @@ -20,16 +33,16 @@ def broker(monkeypatch): def test_cached(broker): broker.purge_queue() broker.cache.clear() - group = 'cache_test' + group = "cache_test" # queue the tests - task_id = async_task('math.copysign', 1, -1, cached=True, broker=broker) - async_task('math.copysign', 1, -1, cached=True, broker=broker, group=group) - async_task('math.copysign', 1, -1, cached=True, broker=broker, group=group) - async_task('math.copysign', 1, -1, cached=True, broker=broker, group=group) - async_task('math.copysign', 1, -1, cached=True, broker=broker, group=group) - async_task('math.copysign', 1, -1, cached=True, broker=broker, group=group) - async_task('math.popysign', 1, -1, cached=True, broker=broker, group=group) - iter_id = async_iter('math.floor', [i for i in range(10)], cached=True) + task_id = async_task("math.copysign", 1, -1, cached=True, broker=broker) + async_task("math.copysign", 1, -1, cached=True, broker=broker, group=group) + async_task("math.copysign", 1, -1, cached=True, broker=broker, group=group) + async_task("math.copysign", 1, -1, cached=True, broker=broker, group=group) + async_task("math.copysign", 1, -1, cached=True, broker=broker, group=group) + async_task("math.copysign", 1, -1, cached=True, broker=broker, group=group) + async_task("math.popysign", 1, -1, cached=True, broker=broker, group=group) + iter_id = async_iter("math.floor", [i for i in range(10)], cached=True) # test wait on cache # test wait timeout assert result(task_id, wait=10, cached=True) is None @@ -48,11 +61,11 @@ def test_cached(broker): pusher(task_queue, stop_event, broker=broker) assert broker.queue_size() == 0 assert task_queue.qsize() == task_count - task_queue.put('STOP') + task_queue.put("STOP") result_queue = Queue() - worker(task_queue, result_queue, Value('f', -1)) + worker(task_queue, result_queue, Value("f", -1)) assert result_queue.qsize() == task_count - result_queue.put('STOP') + result_queue.put("STOP") monitor(result_queue) assert result_queue.qsize() == 0 # assert results @@ -85,10 +98,10 @@ def test_iter(broker): it = [i for i in range(10)] it2 = [(1, -1), (2, -1), (3, -4), (5, 6)] it3 = (1, 2, 3, 4, 5) - t = async_iter('math.floor', it, sync=True) - t2 = async_iter('math.copysign', it2, sync=True) - t3 = async_iter('math.floor', it3, sync=True) - t4 = async_iter('math.floor', (1,), sync=True) + t = async_iter("math.floor", it, sync=True) + t2 = async_iter("math.copysign", it2, sync=True) + t3 = async_iter("math.floor", it3, sync=True) + t4 = async_iter("math.floor", (1,), sync=True) result_t = result(t) assert result_t is not None task_t = fetch(t) @@ -97,7 +110,7 @@ def test_iter(broker): assert result(t3) is not None assert result(t4)[0] == 1 # test iter class - i = Iter('math.copysign', sync=True, cached=True) + i = Iter("math.copysign", sync=True, cached=True) i.append(1, -1) i.append(2, -1) i.append(3, -4) @@ -118,9 +131,9 @@ def test_chain(broker): broker.purge_queue() broker.cache.clear() task_chain = Chain(sync=True) - task_chain.append('math.floor', 1) - task_chain.append('math.copysign', 1, -1) - task_chain.append('math.floor', 2) + task_chain.append("math.floor", 1) + task_chain.append("math.copysign", 1, -1) + task_chain.append("math.floor", 2) assert task_chain.length() == 3 assert task_chain.current() is None task_chain.run() @@ -130,7 +143,7 @@ def test_chain(broker): t = task_chain.fetch() assert len(t) == task_chain.length() task_chain.cached = True - task_chain.append('math.floor', 3) + task_chain.append("math.floor", 3) assert task_chain.length() == 4 task_chain.run() r = task_chain.result(wait=1000) @@ -139,51 +152,60 @@ def test_chain(broker): t = task_chain.fetch() assert len(t) == task_chain.length() # test single - rid = async_chain(['django_q.tests.tasks.hello', 'django_q.tests.tasks.hello'], sync=True, cached=True) - assert result_group(rid, cached=True) == ['hello', 'hello'] + rid = async_chain( + ["django_q.tests.tasks.hello", "django_q.tests.tasks.hello"], + sync=True, + cached=True, + ) + assert result_group(rid, cached=True) == ["hello", "hello"] @pytest.mark.django_db def test_asynctask_class(broker, monkeypatch): broker.purge_queue() broker.cache.clear() - a = AsyncTask('math.copysign') - assert a.func == 'math.copysign' + a = AsyncTask("math.copysign") + assert a.func == "math.copysign" a.args = (1, -1) assert a.started is False a.cached = True - assert a.cached is True + assert a.cached a.sync = True - assert a.sync is True + assert a.sync a.broker = broker assert a.broker == broker a.run() assert a.result() == -1 assert a.fetch().result == -1 # again with kwargs - a = AsyncTask('math.copysign', 1, -1, cached=True, sync=True, broker=broker) + a = AsyncTask("math.copysign", 1, -1, cached=True, sync=True, broker=broker) a.run() assert a.result() == -1 # with q_options - a = AsyncTask('math.copysign', 1, -1, q_options={'cached': True, 'sync': False, 'broker': broker}) - assert a.sync is False + a = AsyncTask( + "math.copysign", + 1, + -1, + q_options={"cached": True, "sync": False, "broker": broker}, + ) + assert not a.sync a.sync = True - assert a.kwargs['q_options']['sync'] is True + assert a.kwargs["q_options"]["sync"] is True a.run() assert a.result() == -1 - a.group = 'async_class_test' - assert a.group == 'async_class_test' + a.group = "async_class_test" + assert a.group == "async_class_test" a.save = False - assert a.save is False - a.hook = 'djq.tests.tasks.hello' - assert a.hook == 'djq.tests.tasks.hello' + assert not a.save + a.hook = "djq.tests.tasks.hello" + assert a.hook == "djq.tests.tasks.hello" assert a.started is False a.run() assert a.result_group() == [-1] assert a.fetch_group() == [a.fetch()] # global overrides - monkeypatch.setattr(Conf, 'SYNC', True) - monkeypatch.setattr(Conf, 'CACHED', True) - a = AsyncTask('math.floor', 1.5) + monkeypatch.setattr(Conf, "SYNC", True) + monkeypatch.setattr(Conf, "CACHED", True) + a = AsyncTask("math.floor", 1.5) a.run() assert a.result() == 1 diff --git a/django_q/tests/test_cluster.py b/django_q/tests/test_cluster.py index be04cdfb..1755932e 100644 --- a/django_q/tests/test_cluster.py +++ b/django_q/tests/test_cluster.py @@ -1,25 +1,37 @@ +import os import sys import threading +import uuid as uuidlib +from math import copysign from multiprocessing import Event, Value from time import sleep -from django.utils import timezone -import uuid as uuidlib +from typing import Optional -import os import pytest +from django.utils import timezone myPath = os.path.dirname(os.path.abspath(__file__)) -sys.path.insert(0, myPath + '/../') +sys.path.insert(0, myPath + "/../") -from django_q.cluster import Cluster, Sentinel, pusher, worker, monitor, save_task -from django_q.humanhash import DEFAULT_WORDLIST, uuid -from django_q.tasks import fetch, fetch_group, async_task, result, result_group, count_group, delete_group, queue_size -from django_q.models import Task, Success +from django_q.brokers import Broker, get_broker +from django_q.cluster import Cluster, Sentinel, monitor, pusher, save_task, worker from django_q.conf import Conf -from django_q.status import Stat -from django_q.brokers import get_broker, Broker -from django_q.tests.tasks import multiply, TaskError +from django_q.humanhash import DEFAULT_WORDLIST, uuid +from django_q.models import Success, Task from django_q.queues import Queue +from django_q.signals import post_execute, pre_enqueue, pre_execute +from django_q.status import Stat +from django_q.tasks import ( + async_task, + count_group, + delete_group, + fetch, + fetch_group, + queue_size, + result, + result_group, +) +from django_q.tests.tasks import TaskError, multiply class WordClass: @@ -32,7 +44,7 @@ def get_words(self): @pytest.fixture def broker(monkeypatch): - monkeypatch.setattr(Conf, 'DJANGO_REDIS', 'default') + monkeypatch.setattr(Conf, "DJANGO_REDIS", "default") return get_broker() @@ -42,19 +54,21 @@ def test_redis_connection(broker): @pytest.mark.django_db def test_sync(broker): - task = async_task('django_q.tests.tasks.count_letters', DEFAULT_WORDLIST, broker=broker, sync=True) + task = async_task( + "django_q.tests.tasks.count_letters", DEFAULT_WORDLIST, broker=broker, sync=True + ) assert result(task) == 1506 @pytest.mark.django_db def test_sync_raise_exception(broker): with pytest.raises(TaskError): - async_task('django_q.tests.tasks.raise_exception', broker=broker, sync=True) + async_task("django_q.tests.tasks.raise_exception", broker=broker, sync=True) @pytest.mark.django_db def test_cluster_initial(broker): - broker.list_key = 'initial_test:q' + broker.list_key = "initial_test:q" broker.delete_queue() c = Cluster(broker=broker) assert c.sentinel is None @@ -80,16 +94,23 @@ def test_sentinel(): stop_event = Event() stop_event.set() cluster_id = uuidlib.uuid4() - s = Sentinel(stop_event, start_event, cluster_id=cluster_id, broker=get_broker('sentinel_test:q')) + s = Sentinel( + stop_event, + start_event, + cluster_id=cluster_id, + broker=get_broker("sentinel_test:q"), + ) assert start_event.is_set() assert s.status() == Conf.STOPPED @pytest.mark.django_db def test_cluster(broker): - broker.list_key = 'cluster_test:q' + broker.list_key = "cluster_test:q" broker.delete_queue() - task = async_task('django_q.tests.tasks.count_letters', DEFAULT_WORDLIST, broker=broker) + task = async_task( + "django_q.tests.tasks.count_letters", DEFAULT_WORDLIST, broker=broker + ) assert broker.queue_size() == 1 task_queue = Queue() assert task_queue.qsize() == 0 @@ -102,12 +123,12 @@ def test_cluster(broker): assert task_queue.qsize() == 1 assert queue_size(broker=broker) == 0 # Test work - task_queue.put('STOP') - worker(task_queue, result_queue, Value('f', -1)) + task_queue.put("STOP") + worker(task_queue, result_queue, Value("f", -1)) assert task_queue.qsize() == 0 assert result_queue.qsize() == 1 # Test monitor - result_queue.put('STOP') + result_queue.put("STOP") monitor(result_queue) assert result_queue.qsize() == 0 # check result @@ -117,33 +138,63 @@ def test_cluster(broker): @pytest.mark.django_db def test_enqueue(broker, admin_user): - broker.list_key = 'cluster_test:q' + broker.list_key = "cluster_test:q" broker.delete_queue() - a = async_task('django_q.tests.tasks.count_letters', DEFAULT_WORDLIST, hook='django_q.tests.test_cluster.assert_result', - broker=broker) - b = async_task('django_q.tests.tasks.count_letters2', WordClass(), hook='django_q.tests.test_cluster.assert_result', - broker=broker) + a = async_task( + "django_q.tests.tasks.count_letters", + DEFAULT_WORDLIST, + hook="django_q.tests.test_cluster.assert_result", + broker=broker, + ) + b = async_task( + "django_q.tests.tasks.count_letters2", + WordClass(), + hook="django_q.tests.test_cluster.assert_result", + broker=broker, + ) # unknown argument - c = async_task('django_q.tests.tasks.count_letters', DEFAULT_WORDLIST, 'oneargumentoomany', - hook='django_q.tests.test_cluster.assert_bad_result', broker=broker) + c = async_task( + "django_q.tests.tasks.count_letters", + DEFAULT_WORDLIST, + "oneargumentoomany", + hook="django_q.tests.test_cluster.assert_bad_result", + broker=broker, + ) # unknown function - d = async_task('django_q.tests.tasks.does_not_exist', WordClass(), hook='django_q.tests.test_cluster.assert_bad_result', - broker=broker) + d = async_task( + "django_q.tests.tasks.does_not_exist", + WordClass(), + hook="django_q.tests.test_cluster.assert_bad_result", + broker=broker, + ) # function without result - e = async_task('django_q.tests.tasks.countdown', 100000, broker=broker) + e = async_task("django_q.tests.tasks.countdown", 100000, broker=broker) # function as instance f = async_task(multiply, 753, 2, hook=assert_result, broker=broker) # model as argument - g = async_task('django_q.tests.tasks.get_task_name', Task(name='John'), broker=broker) + g = async_task( + "django_q.tests.tasks.get_task_name", Task(name="John"), broker=broker + ) # args,kwargs, group and broken hook - h = async_task('django_q.tests.tasks.word_multiply', 2, word='django', hook='fail.me', broker=broker) + h = async_task( + "django_q.tests.tasks.word_multiply", + 2, + word="django", + hook="fail.me", + broker=broker, + ) # args unpickle test - j = async_task('django_q.tests.tasks.get_user_id', admin_user, broker=broker, group='test_j') + j = async_task( + "django_q.tests.tasks.get_user_id", admin_user, broker=broker, group="test_j" + ) # q_options and save opt_out test - k = async_task('django_q.tests.tasks.get_user_id', admin_user, - q_options={'broker': broker, 'group': 'test_k', 'save': False, 'timeout': 90}) + k = async_task( + "django_q.tests.tasks.get_user_id", + admin_user, + q_options={"broker": broker, "group": "test_k", "save": False, "timeout": 90}, + ) # test unicode - assert Task(name='Amalia').__str__()=='Amalia' + assert Task(name="Amalia").__str__() == "Amalia" # check if everything has a task id assert isinstance(a, str) assert isinstance(b, str) @@ -162,23 +213,23 @@ def test_enqueue(broker, admin_user): stop_event = Event() stop_event.set() # push the tasks - for i in range(task_count): + for _ in range(task_count): pusher(task_queue, stop_event, broker=broker) assert broker.queue_size() == 0 assert task_queue.qsize() == task_count - task_queue.put('STOP') + task_queue.put("STOP") # test wait timeout assert result(j, wait=10) is None assert fetch(j, wait=10) is None - assert result_group('test_j', wait=10) is None - assert result_group('test_j', count=2, wait=10) is None - assert fetch_group('test_j', wait=10) is None - assert fetch_group('test_j', count=2, wait=10) is None + assert result_group("test_j", wait=10) is None + assert result_group("test_j", count=2, wait=10) is None + assert fetch_group("test_j", wait=10) is None + assert fetch_group("test_j", count=2, wait=10) is None # let a worker handle them result_queue = Queue() - worker(task_queue, result_queue, Value('f', -1)) + worker(task_queue, result_queue, Value("f", -1)) assert result_queue.qsize() == task_count - result_queue.put('STOP') + result_queue.put("STOP") # store the results monitor(result_queue) assert result_queue.qsize() == 0 @@ -215,7 +266,7 @@ def test_enqueue(broker, admin_user): result_g = fetch(g) assert result_g is not None assert result_g.success is True - assert result(g) == 'John' + assert result(g) == "John" # task h result_h = fetch(h) assert result_h is not None @@ -230,19 +281,19 @@ def test_enqueue(broker, admin_user): assert fetch(result_j.name) == result_j assert result(result_j.name) == result_j.result # groups - assert result_group('test_j')[0] == result_j.result + assert result_group("test_j")[0] == result_j.result assert result_j.group_result()[0] == result_j.result - assert result_group('test_j', failures=True)[0] == result_j.result + assert result_group("test_j", failures=True)[0] == result_j.result assert result_j.group_result(failures=True)[0] == result_j.result - assert fetch_group('test_j')[0].id == [result_j][0].id - assert fetch_group('test_j', failures=False)[0].id == [result_j][0].id - assert count_group('test_j') == 1 + assert fetch_group("test_j")[0].id == [result_j][0].id + assert fetch_group("test_j", failures=False)[0].id == [result_j][0].id + assert count_group("test_j") == 1 assert result_j.group_count() == 1 - assert count_group('test_j', failures=True) == 0 + assert count_group("test_j", failures=True) == 0 assert result_j.group_count(failures=True) == 0 - assert delete_group('test_j') == 1 + assert delete_group("test_j") == 1 assert result_j.group_delete() == 0 - deleted_group = delete_group('test_j', tasks=True) + deleted_group = delete_group("test_j", tasks=True) assert deleted_group is None or deleted_group[0] == 0 # Django 1.9 deleted_group = result_j.group_delete(tasks=True) assert deleted_group is None or deleted_group[0] == 0 # Django 1.9 @@ -254,22 +305,31 @@ def test_enqueue(broker, admin_user): @pytest.mark.django_db -@pytest.mark.parametrize('cluster_config_timeout, async_task_kwargs', ( - (1, {}), - (10, {'timeout': 1}), - (None, {'timeout': 1}), -)) +@pytest.mark.parametrize( + "cluster_config_timeout, async_task_kwargs", + ( + (1, {}), + (10, {"timeout": 1}), + (None, {"timeout": 1}), + ), +) def test_timeout(broker, cluster_config_timeout, async_task_kwargs): # set up the Sentinel - broker.list_key = 'timeout_test:q' + broker.list_key = "timeout_test:q" broker.purge_queue() - async_task('time.sleep', 5, broker=broker, **async_task_kwargs) + async_task("time.sleep", 5, broker=broker, **async_task_kwargs) start_event = Event() stop_event = Event() cluster_id = uuidlib.uuid4() # Set a timer to stop the Sentinel threading.Timer(3, stop_event.set).start() - s = Sentinel(stop_event, start_event, cluster_id=cluster_id, broker=broker, timeout=cluster_config_timeout) + s = Sentinel( + stop_event, + start_event, + cluster_id=cluster_id, + broker=broker, + timeout=cluster_config_timeout, + ) assert start_event.is_set() assert s.status() == Conf.STOPPED assert s.reincarnations == 1 @@ -277,23 +337,32 @@ def test_timeout(broker, cluster_config_timeout, async_task_kwargs): @pytest.mark.django_db -@pytest.mark.parametrize('cluster_config_timeout, async_task_kwargs', ( - (5, {}), - (10, {'timeout': 5}), - (1, {'timeout': 5}), - (None, {'timeout': 5}), -)) +@pytest.mark.parametrize( + "cluster_config_timeout, async_task_kwargs", + ( + (5, {}), + (10, {"timeout": 5}), + (1, {"timeout": 5}), + (None, {"timeout": 5}), + ), +) def test_timeout_task_finishes(broker, cluster_config_timeout, async_task_kwargs): # set up the Sentinel - broker.list_key = 'timeout_test:q' + broker.list_key = "timeout_test:q" broker.purge_queue() - async_task('time.sleep', 3, broker=broker, **async_task_kwargs) + async_task("time.sleep", 3, broker=broker, **async_task_kwargs) start_event = Event() stop_event = Event() cluster_id = uuidlib.uuid4() # Set a timer to stop the Sentinel threading.Timer(6, stop_event.set).start() - s = Sentinel(stop_event, start_event, cluster_id=cluster_id, broker=broker, timeout=cluster_config_timeout) + s = Sentinel( + stop_event, + start_event, + cluster_id=cluster_id, + broker=broker, + timeout=cluster_config_timeout, + ) assert start_event.is_set() assert s.status() == Conf.STOPPED assert s.reincarnations == 0 @@ -303,70 +372,71 @@ def test_timeout_task_finishes(broker, cluster_config_timeout, async_task_kwargs @pytest.mark.django_db def test_recycle(broker, monkeypatch): # set up the Sentinel - broker.list_key = 'test_recycle_test:q' - async_task('django_q.tests.tasks.multiply', 2, 2, broker=broker) - async_task('django_q.tests.tasks.multiply', 2, 2, broker=broker) - async_task('django_q.tests.tasks.multiply', 2, 2, broker=broker) + broker.list_key = "test_recycle_test:q" + async_task("django_q.tests.tasks.multiply", 2, 2, broker=broker) + async_task("django_q.tests.tasks.multiply", 2, 2, broker=broker) + async_task("django_q.tests.tasks.multiply", 2, 2, broker=broker) start_event = Event() stop_event = Event() cluster_id = uuidlib.uuid4() # override settings - monkeypatch.setattr(Conf, 'RECYCLE', 2) - monkeypatch.setattr(Conf, 'WORKERS', 1) + monkeypatch.setattr(Conf, "RECYCLE", 2) + monkeypatch.setattr(Conf, "WORKERS", 1) # set a timer to stop the Sentinel threading.Timer(3, stop_event.set).start() s = Sentinel(stop_event, start_event, cluster_id=cluster_id, broker=broker) assert start_event.is_set() assert s.status() == Conf.STOPPED assert s.reincarnations == 1 - async_task('django_q.tests.tasks.multiply', 2, 2, broker=broker) - async_task('django_q.tests.tasks.multiply', 2, 2, broker=broker) + async_task("django_q.tests.tasks.multiply", 2, 2, broker=broker) + async_task("django_q.tests.tasks.multiply", 2, 2, broker=broker) task_queue = Queue() result_queue = Queue() # push two tasks pusher(task_queue, stop_event, broker=broker) pusher(task_queue, stop_event, broker=broker) # worker should exit on recycle - worker(task_queue, result_queue, Value('f', -1)) + worker(task_queue, result_queue, Value("f", -1)) # check if the work has been done assert result_queue.qsize() == 2 # save_limit test - monkeypatch.setattr(Conf, 'SAVE_LIMIT', 1) - result_queue.put('STOP') + monkeypatch.setattr(Conf, "SAVE_LIMIT", 1) + result_queue.put("STOP") # run monitor monitor(result_queue) assert Success.objects.count() == Conf.SAVE_LIMIT broker.delete_queue() + @pytest.mark.django_db def test_max_rss(broker, monkeypatch): # set up the Sentinel - broker.list_key = 'test_max_rss_test:q' - async_task('django_q.tests.tasks.multiply', 2, 2, broker=broker) + broker.list_key = "test_max_rss_test:q" + async_task("django_q.tests.tasks.multiply", 2, 2, broker=broker) start_event = Event() stop_event = Event() cluster_id = uuidlib.uuid4() # override settings - monkeypatch.setattr(Conf, 'MAX_RSS', 40000) - monkeypatch.setattr(Conf, 'WORKERS', 1) + monkeypatch.setattr(Conf, "MAX_RSS", 40000) + monkeypatch.setattr(Conf, "WORKERS", 1) # set a timer to stop the Sentinel threading.Timer(3, stop_event.set).start() s = Sentinel(stop_event, start_event, cluster_id=cluster_id, broker=broker) assert start_event.is_set() assert s.status() == Conf.STOPPED assert s.reincarnations == 1 - async_task('django_q.tests.tasks.multiply', 2, 2, broker=broker) + async_task("django_q.tests.tasks.multiply", 2, 2, broker=broker) task_queue = Queue() result_queue = Queue() # push the task pusher(task_queue, stop_event, broker=broker) # worker should exit on recycle - worker(task_queue, result_queue, Value('f', -1)) + worker(task_queue, result_queue, Value("f", -1)) # check if the work has been done assert result_queue.qsize() == 1 # save_limit test - monkeypatch.setattr(Conf, 'SAVE_LIMIT', 1) - result_queue.put('STOP') + monkeypatch.setattr(Conf, "SAVE_LIMIT", 1) + result_queue.put("STOP") # run monitor monitor(result_queue) assert Success.objects.count() == Conf.SAVE_LIMIT @@ -375,13 +445,15 @@ def test_max_rss(broker, monkeypatch): @pytest.mark.django_db def test_bad_secret(broker, monkeypatch): - broker.list_key = 'test_bad_secret:q' - async_task('math.copysign', 1, -1, broker=broker) + broker.list_key = "test_bad_secret:q" + async_task("math.copysign", 1, -1, broker=broker) stop_event = Event() stop_event.set() start_event = Event() cluster_id = uuidlib.uuid4() - s = Sentinel(stop_event, start_event, cluster_id=cluster_id, broker=broker, start=False) + s = Sentinel( + stop_event, start_event, cluster_id=cluster_id, broker=broker, start=False + ) Stat(s).save() # change the SECRET monkeypatch.setattr(Conf, "SECRET_KEY", "OOPS") @@ -391,87 +463,94 @@ def test_bad_secret(broker, monkeypatch): task_queue = Queue() pusher(task_queue, stop_event, broker=broker) result_queue = Queue() - task_queue.put('STOP') - worker(task_queue, result_queue, Value('f', -1), ) + task_queue.put("STOP") + worker( + task_queue, + result_queue, + Value("f", -1), + ) assert result_queue.qsize() == 0 broker.delete_queue() @pytest.mark.django_db def test_attempt_count(broker, monkeypatch): - monkeypatch.setattr(Conf, 'MAX_ATTEMPTS', 3) + monkeypatch.setattr(Conf, "MAX_ATTEMPTS", 3) tag = uuid() - task = {'id': tag[1], - 'name': tag[0], - 'func': 'math.copysign', - 'args': (1, -1), - 'kwargs': {}, - 'started': timezone.now(), - 'stopped': timezone.now(), - 'success': False, - 'result': None} + task = { + "id": tag[1], + "name": tag[0], + "func": "math.copysign", + "args": (1, -1), + "kwargs": {}, + "started": timezone.now(), + "stopped": timezone.now(), + "success": False, + "result": None, + } # initial save - no success save_task(task, broker) - assert Task.objects.filter(id=task['id']).exists() - saved_task = Task.objects.get(id=task['id']) + assert Task.objects.filter(id=task["id"]).exists() + saved_task = Task.objects.get(id=task["id"]) assert saved_task.attempt_count == 1 sleep(0.5) # second save - old_stopped = task['stopped'] - task['stopped'] = timezone.now() + old_stopped = task["stopped"] + task["stopped"] = timezone.now() save_task(task, broker) - saved_task = Task.objects.get(id=task['id']) + saved_task = Task.objects.get(id=task["id"]) assert saved_task.attempt_count == 2 # third save - - task['stopped'] = timezone.now() + task["stopped"] = timezone.now() save_task(task, broker) - saved_task = Task.objects.get(id=task['id']) + saved_task = Task.objects.get(id=task["id"]) assert saved_task.attempt_count == 3 # task should be removed from queue assert broker.queue_size() == 0 - @pytest.mark.django_db def test_update_failed(broker): tag = uuid() - task = {'id': tag[1], - 'name': tag[0], - 'func': 'math.copysign', - 'args': (1, -1), - 'kwargs': {}, - 'started': timezone.now(), - 'stopped': timezone.now(), - 'success': False, - 'result': None} + task = { + "id": tag[1], + "name": tag[0], + "func": "math.copysign", + "args": (1, -1), + "kwargs": {}, + "started": timezone.now(), + "stopped": timezone.now(), + "success": False, + "result": None, + } # initial save - no success save_task(task, broker) - assert Task.objects.filter(id=task['id']).exists() - saved_task = Task.objects.get(id=task['id']) + assert Task.objects.filter(id=task["id"]).exists() + saved_task = Task.objects.get(id=task["id"]) assert saved_task.success is False sleep(0.5) # second save - no success - old_stopped = task['stopped'] - task['stopped'] = timezone.now() + old_stopped = task["stopped"] + task["stopped"] = timezone.now() save_task(task, broker) - saved_task = Task.objects.get(id=task['id']) + saved_task = Task.objects.get(id=task["id"]) assert saved_task.stopped > old_stopped # third save - success - task['stopped'] = timezone.now() - task['result'] = 'result' - task['success'] = True + task["stopped"] = timezone.now() + task["result"] = "result" + task["success"] = True save_task(task, broker) - saved_task = Task.objects.get(id=task['id']) + saved_task = Task.objects.get(id=task["id"]) assert saved_task.success is True # fourth save - no success - task['result'] = None - task['success'] = False - task['stopped'] = old_stopped + task["result"] = None + task["success"] = False + task["stopped"] = old_stopped save_task(task, broker) # should not overwrite success - saved_task = Task.objects.get(id=task['id']) + saved_task = Task.objects.get(id=task["id"]) assert saved_task.success is True - assert saved_task.result == 'result' + assert saved_task.result == "result" @pytest.mark.django_db @@ -486,47 +565,130 @@ def acknowledge(self, task_id): self.acknowledgements[task_id] = count + 1 tag = uuid() - task_fail_ack = {'id': tag[1], - 'name': tag[0], - 'ack_id': 'test_fail_ack_id', - 'ack_failure': True, - 'func': 'math.copysign', - 'args': (1, -1), - 'kwargs': {}, - 'started': timezone.now(), - 'stopped': timezone.now(), - 'success': False, - 'result': None} + task_fail_ack = { + "id": tag[1], + "name": tag[0], + "ack_id": "test_fail_ack_id", + "ack_failure": True, + "func": "math.copysign", + "args": (1, -1), + "kwargs": {}, + "started": timezone.now(), + "stopped": timezone.now(), + "success": False, + "result": None, + } tag = uuid() task_fail_no_ack = task_fail_ack.copy() - task_fail_no_ack.update({'id': tag[1], - 'name': tag[0], - 'ack_id': 'test_fail_no_ack_id'}) - del task_fail_no_ack['ack_failure'] + task_fail_no_ack.update( + {"id": tag[1], "name": tag[0], "ack_id": "test_fail_no_ack_id"} + ) + del task_fail_no_ack["ack_failure"] tag = uuid() task_success_ack = task_fail_ack.copy() - task_success_ack.update({ - 'id': tag[1], - 'name': tag[0], - 'ack_id': 'test_success_ack_id', - 'success': True, - }) - del task_success_ack['ack_failure'] + task_success_ack.update( + { + "id": tag[1], + "name": tag[0], + "ack_id": "test_success_ack_id", + "success": True, + } + ) + del task_success_ack["ack_failure"] result_queue = Queue() result_queue.put(task_fail_ack) result_queue.put(task_fail_no_ack) result_queue.put(task_success_ack) - result_queue.put('STOP') - broker = VerifyAckMockBroker(list_key='key') + result_queue.put("STOP") + broker = VerifyAckMockBroker(list_key="key") monitor(result_queue, broker) - assert broker.acknowledgements.get('test_fail_ack_id') == 1 - assert broker.acknowledgements.get('test_fail_no_ack_id') is None - assert broker.acknowledgements.get('test_success_ack_id') == 1 + assert broker.acknowledgements.get("test_fail_ack_id") == 1 + assert broker.acknowledgements.get("test_fail_no_ack_id") is None + assert broker.acknowledgements.get("test_success_ack_id") == 1 + + +class TestSignals: + @pytest.mark.django_db + def test_pre_enqueue_signal(self, broker): + broker.list_key = "pre_enqueue_test:q" + broker.delete_queue() + self.signal_was_called: bool = False + self.task: Optional[dict] = None + + def handler(sender, task, **kwargs): + self.signal_was_called = True + self.task = task + + pre_enqueue.connect(handler) + task_id = async_task("math.copysign", 1, -1, broker=broker) + assert self.signal_was_called is True + assert self.task.get("id") == task_id + pre_enqueue.disconnect(handler) + broker.delete_queue() + + @pytest.mark.django_db + def test_pre_execute_signal(self, broker): + broker.list_key = "pre_execute_test:q" + broker.delete_queue() + self.signal_was_called: bool = False + self.task: Optional[dict] = None + self.func = None + + def handler(sender, task, func, **kwargs): + self.signal_was_called = True + self.task = task + self.func = func + + pre_execute.connect(handler) + task_id = async_task("math.copysign", 1, -1, broker=broker) + task_queue = Queue() + result_queue = Queue() + event = Event() + event.set() + pusher(task_queue, event, broker=broker) + task_queue.put("STOP") + worker(task_queue, result_queue, Value("f", -1)) + result_queue.put("STOP") + monitor(result_queue, broker) + broker.delete_queue() + assert self.signal_was_called is True + assert self.task.get("id") == task_id + assert self.func == copysign + pre_execute.disconnect(handler) + + @pytest.mark.django_db + def test_post_execute_signal(self, broker): + broker.list_key = "post_execute_test:q" + broker.delete_queue() + self.signal_was_called: bool = False + self.task: Optional[dict] = None + self.func = None + + def handler(sender, task, **kwargs): + self.signal_was_called = True + self.task = task + + post_execute.connect(handler) + task_id = async_task("math.copysign", 1, -1, broker=broker) + task_queue = Queue() + result_queue = Queue() + event = Event() + event.set() + pusher(task_queue, event, broker=broker) + task_queue.put("STOP") + worker(task_queue, result_queue, Value("f", -1)) + result_queue.put("STOP") + monitor(result_queue, broker) + broker.delete_queue() + assert self.signal_was_called is True + assert self.task.get("id") == task_id + assert self.task.get("result") == -1 + post_execute.disconnect(handler) @pytest.mark.django_db diff --git a/django_q/tests/test_commands.py b/django_q/tests/test_commands.py index e64a65b6..4308bf2c 100644 --- a/django_q/tests/test_commands.py +++ b/django_q/tests/test_commands.py @@ -4,16 +4,22 @@ @pytest.mark.django_db def test_qcluster(): - call_command('qcluster', run_once=True) + call_command("qcluster", run_once=True) @pytest.mark.django_db def test_qmonitor(): - call_command('qmonitor', run_once=True) + call_command("qmonitor", run_once=True) @pytest.mark.django_db def test_qinfo(): - call_command('qinfo') - call_command('qinfo', config=True) - call_command('qinfo', ids=True) + call_command("qinfo") + call_command("qinfo", config=True) + call_command("qinfo", ids=True) + + +@pytest.mark.django_db +def test_qmemory(): + call_command("qmemory", run_once=True) + call_command("qmemory", workers=True, run_once=True) diff --git a/django_q/tests/test_monitor.py b/django_q/tests/test_monitor.py index 25a5dd0a..a7a7980b 100644 --- a/django_q/tests/test_monitor.py +++ b/django_q/tests/test_monitor.py @@ -1,12 +1,13 @@ -import pytest import uuid -from django_q.tasks import async_task +import pytest + from django_q.brokers import get_broker from django_q.cluster import Cluster -from django_q.monitor import monitor, info, get_ids -from django_q.status import Stat from django_q.conf import Conf +from django_q.monitor import get_ids, info, monitor +from django_q.status import Stat +from django_q.tasks import async_task @pytest.mark.django_db @@ -26,11 +27,11 @@ def test_monitor(monkeypatch): assert stat.uptime() > 0 assert stat.empty_queues() is True break - assert found_c is True + assert found_c # test lock size - monkeypatch.setattr(Conf, 'ORM', 'default') - b = get_broker('monitor_test') - b.enqueue('test') + monkeypatch.setattr(Conf, "ORM", "default") + b = get_broker("monitor_test") + b.enqueue("test") b.dequeue() assert b.lock_size() == 1 monitor(run_once=True, broker=b) @@ -48,4 +49,4 @@ def test_info(): def do_sync(): - async_task('django_q.tests.tasks.countdown', 1, sync=True, save=True) + async_task("django_q.tests.tasks.countdown", 1, sync=True, save=True) diff --git a/django_q/tests/test_scheduler.py b/django_q/tests/test_scheduler.py index 851c395d..8be35ead 100644 --- a/django_q/tests/test_scheduler.py +++ b/django_q/tests/test_scheduler.py @@ -1,44 +1,110 @@ +import os from datetime import timedelta from multiprocessing import Event, Value +from unittest import mock import arrow import pytest from django.core.exceptions import ValidationError from django.db import IntegrityError +from django.test import override_settings from django.utils import timezone +from django.utils.timezone import is_naive -from django_q.brokers import get_broker -from django_q.cluster import pusher, worker, monitor, scheduler +from django_q.brokers import Broker, get_broker +from django_q.cluster import monitor, pusher, scheduler, worker, localtime from django_q.conf import Conf from django_q.queues import Queue -from django_q.tasks import Schedule, fetch, schedule as create_schedule +from django_q.tasks import Schedule, fetch +from django_q.tasks import schedule as create_schedule +from django_q.tests.settings import BASE_DIR +from django_q.tests.testing_utilities.multiple_database_routers import ( + TestingMultipleAppsDatabaseRouter, + TestingReplicaDatabaseRouter, +) @pytest.fixture -def broker(monkeypatch): - monkeypatch.setattr(Conf, 'DJANGO_REDIS', 'default') +def broker(monkeypatch) -> Broker: + """Patches the Conf object setting the DJANGO_REDIS attribute allowing a default redis configuration.""" + monkeypatch.setattr(Conf, "DJANGO_REDIS", "default") return get_broker() +@pytest.fixture +def orm_broker(monkeypatch) -> None: + """Patches the Conf object setting the ORM attribute to a database named default.""" + monkeypatch.setattr(Conf, "ORM", "default") + + +@pytest.fixture +def orm_no_replica_broker(orm_broker, monkeypatch) -> Broker: + """Generates a Broker with a disabled read replica database configuration.""" + monkeypatch.setattr(Conf, "HAS_REPLICA", False) + return get_broker(list_key="scheduler_test:q") + + +@pytest.fixture +def orm_replica_broker(orm_broker, monkeypatch) -> Broker: + """Generates a Broker with read replica database configuration.""" + monkeypatch.setattr(Conf, "HAS_REPLICA", True) + return get_broker(list_key="scheduler_test:q") + + +REPLICA_DATABASE_ROUTERS = [ + f"{TestingReplicaDatabaseRouter.__module__}.{TestingReplicaDatabaseRouter.__name__}" +] +REPLICA_DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": os.path.join(BASE_DIR, "db.sqlite3"), + }, + "replica": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": os.path.join(BASE_DIR, "db.sqlite3"), + }, +} + +MULTIPLE_APPS_DATABASE_ROUTERS = [ + f"{TestingMultipleAppsDatabaseRouter.__module__}.{TestingMultipleAppsDatabaseRouter.__name__}" +] +MULTIPLE_APPS_DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": os.path.join(BASE_DIR, "db.sqlite3"), + }, + "admin": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": os.path.join(BASE_DIR, "db.sqlite3"), + }, +} + + @pytest.mark.django_db def test_scheduler(broker, monkeypatch): - broker.list_key = 'scheduler_test:q' + broker.list_key = "scheduler_test:q" broker.delete_queue() - schedule = create_schedule('math.copysign', - 1, -1, - name='test math', - hook='django_q.tests.tasks.result', - schedule_type=Schedule.HOURLY, - repeats=1) + schedule = create_schedule( + "math.copysign", + 1, + -1, + name="test math", + hook="django_q.tests.tasks.result", + schedule_type=Schedule.HOURLY, + repeats=1, + ) assert schedule.last_run() is None # check duplicate constraint with pytest.raises(IntegrityError): - schedule = create_schedule('math.copysign', - 1, -1, - name='test math', - hook='django_q.tests.tasks.result', - schedule_type=Schedule.HOURLY, - repeats=1) + schedule = create_schedule( + "math.copysign", + 1, + -1, + name="test math", + hook="django_q.tests.tasks.result", + schedule_type=Schedule.HOURLY, + repeats=1, + ) # run scheduler scheduler(broker=broker) # set up the workflow @@ -49,12 +115,12 @@ def test_scheduler(broker, monkeypatch): pusher(task_queue, stop_event, broker=broker) assert task_queue.qsize() == 1 assert broker.queue_size() == 0 - task_queue.put('STOP') + task_queue.put("STOP") # let a worker handle them result_queue = Queue() - worker(task_queue, result_queue, Value('b', -1)) + worker(task_queue, result_queue, Value("b", -1)) assert result_queue.qsize() == 1 - result_queue.put('STOP') + result_queue.put("STOP") # store the results monitor(result_queue) assert result_queue.qsize() == 0 @@ -68,86 +134,211 @@ def test_scheduler(broker, monkeypatch): assert task.success is True assert task.result < 0 # Once schedule with delete - once_schedule = create_schedule('django_q.tests.tasks.word_multiply', - 2, - word='django', - schedule_type=Schedule.ONCE, - repeats=-1, - hook='django_q.tests.tasks.result' - ) - assert hasattr(once_schedule, 'pk') is True + once_schedule = create_schedule( + "django_q.tests.tasks.word_multiply", + 2, + word="django", + schedule_type=Schedule.ONCE, + repeats=-1, + hook="django_q.tests.tasks.result", + ) + assert hasattr(once_schedule, "pk") is True # negative repeats - always_schedule = create_schedule('django_q.tests.tasks.word_multiply', - 2, - word='django', - schedule_type=Schedule.DAILY, - repeats=-1, - hook='django_q.tests.tasks.result' - ) - assert hasattr(always_schedule, 'pk') is True + always_schedule = create_schedule( + "django_q.tests.tasks.word_multiply", + 2, + word="django", + schedule_type=Schedule.DAILY, + repeats=-1, + hook="django_q.tests.tasks.result", + ) + assert hasattr(always_schedule, "pk") is True # Minute schedule - minute_schedule = create_schedule('django_q.tests.tasks.word_multiply', - 2, - word='django', - schedule_type=Schedule.MINUTES, - minutes=10) - assert hasattr(minute_schedule, 'pk') is True + minute_schedule = create_schedule( + "django_q.tests.tasks.word_multiply", + 2, + word="django", + schedule_type=Schedule.MINUTES, + minutes=10, + ) + assert hasattr(minute_schedule, "pk") is True # Cron schedule - cron_schedule = create_schedule('django_q.tests.tasks.word_multiply', - 2, - word='django', - schedule_type=Schedule.CRON, - cron="0 22 * * 1-5") - assert hasattr(cron_schedule, 'pk') is True + cron_schedule = create_schedule( + "django_q.tests.tasks.word_multiply", + 2, + word="django", + schedule_type=Schedule.CRON, + cron="0 22 * * 1-5", + ) + assert hasattr(cron_schedule, "pk") is True assert cron_schedule.full_clean() is None - assert cron_schedule.__str__() == 'django_q.tests.tasks.word_multiply' + assert cron_schedule.__str__() == "django_q.tests.tasks.word_multiply" with pytest.raises(ValidationError): - create_schedule('django_q.tests.tasks.word_multiply', - 2, - word='django', - schedule_type=Schedule.CRON, - cron="0 22 * * 1-12") + create_schedule( + "django_q.tests.tasks.word_multiply", + 2, + word="django", + schedule_type=Schedule.CRON, + cron="0 22 * * 1-12", + ) # All other types for t in Schedule.TYPE: if t[0] == Schedule.CRON: continue - schedule = create_schedule('django_q.tests.tasks.word_multiply', - 2, - word='django', - schedule_type=t[0], - repeats=1, - hook='django_q.tests.tasks.result' - ) + schedule = create_schedule( + "django_q.tests.tasks.word_multiply", + 2, + word="django", + schedule_type=t[0], + repeats=1, + hook="django_q.tests.tasks.result", + ) assert schedule is not None assert schedule.last_run() is None scheduler(broker=broker) # via model - Schedule.objects.create(func='django_q.tests.tasks.word_multiply', - args='2', - kwargs='word="django"', - schedule_type=Schedule.DAILY - ) + Schedule.objects.create( + func="django_q.tests.tasks.word_multiply", + args="2", + kwargs='word="django"', + schedule_type=Schedule.DAILY, + ) # scheduler scheduler(broker=broker) # ONCE schedule should be deleted assert Schedule.objects.filter(pk=once_schedule.pk).exists() is False # Catch up On - monkeypatch.setattr(Conf, 'CATCH_UP', True) + monkeypatch.setattr(Conf, "CATCH_UP", True) now = timezone.now() - schedule = create_schedule('django_q.tests.tasks.word_multiply', - 2, - word='catch_up', - schedule_type=Schedule.HOURLY, - next_run=timezone.now() - timedelta(hours=12), - repeats=-1 - ) + schedule = create_schedule( + "django_q.tests.tasks.word_multiply", + 2, + word="catch_up", + schedule_type=Schedule.HOURLY, + next_run=timezone.now() - timedelta(hours=12), + repeats=-1, + ) scheduler(broker=broker) schedule = Schedule.objects.get(pk=schedule.pk) assert schedule.next_run < now # Catch up off - monkeypatch.setattr(Conf, 'CATCH_UP', False) + monkeypatch.setattr(Conf, "CATCH_UP", False) scheduler(broker=broker) schedule = Schedule.objects.get(pk=schedule.pk) assert schedule.next_run > now # Done broker.delete_queue() + + monkeypatch.setattr(Conf, "PREFIX", "some_cluster_name") + # create a schedule on another cluster + schedule = create_schedule( + "math.copysign", + 1, + -1, + name="test schedule on a another cluster", + hook="django_q.tests.tasks.result", + schedule_type=Schedule.HOURLY, + cluster="some_other_cluster_name", + repeats=1, + ) + # run scheduler + scheduler(broker=broker) + # set up the workflow + task_queue = Queue() + stop_event = Event() + stop_event.set() + # push it + pusher(task_queue, stop_event, broker=broker) + + # queue must be empty + assert task_queue.qsize() == 0 + + monkeypatch.setattr(Conf, "PREFIX", "default") + # create a schedule on the same cluster + schedule = create_schedule( + "math.copysign", + 1, + -1, + name="test schedule with no cluster", + hook="django_q.tests.tasks.result", + schedule_type=Schedule.HOURLY, + cluster="default", + repeats=1, + ) + # run scheduler + scheduler(broker=broker) + # set up the workflow + task_queue = Queue() + stop_event = Event() + stop_event.set() + # push it + pusher(task_queue, stop_event, broker=broker) + + # queue must contain a task + assert task_queue.qsize() == 1 + + +@override_settings( + DATABASE_ROUTERS=REPLICA_DATABASE_ROUTERS, DATABASES=REPLICA_DATABASES +) +@pytest.mark.django_db +def test_scheduler_atomic_transaction_must_specify_a_database_when_no_replicas_are_used( + orm_no_replica_broker: Broker, +): + """ + GIVEN a environment without a read replica database + WHEN the scheduler is called + THEN the transaction atomic must be called using the configured database in the Conf.ORM settings. + """ + broker = orm_no_replica_broker + with mock.patch("django_q.cluster.db") as mocked_db: + scheduler(broker=broker) + # The router should correctly set the database to use! + mocked_db.transaction.atomic.assert_called_with(using=broker.connection.db) + + +@override_settings( + DATABASE_ROUTERS=REPLICA_DATABASE_ROUTERS, DATABASES=REPLICA_DATABASES +) +@pytest.mark.django_db +def test_scheduler_atomic_transaction_must_specify_no_database_when_read_write_replicas_are_used( + orm_replica_broker: Broker, +): + """ + GIVEN a environment with a read/write configured replica database + WHEN the scheduler is called + THEN the transaction must be called without a specific database, thus letting the database router pick. + """ + with mock.patch("django_q.cluster.db") as mocked_db: + scheduler(broker=orm_replica_broker) + # No specific databases should be set here, this is the job of the router! + mocked_db.transaction.atomic.assert_called_with() + + +@override_settings( + DATABASE_ROUTERS=MULTIPLE_APPS_DATABASE_ROUTERS, DATABASES=MULTIPLE_APPS_DATABASES +) +@pytest.mark.django_db +def test_scheduler_atomic_transaction_must_specify_the_database_based_on_router_redirection( + orm_no_replica_broker: Broker, +): + """ + GIVEN a environment without a read replica database + WHEN the scheduler is called + THEN the transaction atomic must be called using the configured database in the Conf.ORM settings. + """ + broker = orm_no_replica_broker + with mock.patch("django_q.cluster.db") as mocked_db: + scheduler(broker=broker) + # The router should correctly set the database to use! + assert broker.connection.db == "default" + mocked_db.transaction.atomic.assert_called_with(using=broker.connection.db) + + +def test_localtime(): + assert not is_naive(localtime()) + + +@override_settings(USE_TZ=False) +def test_naive_localtime(): + assert is_naive(localtime()) diff --git a/django_q/tests/testing_utilities/__init__.py b/django_q/tests/testing_utilities/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/django_q/tests/testing_utilities/multiple_database_routers.py b/django_q/tests/testing_utilities/multiple_database_routers.py new file mode 100644 index 00000000..4958771a --- /dev/null +++ b/django_q/tests/testing_utilities/multiple_database_routers.py @@ -0,0 +1,38 @@ +class TestingReplicaDatabaseRouter: + """ + A router to control all database operations on models in the + auth application. + """ + + def db_for_read(self, model, **hints): + """ + Allows read access from REPLICA database. + """ + return "replica" + + def db_for_write(self, model, **hints): + """ + Always write to DEFAULT database + """ + return "default" + + +class TestingMultipleAppsDatabaseRouter: + """ + A router to control all database operations on models in the + auth application. + """ + + @staticmethod + def is_admin(model): + return model._meta.app_label in ["admin"] + + def db_for_read(self, model, **hints): + if self.is_admin(model): + return "admin" + return "default" + + def db_for_write(self, model, **hints): + if self.is_admin(model): + return "admin" + return "default" diff --git a/django_q/tests/urls.py b/django_q/tests/urls.py index ede2ec91..29eb7af3 100644 --- a/django_q/tests/urls.py +++ b/django_q/tests/urls.py @@ -1,6 +1,6 @@ -from django.conf.urls import url from django.contrib import admin +from django.urls import re_path urlpatterns = [ - url(r'^admin/', admin.site.urls), + re_path(r"^admin/", admin.site.urls), ] diff --git a/docs/conf.py b/docs/conf.py index 7519f70f..9f63e076 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -13,8 +13,8 @@ # All configuration values have a default; values that are commented out # serve to show the default. -import sys import os +import sys import alabaster @@ -43,7 +43,7 @@ # 'sphinx.ext.autodoc' ] -intersphinx_mapping = {'python': ('https://docs.python.org/3.5', None), +intersphinx_mapping = {'python': ('https://docs.python.org/3.8', None), 'django': ('https://docs.djangoproject.com/en/2.2/', 'https://docs.djangoproject.com/en/2.2/_objects/')} @@ -63,7 +63,7 @@ # General information about the project. project = 'Django Q' -copyright = '2015-2020, Ilan Steemers' +copyright = '2015-2021, Ilan Steemers' author = 'Ilan Steemers' # The version info for the project you're documenting, acts as replacement for @@ -73,7 +73,7 @@ # The short X.Y version. version = '1.3' # The full version, including alpha/beta/rc tags. -release = '1.3.4' +release = '1.3.9' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/docs/configure.rst b/docs/configure.rst index 38bdf0ce..14dda2d0 100644 --- a/docs/configure.rst +++ b/docs/configure.rst @@ -25,6 +25,8 @@ Configuration is handled via the ``Q_CLUSTER`` dictionary in your :file:`setting All configuration settings are optional: +.. _name: + name ~~~~ @@ -90,7 +92,7 @@ retry ~~~~~ The number of seconds a broker will wait for a cluster to finish a task, before it's presented again. -Only works with brokers that support delivery receipts. Defaults to 60 seconds. +Only works with brokers that support delivery receipts. Defaults to 60. The value must be bigger than the time it takes to complete longest task, i.e. :ref:`timeout` must be less than retry value and all tasks must complete in less time than the selected retry time. If this does not hold, i.e. the retry value is less than timeout or less than it takes to finish a task, @@ -337,6 +339,16 @@ Using the Django ORM backend will also enable the Queued Tasks table in the Admi If you need better performance , you should consider using a different database backend than the main project. Set ``orm`` to the name of that database connection and make sure you run migrations on it using the ``--database`` option. +When using the Django database as a message broker, you can set the ``has_replica`` boolean keyword to ensure Django-Q works properly letting a `Database Router `__. :: + + # example ORM broker connection with replica database + + Q_CLUSTER = { + ... + 'orm': 'default', + 'has_replica': True + } + .. _mongo_configuration: mongo diff --git a/docs/examples.rst b/docs/examples.rst index 62b0811b..455d4b8f 100644 --- a/docs/examples.rst +++ b/docs/examples.rst @@ -307,6 +307,86 @@ Alternatively the ``parzen_async()`` function can also be written with :func:`as return result(result_id, wait=10000, cached=True) + +Http Health Check +================= +An example of a python http server you can use (localhost:8080) to validate the health status of all the clusters in your environment. Example is http only. + +Requires cache to be enabled. Save file in your Django project's root directory and run with command: ``python worker_hc.py`` in your container or other environment. Can be customized to show whatever you'd like from the Stat class or modified as needed. + +.. code-block:: python + + from http.server import BaseHTTPRequestHandler, HTTPServer + from mtt_app.settings.base import EMAIL_USE_TLS + + import os + import django + + # Set the correct path to you settings module + os.environ.setdefault("DJANGO_SETTINGS_MODULE", "my.settings.path") + + # All django stuff has to come after the setup: + django.setup() + + from django_q.monitor import Stat + from django_q.conf import Conf + + # Set host and port settings + hostName = "localhost" + serverPort = 8080 + + + class HealthCheckServer(BaseHTTPRequestHandler): + def do_GET(self): + + # Count the clusters and their status + happy_clusters = 0 + total_clusters = 0 + + for stat in Stat.get_all(): + total_clusters += 1 + if stat.status in [Conf.IDLE, Conf.WORKING]: + happy_clusters += 1 + + # Return 200 response if there is at least 1 cluster running, + # and make sure all running clusters are happy + if total_clusters and happy_clusters == total_clusters: + response_code = 200 + else: + response_code = 500 + + self.send_response(response_code) + self.send_header("Content-type", "text/html") + self.end_headers() + + self.wfile.write( + bytes("Django-Q Heath Check", "utf-8") + ) + self.wfile.write( + bytes(f"

Health check returned {response_code} response

", "utf-8") + ) + self.wfile.write( + bytes( + f"

{happy_clusters} of {total_clusters} cluster(s) are happy

", + "utf-8", + ) + ) + + + if __name__ == "__main__": + webServer = HTTPServer((hostName, serverPort), HealthCheckServer) + print("Server started at http://%s:%s" % (hostName, serverPort)) + + try: + webServer.serve_forever() + except KeyboardInterrupt: + pass + + webServer.server_close() + print("Server stopped.") + + + .. note:: If you have an example you want to share, please submit a pull request on `github `__. diff --git a/docs/index.rst b/docs/index.rst index c763f602..865d7288 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -24,8 +24,9 @@ Features - Rollbar and Sentry support -Django Q is tested with: Python 3.7 and 3.8, Django 2.2.x and 3.1.x +Django Q is tested with: Python 3.7 and 3.8, Django 2.2.x and 3.2.x +Currently available in English, German and French. Contents: diff --git a/docs/install.rst b/docs/install.rst index 78d4aeab..b1e274af 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -27,12 +27,12 @@ Installation Requirements ------------ -Django Q is tested for Python 3.7 and 3.8 +Django Q is tested for Python 3.7, 3.8 and 3.9 - `Django `__ Django Q aims to use as much of Django's standard offerings as possible - The code is tested against Django versions `2.2.x` and `3.1.x`. + The code is tested against Django versions `2.2.x` and `3.2.x`. Please note that Django versions below 2.0 do not support Python 3.7 - `Django-picklefield `__ diff --git a/docs/schedules.rst b/docs/schedules.rst index 9d4e5fe7..a8ad4e16 100644 --- a/docs/schedules.rst +++ b/docs/schedules.rst @@ -28,10 +28,11 @@ You can manage them through the :ref:`admin_page` or directly from your code wit ) # In case you want to use q_options + # Specify the broker by using the property broker_name in q_options schedule('math.sqrt', 9, hook='hooks.print_result', - q_options={'timeout': 30}, + q_options={'timeout': 30, 'broker_name': 'broker_1'}, schedule_type=Schedule.HOURLY) # Run a schedule every 5 minutes, starting at 6 today @@ -52,6 +53,12 @@ You can manage them through the :ref:`admin_page` or directly from your code wit cron = '0 22 * * 1-5') + # Restrain a schedule to a specific cluster + schedule('math.hypot', + 3, 4, + schedule_type=Schedule.DAILY, + cluster='my_cluster') + Missed schedules ---------------- @@ -115,8 +122,14 @@ Reference :param str cron: Cron expression for the Cron type. :param int repeats: Number of times to repeat schedule. -1=Always, 0=Never, n =n. :param datetime next_run: Next or first scheduled execution datetime. + :param str cluster: optional cluster name. Task will be executed only on a cluster with a matching :ref:`name`. :param dict q_options: options passed to async_task for this schedule :param kwargs: optional keyword arguments for the scheduled function. + + .. note:: + + q_options does not accept the 'broker' key with a broker instance but accepts a 'broker_name' key instead. This can be used to specify the broker connection name to assign the task. If a broker with the specified name does not exist or is not running at the moment of placing the task in queue it fallbacks to the random broker/queue that handled the schedule. + .. class:: Schedule @@ -169,6 +182,10 @@ Reference Number of times to repeat the schedule. -1=Always, 0=Never, n =n. When set to -1, this will keep counting down. + .. py:attribute:: cluster + + Task will be executed only on a cluster with a matching :ref:`name`. + .. py:attribute:: next_run Datetime of the next scheduled execution. diff --git a/docs/signals.rst b/docs/signals.rst index 41ad08c5..7d270415 100644 --- a/docs/signals.rst +++ b/docs/signals.rst @@ -24,20 +24,31 @@ executed by a worker. This signal provides two arguments: with a function path, this argument will be the callable function nonetheless. +After executing a task +"""""""""""""""""""""" +The ``django_q.signals.post_execute`` signal is emitted after a task is +executed by a worker and processed by the monitor. It included the ``task`` dictionary with the result. + + Subscribing to a signal ----------------------- -Connecting to a Django Q signal is done in the same manner as any other Django +Connecting to a Django Q signal is done the same as any other Django signal:: from django.dispatch import receiver - from django_q.signals import pre_enqueue, pre_execute + from django_q.signals import pre_enqueue, pre_execute, post_execute @receiver(pre_enqueue) def my_pre_enqueue_callback(sender, task, **kwargs): - print("Task {} will be enqueued".format(task["name"])) + print(f"Task {task['name']} will be queued") @receiver(pre_execute) def my_pre_execute_callback(sender, func, task, **kwargs): - print("Task {} will be executed by calling {}".format( - task["name"], func)) + print(f"Task {task['name']} will be executed by calling {func}") + + @receiver(post_execute) + def my_post_execute_callback(sender, task, **kwargs): + print(f"Task {task['name']} was executed with result {task['result']}") + + diff --git a/poetry.lock b/poetry.lock index 804a7d2d..f41d380a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,161 +1,244 @@ [[package]] -category = "main" -description = "Python wrapper for loading Jason Hood's ANSICON" -marker = "platform_system == \"Windows\"" -name = "ansicon" +name = "alabaster" +version = "0.7.12" +description = "A configurable sidebar-enabled Sphinx theme" +category = "dev" optional = false python-versions = "*" -version = "1.89.0" [[package]] +name = "ansicon" +version = "1.89.0" +description = "Python wrapper for loading Jason Hood's ANSICON" category = "main" -description = "Better dates & times for Python" +optional = false +python-versions = "*" + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = "*" + +[[package]] name = "arrow" +version = "1.1.1" +description = "Better dates & times for Python" +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.15.8" +python-versions = ">=3.6" [package.dependencies] -python-dateutil = "*" +python-dateutil = ">=2.7.0" +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [[package]] -category = "main" -description = "ASGI specs, helper code, and adapters" name = "asgiref" +version = "3.3.4" +description = "ASGI specs, helper code, and adapters" +category = "main" optional = false -python-versions = ">=3.5" -version = "3.2.10" +python-versions = ">=3.6" + +[package.dependencies] +typing-extensions = {version = "*", markers = "python_version < \"3.8\""} [package.extras] -tests = ["pytest", "pytest-asyncio"] +tests = ["pytest", "pytest-asyncio", "mypy (>=0.800)"] [[package]] -category = "dev" -description = "Atomic file writes." -marker = "sys_platform == \"win32\"" name = "atomicwrites" +version = "1.4.0" +description = "Atomic file writes." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.4.0" [[package]] -category = "dev" -description = "Classes Without Boilerplate" name = "attrs" +version = "21.2.0" +description = "Classes Without Boilerplate" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.extras] +dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] +docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] +tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] +tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] + +[[package]] +name = "babel" +version = "2.9.1" +description = "Internationalization utilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "19.3.0" + +[package.dependencies] +pytz = ">=2015.7" + +[[package]] +name = "black" +version = "21.6b0" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6.2" + +[package.dependencies] +appdirs = "*" +click = ">=7.1.2" +dataclasses = {version = ">=0.6", markers = "python_version < \"3.7\""} +mypy-extensions = ">=0.4.3" +pathspec = ">=0.8.1,<1" +regex = ">=2020.1.8" +toml = ">=0.10.1" +typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\""} +typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} [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"] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +python2 = ["typed-ast (>=1.4.2)"] +uvloop = ["uvloop (>=0.15.2)"] [[package]] -category = "main" -description = "Easy, practical library for making terminal apps, by providing an elegant, well-documented interface to Colors, Keyboard input, and screen Positioning capabilities." name = "blessed" +version = "1.18.1" +description = "Easy, practical library for making terminal apps, by providing an elegant, well-documented interface to Colors, Keyboard input, and screen Positioning capabilities." +category = "main" optional = false -python-versions = "*" -version = "1.17.9" +python-versions = ">=2.7" [package.dependencies] -jinxed = ">=0.5.4" +jinxed = {version = ">=0.5.4", markers = "platform_system == \"Windows\""} six = ">=1.9.0" wcwidth = ">=0.1.4" [[package]] -category = "main" -description = "The AWS SDK for Python" name = "boto3" +version = "1.17.101" +description = "The AWS SDK for Python" +category = "main" optional = true -python-versions = "*" -version = "1.14.43" +python-versions = ">= 2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.dependencies] -botocore = ">=1.17.43,<1.18.0" +botocore = ">=1.20.101,<1.21.0" jmespath = ">=0.7.1,<1.0.0" -s3transfer = ">=0.3.0,<0.4.0" +s3transfer = ">=0.4.0,<0.5.0" [[package]] -category = "main" -description = "Low-level, data-driven core of boto 3." name = "botocore" +version = "1.20.101" +description = "Low-level, data-driven core of boto 3." +category = "main" optional = true -python-versions = "*" -version = "1.17.43" +python-versions = ">= 2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" [package.dependencies] -docutils = ">=0.10,<0.16" jmespath = ">=0.7.1,<1.0.0" python-dateutil = ">=2.1,<3.0.0" +urllib3 = ">=1.25.4,<1.27" -[package.dependencies.urllib3] -python = "<3.4.0 || >=3.5.0" -version = ">=1.20,<1.26" +[package.extras] +crt = ["awscrt (==0.11.24)"] [[package]] -category = "main" -description = "Python package for providing Mozilla's CA Bundle." name = "certifi" -optional = true +version = "2021.5.30" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false python-versions = "*" -version = "2020.6.20" [[package]] -category = "main" -description = "Universal encoding detector for Python 2 and 3" name = "chardet" -optional = true -python-versions = "*" -version = "3.0.4" +version = "4.0.0" +description = "Universal encoding detector for Python 2 and 3" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] +name = "click" +version = "8.0.1" +description = "Composable command line interface toolkit" category = "dev" -description = "Cross-platform colored terminal text." -marker = "sys_platform == \"win32\"" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} +importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} + +[[package]] name = "colorama" +version = "0.4.4" +description = "Cross-platform colored terminal text." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "0.4.3" [[package]] -category = "main" -description = "croniter provides iteration for datetime object with cron like format" +name = "coverage" +version = "5.5" +description = "Code coverage measurement for Python" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" + +[package.extras] +toml = ["toml"] + +[[package]] name = "croniter" +version = "0.3.37" +description = "croniter provides iteration for datetime object with cron like format" +category = "main" optional = true python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.3.34" [package.dependencies] natsort = "*" python-dateutil = "*" [[package]] -category = "main" -description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." +name = "dataclasses" +version = "0.8" +description = "A backport of the dataclasses module for Python 3.6" +category = "dev" +optional = false +python-versions = ">=3.6, <3.7" + +[[package]] name = "django" +version = "3.2.4" +description = "A high-level Python Web framework that encourages rapid development and clean, pragmatic design." +category = "main" optional = false python-versions = ">=3.6" -version = "3.1" [package.dependencies] -asgiref = ">=3.2.10,<3.3.0" +asgiref = ">=3.3.2,<4" pytz = "*" sqlparse = ">=0.2.2" [package.extras] -argon2 = ["argon2-cffi (>=16.1.0)"] +argon2 = ["argon2-cffi (>=19.1.0)"] bcrypt = ["bcrypt"] [[package]] -category = "main" -description = "Pickled object field for Django" name = "django-picklefield" +version = "3.0.1" +description = "Pickled object field for Django" +category = "main" optional = false python-versions = ">=3" -version = "3.0.1" [package.dependencies] Django = ">=2.2" @@ -164,190 +247,292 @@ Django = ">=2.2" tests = ["tox"] [[package]] -category = "main" -description = "A Rollbar support plugin for Django Q" name = "django-q-rollbar" +version = "0.1.3" +description = "A Rollbar support plugin for Django Q" +category = "main" optional = true -python-versions = "*" -version = "0.1.1" +python-versions = "^3.6" + +[package.dependencies] +rollbar = ">=0.14.0,<0.15.0" [[package]] -category = "main" -description = "A Sentry support plugin for Django Q" name = "django-q-sentry" +version = "0.1.5" +description = "A Sentry support plugin for Django Q" +category = "main" optional = true python-versions = "*" -version = "0.1.1" + +[package.dependencies] +sentry-sdk = ">=0.16.5" [[package]] -category = "main" -description = "Full featured redis cache backend for Django." name = "django-redis" +version = "4.12.1" +description = "Full featured redis cache backend for Django." +category = "main" optional = true python-versions = ">=3.5" -version = "4.12.1" [package.dependencies] Django = ">=2.2" redis = ">=3.0.0" [[package]] -category = "main" -description = "Docutils -- Python Documentation Utilities" +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +category = "dev" +optional = false +python-versions = "*" + +[[package]] name = "docutils" -optional = true -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "0.15.2" +version = "0.17.1" +description = "Docutils -- Python Documentation Utilities" +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" [[package]] -category = "main" -description = "Python wrapper for hiredis" name = "hiredis" +version = "1.1.0" +description = "Python wrapper for hiredis" +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.1.0" [[package]] -category = "main" -description = "Internationalized Domain Names in Applications (IDNA)" name = "idna" -optional = true -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "2.10" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" [[package]] +name = "imagesize" +version = "1.2.0" +description = "Getting image size from png/jpeg/jpeg2000/gif file" category = "dev" -description = "Read metadata from Python packages" -marker = "python_version < \"3.8\"" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" + +[[package]] name = "importlib-metadata" +version = "4.5.0" +description = "Read metadata from Python packages" +category = "dev" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" -version = "1.7.0" +python-versions = ">=3.6" [package.dependencies] +typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} zipp = ">=0.5" [package.extras] -docs = ["sphinx", "rst.linker"] -testing = ["packaging", "pep517", "importlib-resources (>=1.3)"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] [[package]] -category = "main" -description = "Universal classes and methods for Iron.io API wrappers to build on." name = "iron-core" +version = "1.2.0" +description = "Universal classes and methods for Iron.io API wrappers to build on." +category = "main" optional = true python-versions = "*" -version = "1.2.0" [package.dependencies] python-dateutil = "*" requests = ">=1.1.0" [[package]] -category = "main" -description = "Client library for IronMQ, a message queue in the cloud" name = "iron-mq" +version = "0.9" +description = "Client library for IronMQ, a message queue in the cloud" +category = "main" optional = true python-versions = "*" -version = "0.9" [package.dependencies] iron_core = "*" [[package]] -category = "main" -description = "Jinxed Terminal Library" -marker = "platform_system == \"Windows\"" +name = "isort" +version = "5.9.1" +description = "A Python utility / library to sort Python imports." +category = "dev" +optional = false +python-versions = ">=3.6.1,<4.0" + +[package.dependencies] +pip-api = {version = "*", optional = true, markers = "extra == \"requirements_deprecated_finder\""} +pipreqs = {version = "*", optional = true, markers = "extra == \"pipfile_deprecated_finder\" or extra == \"requirements_deprecated_finder\""} + +[package.extras] +pipfile_deprecated_finder = ["pipreqs", "requirementslib"] +requirements_deprecated_finder = ["pipreqs", "pip-api"] +colors = ["colorama (>=0.4.3,<0.5.0)"] +plugins = ["setuptools"] + +[[package]] +name = "jinja2" +version = "3.0.1" +description = "A very fast and expressive template engine." +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] name = "jinxed" +version = "1.1.0" +description = "Jinxed Terminal Library" +category = "main" optional = false python-versions = "*" -version = "1.0.1" [package.dependencies] -ansicon = "*" +ansicon = {version = "*", markers = "platform_system == \"Windows\""} [[package]] -category = "main" -description = "JSON Matching Expressions" name = "jmespath" +version = "0.10.0" +description = "JSON Matching Expressions" +category = "main" optional = true python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "0.10.0" [[package]] +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." category = "dev" -description = "More routines for operating on iterables, beyond itertools" +optional = false +python-versions = ">=3.6" + +[[package]] name = "more-itertools" +version = "8.8.0" +description = "More routines for operating on iterables, beyond itertools" +category = "dev" optional = false python-versions = ">=3.5" -version = "8.4.0" [[package]] -category = "main" -description = "Simple yet flexible natural sorting in Python." +name = "mypy-extensions" +version = "0.4.3" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = "*" + +[[package]] name = "natsort" +version = "7.1.1" +description = "Simple yet flexible natural sorting in Python." +category = "main" optional = true python-versions = ">=3.4" -version = "7.0.1" [package.extras] fast = ["fastnumbers (>=2.0.0)"] icu = ["PyICU (>=1.0.0)"] [[package]] -category = "dev" -description = "Core utilities for Python packages" name = "packaging" +version = "20.9" +description = "Core utilities for Python packages" +category = "dev" 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]] +name = "pathspec" +version = "0.8.1" +description = "Utility library for gitignore style pattern matching of file paths." category = "dev" -description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[[package]] +name = "pip-api" +version = "0.0.20" +description = "An unofficial, importable pip API" +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] +name = "pipreqs" +version = "0.4.10" +description = "Pip requirements.txt generator based on imports in project" +category = "dev" +optional = false +python-versions = "*" + +[package.dependencies] +docopt = "*" +yarg = "*" + +[[package]] name = "pluggy" +version = "0.13.1" +description = "plugin and hook calling mechanisms for python" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.13.1" [package.dependencies] -[package.dependencies.importlib-metadata] -python = "<3.8" -version = ">=0.12" +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} [package.extras] dev = ["pre-commit", "tox"] [[package]] -category = "main" -description = "Cross-platform lib for process and system monitoring in Python." name = "psutil" +version = "5.8.0" +description = "Cross-platform lib for process and system monitoring in Python." +category = "main" optional = true python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "5.7.2" [package.extras] test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] [[package]] -category = "dev" -description = "library with cross-python path, ini-parsing, io, code, log facilities" name = "py" +version = "1.10.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "1.9.0" [[package]] -category = "main" -description = "Python driver for MongoDB " +name = "pygments" +version = "2.9.0" +description = "Pygments is a syntax highlighting package written in Python." +category = "dev" +optional = false +python-versions = ">=3.5" + +[[package]] name = "pymongo" +version = "3.11.4" +description = "Python driver for MongoDB " +category = "main" optional = true -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -version = "3.11.0" +python-versions = "*" [package.extras] aws = ["pymongo-auth-aws (<2.0.0)"] @@ -360,46 +545,59 @@ tls = ["ipaddress"] zstd = ["zstandard"] [[package]] -category = "dev" -description = "Python parsing module" name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "dev" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -version = "2.4.7" [[package]] -category = "dev" -description = "pytest: simple powerful testing with Python" name = "pytest" +version = "5.4.3" +description = "pytest: simple powerful testing with Python" +category = "dev" optional = false python-versions = ">=3.5" -version = "5.4.3" [package.dependencies] -atomicwrites = ">=1.0" +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} attrs = ">=17.4.0" -colorama = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 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)"] +checkqa-mypy = ["mypy (==v0.761)"] testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] [[package]] +name = "pytest-cov" +version = "2.12.1" +description = "Pytest plugin for measuring coverage." category = "dev" -description = "A Django plugin for pytest." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" + +[package.dependencies] +coverage = ">=5.2.1" +pytest = ">=4.6" +toml = "*" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "six", "pytest-xdist", "virtualenv"] + +[[package]] name = "pytest-django" +version = "3.10.0" +description = "A Django plugin for pytest." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "3.9.0" [package.dependencies] pytest = ">=3.6" @@ -409,197 +607,473 @@ docs = ["sphinx", "sphinx-rtd-theme"] testing = ["django", "django-configurations (>=2.0)", "six"] [[package]] -category = "main" -description = "Extensions to the standard Python datetime module" name = "python-dateutil" +version = "2.8.1" +description = "Extensions to the standard Python datetime module" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -version = "2.8.1" [package.dependencies] six = ">=1.5" [[package]] -category = "main" -description = "World timezone definitions, modern and historical" name = "pytz" +version = "2021.1" +description = "World timezone definitions, modern and historical" +category = "main" optional = false python-versions = "*" -version = "2020.1" [[package]] -category = "main" -description = "Python client for Redis key-value store" name = "redis" +version = "3.5.3" +description = "Python client for Redis key-value store" +category = "main" optional = true python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "3.5.3" [package.extras] hiredis = ["hiredis (>=0.1.3)"] [[package]] -category = "main" -description = "Python HTTP for Humans." +name = "regex" +version = "2021.4.4" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = "*" + +[[package]] name = "requests" -optional = true +version = "2.25.1" +description = "Python HTTP for Humans." +category = "main" +optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.24.0" [package.dependencies] certifi = ">=2017.4.17" -chardet = ">=3.0.2,<4" +chardet = ">=3.0.2,<5" idna = ">=2.5,<3" -urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" +urllib3 = ">=1.21.1,<1.27" [package.extras] security = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7)", "win-inet-pton"] +socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] [[package]] +name = "rollbar" +version = "0.14.7" +description = "Easy and powerful exception tracking with Rollbar. Send messages and exceptions with arbitrary context, get back aggregates, and debug production issues quickly." category = "main" -description = "An Amazon S3 Transfer Manager" +optional = true +python-versions = "*" + +[package.dependencies] +requests = ">=0.12.1" +six = ">=1.9.0" + +[[package]] name = "s3transfer" +version = "0.4.2" +description = "An Amazon S3 Transfer Manager" +category = "main" optional = true python-versions = "*" -version = "0.3.3" [package.dependencies] botocore = ">=1.12.36,<2.0a.0" +[package.extras] +crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] + [[package]] +name = "sentry-sdk" +version = "1.1.0" +description = "Python client for Sentry (https://sentry.io)" category = "main" -description = "Python 2 and 3 compatibility utilities" +optional = true +python-versions = "*" + +[package.dependencies] +certifi = "*" +urllib3 = ">=1.10.0" + +[package.extras] +aiohttp = ["aiohttp (>=3.5)"] +beam = ["apache-beam (>=2.12)"] +bottle = ["bottle (>=0.12.13)"] +celery = ["celery (>=3)"] +chalice = ["chalice (>=1.16.0)"] +django = ["django (>=1.8)"] +falcon = ["falcon (>=1.4)"] +flask = ["flask (>=0.11)", "blinker (>=1.1)"] +pure_eval = ["pure-eval", "executing", "asttokens"] +pyspark = ["pyspark (>=2.4.4)"] +rq = ["rq (>=0.6)"] +sanic = ["sanic (>=0.8)"] +sqlalchemy = ["sqlalchemy (>=1.2)"] +tornado = ["tornado (>=5)"] + +[[package]] name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -version = "1.15.0" [[package]] -category = "main" -description = "Non-validating SQL parser" +name = "snowballstemmer" +version = "2.1.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +category = "dev" +optional = false +python-versions = "*" + +[[package]] +name = "sphinx" +version = "4.0.2" +description = "Python documentation generator" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.dependencies] +alabaster = ">=0.7,<0.8" +babel = ">=1.3" +colorama = {version = ">=0.3.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.14,<0.18" +imagesize = "*" +Jinja2 = ">=2.3" +packaging = "*" +Pygments = ">=2.0" +requests = ">=2.5.0" +snowballstemmer = ">=1.1" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = "*" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = "*" + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "isort", "mypy (>=0.800)", "docutils-stubs"] +test = ["pytest", "pytest-cov", "html5lib", "cython", "typed-ast"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.2" +description = "sphinxcontrib-applehelp is a sphinx extension which outputs Apple help books" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.2" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp document." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.0" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +category = "dev" +optional = false +python-versions = ">=3.6" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest", "html5lib"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +test = ["pytest", "flake8", "mypy"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.3" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp document." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.5" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)." +category = "dev" +optional = false +python-versions = ">=3.5" + +[package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest"] + +[[package]] name = "sqlparse" +version = "0.4.1" +description = "A non-validating SQL parser." +category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "0.3.1" +python-versions = ">=3.5" + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "dev" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" + +[[package]] +name = "typed-ast" +version = "1.4.3" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = "*" [[package]] +name = "typing-extensions" +version = "3.10.0.0" +description = "Backported and Experimental Type Hints for Python 3.5+" category = "main" -description = "HTTP library with thread-safe connection pooling, file post, and more." -name = "urllib3" -optional = true +optional = false python-versions = "*" -version = "1.22" + +[[package]] +name = "urllib3" +version = "1.26.6" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" [package.extras] +brotli = ["brotlipy (>=0.6.0)"] secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] -socks = ["PySocks (>=1.5.6,<1.5.7 || >1.5.7,<2.0)"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] [[package]] -category = "main" -description = "Measures the displayed width of unicode strings in a terminal" name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +category = "main" optional = false python-versions = "*" -version = "0.2.5" [[package]] +name = "yarg" +version = "0.1.9" +description = "A semi hard Cornish cheese, also queries PyPI (PyPI client)" category = "dev" -description = "Backport of pathlib-compatible object wrapper for zip files" -marker = "python_version < \"3.8\"" +optional = false +python-versions = "*" + +[package.dependencies] +requests = "*" + +[[package]] name = "zipp" +version = "3.4.1" +description = "Backport of pathlib-compatible object wrapper for zip files" +category = "dev" 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"] +docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] +testing = ["pytest (>=4.6)", "pytest-checkdocs (>=1.2.3)", "pytest-flake8", "pytest-cov", "pytest-enabler", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] [extras] build-backend = [] requires = [] rollbar = ["django-q-rollbar"] -sentry = [] +sentry = ["django-q-sentry"] +testing = ["django-redis", "croniter", "hiredis", "psutil", "iron-mq", "boto3", "pymongo"] [metadata] -content-hash = "6d89bff8bd465aa4a5facd812172a970bf5edebdd8099141054f72aa63260c2a" -lock-version = "1.0" -python-versions = ">=3.6" +lock-version = "1.1" +python-versions = ">=3.6.2, <4" +content-hash = "f184ef02e97464c9eedb7f80b64e3f03d966dfe000d26fdd11b9c11b2c6be3ee" [metadata.files] +alabaster = [ + {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, + {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, +] ansicon = [ {file = "ansicon-1.89.0-py2.py3-none-any.whl", hash = "sha256:f1def52d17f65c2c9682cf8370c03f541f410c1752d6a14029f97318e4b9dfec"}, {file = "ansicon-1.89.0.tar.gz", hash = "sha256:e4d039def5768a47e4afec8e89e83ec3ae5a26bf00ad851f914d1240b444d2b1"}, ] +appdirs = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] arrow = [ - {file = "arrow-0.15.8-py2.py3-none-any.whl", hash = "sha256:271b8e05174d48e50324ed0dc5d74796c839c7e579a4f21cf1a7394665f9e94f"}, - {file = "arrow-0.15.8.tar.gz", hash = "sha256:edc31dc051db12c95da9bac0271cd1027b8e36912daf6d4580af53b23e62721a"}, + {file = "arrow-1.1.1-py3-none-any.whl", hash = "sha256:77a60a4db5766d900a2085ce9074c5c7b8e2c99afeaa98ad627637ff6f292510"}, + {file = "arrow-1.1.1.tar.gz", hash = "sha256:dee7602f6c60e3ec510095b5e301441bc56288cb8f51def14dcb3079f623823a"}, ] asgiref = [ - {file = "asgiref-3.2.10-py3-none-any.whl", hash = "sha256:9fc6fb5d39b8af147ba40765234fa822b39818b12cc80b35ad9b0cef3a476aed"}, - {file = "asgiref-3.2.10.tar.gz", hash = "sha256:7e51911ee147dd685c3c8b805c0ad0cb58d360987b56953878f8c06d2d1c6f1a"}, + {file = "asgiref-3.3.4-py3-none-any.whl", hash = "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee"}, + {file = "asgiref-3.3.4.tar.gz", hash = "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"}, ] 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"}, + {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, + {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, +] +babel = [ + {file = "Babel-2.9.1-py2.py3-none-any.whl", hash = "sha256:ab49e12b91d937cd11f0b67cb259a57ab4ad2b59ac7a3b41d6c06c0ac5b0def9"}, + {file = "Babel-2.9.1.tar.gz", hash = "sha256:bc0c176f9f6a994582230df350aa6e05ba2ebe4b3ac317eab29d9be5d2768da0"}, +] +black = [ + {file = "black-21.6b0-py3-none-any.whl", hash = "sha256:dfb8c5a069012b2ab1e972e7b908f5fb42b6bbabcba0a788b86dc05067c7d9c7"}, + {file = "black-21.6b0.tar.gz", hash = "sha256:dc132348a88d103016726fe360cb9ede02cecf99b76e3660ce6c596be132ce04"}, ] blessed = [ - {file = "blessed-1.17.9-py2.py3-none-any.whl", hash = "sha256:a9f059d5b2c32ade04eaafddac486db48c5e9a68fb7e181048aad391d33cef1a"}, - {file = "blessed-1.17.9.tar.gz", hash = "sha256:0d497a5be8a808b7300c00bf8303e7ba9fd11f6063a67bb924a475e5bfa7a9bb"}, + {file = "blessed-1.18.1-py2.py3-none-any.whl", hash = "sha256:dd7c0d33db9a2e7f597b446996484d0ed46e1586239db064fb5025008937dcae"}, + {file = "blessed-1.18.1.tar.gz", hash = "sha256:8b09936def6bc06583db99b65636b980075733e13550cb6af262ce724a55da23"}, ] boto3 = [ - {file = "boto3-1.14.43-py2.py3-none-any.whl", hash = "sha256:640a8372ce0edfbb84a8f63584a0b64c78d61a751a27c2a47f92d2ebaf021ce4"}, - {file = "boto3-1.14.43.tar.gz", hash = "sha256:a6c9a3d3abbad2ff2e5751af599492a9271633a7c9fef343482524464c53e451"}, + {file = "boto3-1.17.101-py2.py3-none-any.whl", hash = "sha256:a9beeb6f1be835ced95e90e93e5ac35b972a0fc35b71e6a1edc01abdc87932d4"}, + {file = "boto3-1.17.101.tar.gz", hash = "sha256:77ebaa3645ae153978a0f2c492502fef3804fe0e693abc7dc74620e4884afe67"}, ] botocore = [ - {file = "botocore-1.17.43-py2.py3-none-any.whl", hash = "sha256:f8801ce7f7603922ccab1c86c448e802f94183e31d99457e85fb9985a20d3abc"}, - {file = "botocore-1.17.43.tar.gz", hash = "sha256:3fb144d2b5d705127f394f7483737ece6fa79577ca7c493e4f42047ac8636200"}, + {file = "botocore-1.20.101-py2.py3-none-any.whl", hash = "sha256:2c56644dc1fdfc3f7cc5c690371d0770d8e6b9edb3f4e15f206e5bc27422dcd6"}, + {file = "botocore-1.20.101.tar.gz", hash = "sha256:f7a44fab1a3739ca54e7f72e8625b71574f8218f05349e59d3b871c887444edd"}, ] certifi = [ - {file = "certifi-2020.6.20-py2.py3-none-any.whl", hash = "sha256:8fc0819f1f30ba15bdb34cceffb9ef04d99f420f68eb75d901e9560b8749fc41"}, - {file = "certifi-2020.6.20.tar.gz", hash = "sha256:5930595817496dd21bb8dc35dad090f1c2cd0adfaf21204bf6732ca5d8ee34d3"}, + {file = "certifi-2021.5.30-py2.py3-none-any.whl", hash = "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8"}, + {file = "certifi-2021.5.30.tar.gz", hash = "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee"}, ] chardet = [ - {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, - {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, + {file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"}, + {file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"}, +] +click = [ + {file = "click-8.0.1-py3-none-any.whl", hash = "sha256:fba402a4a47334742d782209a7c79bc448911afe1149d07bdabdf480b3e2f4b6"}, + {file = "click-8.0.1.tar.gz", hash = "sha256:8c04c11192119b1ef78ea049e0a6f0463e4c48ef00a30160c704337586f3ad7a"}, ] colorama = [ - {file = "colorama-0.4.3-py2.py3-none-any.whl", hash = "sha256:7d73d2a99753107a36ac6b455ee49046802e59d9d076ef8e47b61499fa29afff"}, - {file = "colorama-0.4.3.tar.gz", hash = "sha256:e96da0d330793e2cb9485e9ddfd918d456036c7149416295932478192f4436a1"}, + {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, + {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, +] +coverage = [ + {file = "coverage-5.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:b6d534e4b2ab35c9f93f46229363e17f63c53ad01330df9f2d6bd1187e5eaacf"}, + {file = "coverage-5.5-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:b7895207b4c843c76a25ab8c1e866261bcfe27bfaa20c192de5190121770672b"}, + {file = "coverage-5.5-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:c2723d347ab06e7ddad1a58b2a821218239249a9e4365eaff6649d31180c1669"}, + {file = "coverage-5.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:900fbf7759501bc7807fd6638c947d7a831fc9fdf742dc10f02956ff7220fa90"}, + {file = "coverage-5.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:004d1880bed2d97151facef49f08e255a20ceb6f9432df75f4eef018fdd5a78c"}, + {file = "coverage-5.5-cp27-cp27m-win32.whl", hash = "sha256:06191eb60f8d8a5bc046f3799f8a07a2d7aefb9504b0209aff0b47298333302a"}, + {file = "coverage-5.5-cp27-cp27m-win_amd64.whl", hash = "sha256:7501140f755b725495941b43347ba8a2777407fc7f250d4f5a7d2a1050ba8e82"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:372da284cfd642d8e08ef606917846fa2ee350f64994bebfbd3afb0040436905"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:8963a499849a1fc54b35b1c9f162f4108017b2e6db2c46c1bed93a72262ed083"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:869a64f53488f40fa5b5b9dcb9e9b2962a66a87dab37790f3fcfb5144b996ef5"}, + {file = "coverage-5.5-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4a7697d8cb0f27399b0e393c0b90f0f1e40c82023ea4d45d22bce7032a5d7b81"}, + {file = "coverage-5.5-cp310-cp310-macosx_10_14_x86_64.whl", hash = "sha256:8d0a0725ad7c1a0bcd8d1b437e191107d457e2ec1084b9f190630a4fb1af78e6"}, + {file = "coverage-5.5-cp310-cp310-manylinux1_x86_64.whl", hash = "sha256:51cb9476a3987c8967ebab3f0fe144819781fca264f57f89760037a2ea191cb0"}, + {file = "coverage-5.5-cp310-cp310-win_amd64.whl", hash = "sha256:c0891a6a97b09c1f3e073a890514d5012eb256845c451bd48f7968ef939bf4ae"}, + {file = "coverage-5.5-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:3487286bc29a5aa4b93a072e9592f22254291ce96a9fbc5251f566b6b7343cdb"}, + {file = "coverage-5.5-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:deee1077aae10d8fa88cb02c845cfba9b62c55e1183f52f6ae6a2df6a2187160"}, + {file = "coverage-5.5-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:f11642dddbb0253cc8853254301b51390ba0081750a8ac03f20ea8103f0c56b6"}, + {file = "coverage-5.5-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:6c90e11318f0d3c436a42409f2749ee1a115cd8b067d7f14c148f1ce5574d701"}, + {file = "coverage-5.5-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:30c77c1dc9f253283e34c27935fded5015f7d1abe83bc7821680ac444eaf7793"}, + {file = "coverage-5.5-cp35-cp35m-win32.whl", hash = "sha256:9a1ef3b66e38ef8618ce5fdc7bea3d9f45f3624e2a66295eea5e57966c85909e"}, + {file = "coverage-5.5-cp35-cp35m-win_amd64.whl", hash = "sha256:972c85d205b51e30e59525694670de6a8a89691186012535f9d7dbaa230e42c3"}, + {file = "coverage-5.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:af0e781009aaf59e25c5a678122391cb0f345ac0ec272c7961dc5455e1c40066"}, + {file = "coverage-5.5-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:74d881fc777ebb11c63736622b60cb9e4aee5cace591ce274fb69e582a12a61a"}, + {file = "coverage-5.5-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:92b017ce34b68a7d67bd6d117e6d443a9bf63a2ecf8567bb3d8c6c7bc5014465"}, + {file = "coverage-5.5-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:d636598c8305e1f90b439dbf4f66437de4a5e3c31fdf47ad29542478c8508bbb"}, + {file = "coverage-5.5-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:41179b8a845742d1eb60449bdb2992196e211341818565abded11cfa90efb821"}, + {file = "coverage-5.5-cp36-cp36m-win32.whl", hash = "sha256:040af6c32813fa3eae5305d53f18875bedd079960822ef8ec067a66dd8afcd45"}, + {file = "coverage-5.5-cp36-cp36m-win_amd64.whl", hash = "sha256:5fec2d43a2cc6965edc0bb9e83e1e4b557f76f843a77a2496cbe719583ce8184"}, + {file = "coverage-5.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18ba8bbede96a2c3dde7b868de9dcbd55670690af0988713f0603f037848418a"}, + {file = "coverage-5.5-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2910f4d36a6a9b4214bb7038d537f015346f413a975d57ca6b43bf23d6563b53"}, + {file = "coverage-5.5-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:f0b278ce10936db1a37e6954e15a3730bea96a0997c26d7fee88e6c396c2086d"}, + {file = "coverage-5.5-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:796c9c3c79747146ebd278dbe1e5c5c05dd6b10cc3bcb8389dfdf844f3ead638"}, + {file = "coverage-5.5-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:53194af30d5bad77fcba80e23a1441c71abfb3e01192034f8246e0d8f99528f3"}, + {file = "coverage-5.5-cp37-cp37m-win32.whl", hash = "sha256:184a47bbe0aa6400ed2d41d8e9ed868b8205046518c52464fde713ea06e3a74a"}, + {file = "coverage-5.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2949cad1c5208b8298d5686d5a85b66aae46d73eec2c3e08c817dd3513e5848a"}, + {file = "coverage-5.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:217658ec7187497e3f3ebd901afdca1af062b42cfe3e0dafea4cced3983739f6"}, + {file = "coverage-5.5-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1aa846f56c3d49205c952d8318e76ccc2ae23303351d9270ab220004c580cfe2"}, + {file = "coverage-5.5-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:24d4a7de75446be83244eabbff746d66b9240ae020ced65d060815fac3423759"}, + {file = "coverage-5.5-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d1f8bf7b90ba55699b3a5e44930e93ff0189aa27186e96071fac7dd0d06a1873"}, + {file = "coverage-5.5-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:970284a88b99673ccb2e4e334cfb38a10aab7cd44f7457564d11898a74b62d0a"}, + {file = "coverage-5.5-cp38-cp38-win32.whl", hash = "sha256:01d84219b5cdbfc8122223b39a954820929497a1cb1422824bb86b07b74594b6"}, + {file = "coverage-5.5-cp38-cp38-win_amd64.whl", hash = "sha256:2e0d881ad471768bf6e6c2bf905d183543f10098e3b3640fc029509530091502"}, + {file = "coverage-5.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d1f9ce122f83b2305592c11d64f181b87153fc2c2bbd3bb4a3dde8303cfb1a6b"}, + {file = "coverage-5.5-cp39-cp39-manylinux1_i686.whl", hash = "sha256:13c4ee887eca0f4c5a247b75398d4114c37882658300e153113dafb1d76de529"}, + {file = "coverage-5.5-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:52596d3d0e8bdf3af43db3e9ba8dcdaac724ba7b5ca3f6358529d56f7a166f8b"}, + {file = "coverage-5.5-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:2cafbbb3af0733db200c9b5f798d18953b1a304d3f86a938367de1567f4b5bff"}, + {file = "coverage-5.5-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:44d654437b8ddd9eee7d1eaee28b7219bec228520ff809af170488fd2fed3e2b"}, + {file = "coverage-5.5-cp39-cp39-win32.whl", hash = "sha256:d314ed732c25d29775e84a960c3c60808b682c08d86602ec2c3008e1202e3bb6"}, + {file = "coverage-5.5-cp39-cp39-win_amd64.whl", hash = "sha256:13034c4409db851670bc9acd836243aeee299949bd5673e11844befcb0149f03"}, + {file = "coverage-5.5-pp36-none-any.whl", hash = "sha256:f030f8873312a16414c0d8e1a1ddff2d3235655a2174e3648b4fa66b3f2f1079"}, + {file = "coverage-5.5-pp37-none-any.whl", hash = "sha256:2a3859cb82dcbda1cfd3e6f71c27081d18aa251d20a17d87d26d4cd216fb0af4"}, + {file = "coverage-5.5.tar.gz", hash = "sha256:ebe78fe9a0e874362175b02371bdfbee64d8edc42a044253ddf4ee7d3c15212c"}, ] croniter = [ - {file = "croniter-0.3.34-py2.py3-none-any.whl", hash = "sha256:15597ef0639f8fbab09cbf8c277fa8c65c8b9dbe818c4b2212f95dbc09c6f287"}, - {file = "croniter-0.3.34.tar.gz", hash = "sha256:7186b9b464f45cf3d3c83a18bc2344cc101d7b9fd35a05f2878437b14967e964"}, + {file = "croniter-0.3.37-py2.py3-none-any.whl", hash = "sha256:8f573a889ca9379e08c336193435c57c02698c2dd22659cdbe04fee57426d79b"}, + {file = "croniter-0.3.37.tar.gz", hash = "sha256:12ced475dfc107bf7c6c1440af031f34be14cd97bbbfaf0f62221a9c11e86404"}, +] +dataclasses = [ + {file = "dataclasses-0.8-py3-none-any.whl", hash = "sha256:0201d89fa866f68c8ebd9d08ee6ff50c0b255f8ec63a71c16fda7af82bb887bf"}, + {file = "dataclasses-0.8.tar.gz", hash = "sha256:8479067f342acf957dc82ec415d355ab5edb7e7646b90dc6e2fd1d96ad084c97"}, ] django = [ - {file = "Django-3.1-py3-none-any.whl", hash = "sha256:1a63f5bb6ff4d7c42f62a519edc2adbb37f9b78068a5a862beff858b68e3dc8b"}, - {file = "Django-3.1.tar.gz", hash = "sha256:2d390268a13c655c97e0e2ede9d117007996db692c1bb93eabebd4fb7ea7012b"}, + {file = "Django-3.2.4-py3-none-any.whl", hash = "sha256:ea735cbbbb3b2fba6d4da4784a0043d84c67c92f1fdf15ad6db69900e792c10f"}, + {file = "Django-3.2.4.tar.gz", hash = "sha256:66c9d8db8cc6fe938a28b7887c1596e42d522e27618562517cc8929eb7e7f296"}, ] django-picklefield = [ {file = "django-picklefield-3.0.1.tar.gz", hash = "sha256:15ccba592ca953b9edf9532e64640329cd47b136b7f8f10f2939caa5f9ce4287"}, {file = "django_picklefield-3.0.1-py3-none-any.whl", hash = "sha256:3c702a54fde2d322fe5b2f39b8f78d9f655b8f77944ab26f703be6c0ed335a35"}, ] django-q-rollbar = [ - {file = "django-q-rollbar-0.1.1.tar.gz", hash = "sha256:31bd30fbdd8934e626a6ac61faf36cbb514e6ed6eb7e766ce43af0d321613f9f"}, - {file = "django_q_rollbar-0.1.1-py3-none-any.whl", hash = "sha256:5b261a15bcdfa440c9e7574569e887046b084c7edeb01bfe4e273494e71ac07e"}, + {file = "django-q-rollbar-0.1.3.tar.gz", hash = "sha256:a4de6da294507e6cbde77a015ece429f3602ea1d8df473ef2d63e44d2041ee4b"}, ] django-q-sentry = [ - {file = "django-q-sentry-0.1.1.tar.gz", hash = "sha256:b864b26ccfc09aafa948d8c8752a005a0fc1008240748d7424d9e4d750dbbb0d"}, - {file = "django_q_sentry-0.1.1-py3-none-any.whl", hash = "sha256:4864022c7bd8e456ea51401830fc1ab37977099ca29ab9b6c0d35c4988c4aad9"}, + {file = "django-q-sentry-0.1.5.tar.gz", hash = "sha256:6417b03ff19bce50de256e9b6e947c37b870bf00ad9acea775c0ce6e006e58ef"}, + {file = "django_q_sentry-0.1.5-py3-none-any.whl", hash = "sha256:11d7870c40194be4e610d9a19bd310477421349be30410f7f26dfbf4e3b93d3b"}, ] django-redis = [ {file = "django-redis-4.12.1.tar.gz", hash = "sha256:306589c7021e6468b2656edc89f62b8ba67e8d5a1c8877e2688042263daa7a63"}, {file = "django_redis-4.12.1-py3-none-any.whl", hash = "sha256:1133b26b75baa3664164c3f44b9d5d133d1b8de45d94d79f38d1adc5b1d502e5"}, ] +docopt = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] docutils = [ - {file = "docutils-0.15.2-py2-none-any.whl", hash = "sha256:9e4d7ecfc600058e07ba661411a2b7de2fd0fafa17d1a7f7361cd47b1175c827"}, - {file = "docutils-0.15.2-py3-none-any.whl", hash = "sha256:6c4f696463b79f1fb8ba0c594b63840ebd41f059e92b31957c46b74a4599b6d0"}, - {file = "docutils-0.15.2.tar.gz", hash = "sha256:a2aeea129088da402665e92e0b25b04b073c04b2dce4ab65caaa38b7ce2e1a99"}, + {file = "docutils-0.17.1-py2.py3-none-any.whl", hash = "sha256:cf316c8370a737a022b72b56874f6602acf974a37a9fba42ec2876387549fc61"}, + {file = "docutils-0.17.1.tar.gz", hash = "sha256:686577d2e4c32380bb50cbb22f575ed742d58168cee37e99117a854bcd88f125"}, ] hiredis = [ {file = "hiredis-1.1.0-cp27-cp27m-macosx_10_6_intel.whl", hash = "sha256:289b31885b4996ce04cadfd5fc03d034dce8e2a8234479f7c9e23b9e245db06b"}, @@ -653,9 +1127,13 @@ idna = [ {file = "idna-2.10-py2.py3-none-any.whl", hash = "sha256:b97d804b1e9b523befed77c48dacec60e6dcb0b5391d57af6a65a312a90648c0"}, {file = "idna-2.10.tar.gz", hash = "sha256:b307872f855b18632ce0c21c5e45be78c0ea7ae4c15c828c20788b26921eb3f6"}, ] +imagesize = [ + {file = "imagesize-1.2.0-py2.py3-none-any.whl", hash = "sha256:6965f19a6a2039c7d48bca7dba2473069ff854c36ae6f19d2cde309d998228a1"}, + {file = "imagesize-1.2.0.tar.gz", hash = "sha256:b1f6b5a4eab1f73479a50fb79fcf729514a900c341d8503d62a62dbc4127a2b1"}, +] importlib-metadata = [ - {file = "importlib_metadata-1.7.0-py2.py3-none-any.whl", hash = "sha256:dc15b2969b4ce36305c51eebe62d418ac7791e9a157911d58bfb1f9ccd8e2070"}, - {file = "importlib_metadata-1.7.0.tar.gz", hash = "sha256:90bb658cdbbf6d1735b6341ce708fc7024a3e14e99ffdc5783edea9f9b077f83"}, + {file = "importlib_metadata-4.5.0-py3-none-any.whl", hash = "sha256:833b26fb89d5de469b24a390e9df088d4e52e4ba33b01dc5e0e4f41b81a16c00"}, + {file = "importlib_metadata-4.5.0.tar.gz", hash = "sha256:b142cc1dd1342f31ff04bb7d022492b09920cb64fed867cd3ea6f80fe3ebd139"}, ] iron-core = [ {file = "iron-core-1.2.0.tar.gz", hash = "sha256:38f0942e86bf72d426560a66e4e14ffafdc52da5bee9925a2ac3968b30c3725b"}, @@ -663,102 +1141,193 @@ iron-core = [ iron-mq = [ {file = "iron-mq-0.9.tar.gz", hash = "sha256:c90441d872d9c08968343810a2ad1cca1664d80fd2ad3a3a2dbec57b7b38ecfa"}, ] +isort = [ + {file = "isort-5.9.1-py3-none-any.whl", hash = "sha256:8e2c107091cfec7286bc0f68a547d0ba4c094d460b732075b6fba674f1035c0c"}, + {file = "isort-5.9.1.tar.gz", hash = "sha256:83510593e07e433b77bd5bff0f6f607dbafa06d1a89022616f02d8b699cfcd56"}, +] +jinja2 = [ + {file = "Jinja2-3.0.1-py3-none-any.whl", hash = "sha256:1f06f2da51e7b56b8f238affdd6b4e2c61e39598a378cc49345bc1bd42a978a4"}, + {file = "Jinja2-3.0.1.tar.gz", hash = "sha256:703f484b47a6af502e743c9122595cc812b0271f661722403114f71a79d0f5a4"}, +] jinxed = [ - {file = "jinxed-1.0.1-py2.py3-none-any.whl", hash = "sha256:602f2cb3523c1045456f7b6d79ac19297fd8e933ae3bd9159845dc857f2d519c"}, - {file = "jinxed-1.0.1.tar.gz", hash = "sha256:bc523c74fe676c99ccc69c68c2dcd7d4d2d7b2541f6dbef74ef211aedd8ad0d3"}, + {file = "jinxed-1.1.0-py2.py3-none-any.whl", hash = "sha256:6a61ccf963c16aa885304f27e6e5693783676897cea0c7f223270c8b8e78baf8"}, + {file = "jinxed-1.1.0.tar.gz", hash = "sha256:d8f1731f134e9e6b04d95095845ae6c10eb15cb223a5f0cabdea87d4a279c305"}, ] jmespath = [ {file = "jmespath-0.10.0-py2.py3-none-any.whl", hash = "sha256:cdf6525904cc597730141d61b36f2e4b8ecc257c420fa2f4549bac2c2d0cb72f"}, {file = "jmespath-0.10.0.tar.gz", hash = "sha256:b85d0567b8666149a93172712e68920734333c0ce7e89b78b3e987f71e5ed4f9"}, ] +markupsafe = [ + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] more-itertools = [ - {file = "more-itertools-8.4.0.tar.gz", hash = "sha256:68c70cc7167bdf5c7c9d8f6954a7837089c6a36bf565383919bb595efb8a17e5"}, - {file = "more_itertools-8.4.0-py3-none-any.whl", hash = "sha256:b78134b2063dd214000685165d81c154522c3ee0a1c0d4d113c80361c234c5a2"}, + {file = "more-itertools-8.8.0.tar.gz", hash = "sha256:83f0308e05477c68f56ea3a888172c78ed5d5b3c282addb67508e7ba6c8f813a"}, + {file = "more_itertools-8.8.0-py3-none-any.whl", hash = "sha256:2cf89ec599962f2ddc4d568a05defc40e0a587fbc10d5989713638864c36be4d"}, +] +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"}, ] natsort = [ - {file = "natsort-7.0.1-py3-none-any.whl", hash = "sha256:d3fd728a3ceb7c78a59aa8539692a75e37cbfd9b261d4d702e8016639820f90a"}, - {file = "natsort-7.0.1.tar.gz", hash = "sha256:a633464dc3a22b305df0f27abcb3e83515898aa1fd0ed2f9726c3571a27258cf"}, + {file = "natsort-7.1.1-py3-none-any.whl", hash = "sha256:d0f4fc06ca163fa4a5ef638d9bf111c67f65eedcc7920f98dec08e489045b67e"}, + {file = "natsort-7.1.1.tar.gz", hash = "sha256:00c603a42365830c4722a2eb7663a25919551217ec09a243d3399fa8dd4ac403"}, ] packaging = [ - {file = "packaging-20.4-py2.py3-none-any.whl", hash = "sha256:998416ba6962ae7fbd6596850b80e17859a5753ba17c32284f67bfff33784181"}, - {file = "packaging-20.4.tar.gz", hash = "sha256:4357f74f47b9c12db93624a82154e9b120fa8293699949152b22065d556079f8"}, + {file = "packaging-20.9-py2.py3-none-any.whl", hash = "sha256:67714da7f7bc052e064859c05c595155bd1ee9f69f76557e21f051443c20947a"}, + {file = "packaging-20.9.tar.gz", hash = "sha256:5b327ac1320dc863dca72f4514ecc086f31186744b84a230374cc1fd776feae5"}, +] +pathspec = [ + {file = "pathspec-0.8.1-py2.py3-none-any.whl", hash = "sha256:aa0cb481c4041bf52ffa7b0d8fa6cd3e88a2ca4879c533c9153882ee2556790d"}, + {file = "pathspec-0.8.1.tar.gz", hash = "sha256:86379d6b86d75816baba717e64b1a3a3469deb93bb76d613c9ce79edc5cb68fd"}, +] +pip-api = [ + {file = "pip-api-0.0.20.tar.gz", hash = "sha256:1da0b47824c0b6c2830f2767e7304820d148475e4d08979add271da32917598e"}, + {file = "pip_api-0.0.20-py3-none-any.whl", hash = "sha256:74227da7102523339d7b6e2f6e105821b04415bdb5f096e170b0ababf88d074f"}, +] +pipreqs = [ + {file = "pipreqs-0.4.10-py2.py3-none-any.whl", hash = "sha256:cafe42ab70628d408c147fb8944bc303355ea8f91fddca4a98d273e572e39905"}, + {file = "pipreqs-0.4.10.tar.gz", hash = "sha256:9e351d644b28b98d7386b046a73806cbb3bb66b23a30e74feeb95ed9571db939"}, ] pluggy = [ {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, ] psutil = [ - {file = "psutil-5.7.2-cp27-none-win32.whl", hash = "sha256:f2018461733b23f308c298653c8903d32aaad7873d25e1d228765e91ae42c3f2"}, - {file = "psutil-5.7.2-cp27-none-win_amd64.whl", hash = "sha256:66c18ca7680a31bf16ee22b1d21b6397869dda8059dbdb57d9f27efa6615f195"}, - {file = "psutil-5.7.2-cp35-cp35m-win32.whl", hash = "sha256:5e9d0f26d4194479a13d5f4b3798260c20cecf9ac9a461e718eb59ea520a360c"}, - {file = "psutil-5.7.2-cp35-cp35m-win_amd64.whl", hash = "sha256:4080869ed93cce662905b029a1770fe89c98787e543fa7347f075ade761b19d6"}, - {file = "psutil-5.7.2-cp36-cp36m-win32.whl", hash = "sha256:d8a82162f23c53b8525cf5f14a355f5d1eea86fa8edde27287dd3a98399e4fdf"}, - {file = "psutil-5.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:0ee3c36428f160d2d8fce3c583a0353e848abb7de9732c50cf3356dd49ad63f8"}, - {file = "psutil-5.7.2-cp37-cp37m-win32.whl", hash = "sha256:ff1977ba1a5f71f89166d5145c3da1cea89a0fdb044075a12c720ee9123ec818"}, - {file = "psutil-5.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a5b120bb3c0c71dfe27551f9da2f3209a8257a178ed6c628a819037a8df487f1"}, - {file = "psutil-5.7.2-cp38-cp38-win32.whl", hash = "sha256:10512b46c95b02842c225f58fa00385c08fa00c68bac7da2d9a58ebe2c517498"}, - {file = "psutil-5.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:68d36986ded5dac7c2dcd42f2682af1db80d4bce3faa126a6145c1637e1b559f"}, - {file = "psutil-5.7.2.tar.gz", hash = "sha256:90990af1c3c67195c44c9a889184f84f5b2320dce3ee3acbd054e3ba0b4a7beb"}, + {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"}, + {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c"}, + {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df"}, + {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131"}, + {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60"}, + {file = "psutil-5.8.0-cp27-none-win32.whl", hash = "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876"}, + {file = "psutil-5.8.0-cp27-none-win_amd64.whl", hash = "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65"}, + {file = "psutil-5.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8"}, + {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6"}, + {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac"}, + {file = "psutil-5.8.0-cp36-cp36m-win32.whl", hash = "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2"}, + {file = "psutil-5.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d"}, + {file = "psutil-5.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935"}, + {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d"}, + {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023"}, + {file = "psutil-5.8.0-cp37-cp37m-win32.whl", hash = "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394"}, + {file = "psutil-5.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563"}, + {file = "psutil-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef"}, + {file = "psutil-5.8.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28"}, + {file = "psutil-5.8.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b"}, + {file = "psutil-5.8.0-cp38-cp38-win32.whl", hash = "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d"}, + {file = "psutil-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d"}, + {file = "psutil-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7"}, + {file = "psutil-5.8.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4"}, + {file = "psutil-5.8.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b"}, + {file = "psutil-5.8.0-cp39-cp39-win32.whl", hash = "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0"}, + {file = "psutil-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3"}, + {file = "psutil-5.8.0.tar.gz", hash = "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6"}, ] py = [ - {file = "py-1.9.0-py2.py3-none-any.whl", hash = "sha256:366389d1db726cd2fcfc79732e75410e5fe4d31db13692115529d34069a043c2"}, - {file = "py-1.9.0.tar.gz", hash = "sha256:9ca6883ce56b4e8da7e79ac18787889fa5206c79dcc67fb065376cd2fe03f342"}, + {file = "py-1.10.0-py2.py3-none-any.whl", hash = "sha256:3b80836aa6d1feeaa108e046da6423ab8f6ceda6468545ae8d02d9d58d18818a"}, + {file = "py-1.10.0.tar.gz", hash = "sha256:21b81bda15b66ef5e1a777a21c4dcd9c20ad3efd0b3f817e7a809035269e1bd3"}, +] +pygments = [ + {file = "Pygments-2.9.0-py3-none-any.whl", hash = "sha256:d66e804411278594d764fc69ec36ec13d9ae9147193a1740cd34d272ca383b8e"}, + {file = "Pygments-2.9.0.tar.gz", hash = "sha256:a18f47b506a429f6f4b9df81bb02beab9ca21d0a5fee38ed15aef65f0545519f"}, ] pymongo = [ - {file = "pymongo-3.11.0-cp27-cp27m-macosx_10_15_x86_64.whl", hash = "sha256:7a4a6f5b818988a3917ec4baa91d1143242bdfece8d38305020463955961266a"}, - {file = "pymongo-3.11.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:c4869141e20769b65d2d72686e7a7eb141ce9f3168106bed3e7dcced54eb2422"}, - {file = "pymongo-3.11.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:ef76535776c0708a85258f6dc51d36a2df12633c735f6d197ed7dfcaa7449b99"}, - {file = "pymongo-3.11.0-cp27-cp27m-win32.whl", hash = "sha256:d226e0d4b9192d95079a9a29c04dd81816b1ce8903b8c174a39224fe978547cb"}, - {file = "pymongo-3.11.0-cp27-cp27m-win_amd64.whl", hash = "sha256:68220b81850de8e966d4667d5c325a96c6ac0d6adb3d18935d6e3d325d441f48"}, - {file = "pymongo-3.11.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:f6efca006a81e1197b925a7d7b16b8f61980697bb6746587aad8842865233218"}, - {file = "pymongo-3.11.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:7307024b18266b302f4265da84bb1effb5d18999ef35b30d17592959568d5c0a"}, - {file = "pymongo-3.11.0-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:8ea13d0348b4c96b437d944d7068d59ed4a6c98aaa6c40d8537a2981313f1c66"}, - {file = "pymongo-3.11.0-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:6a15e2bee5c4188369a87ed6f02de804651152634a46cca91966a11c8abd2550"}, - {file = "pymongo-3.11.0-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:d64c98277ea80e4484f1332ab107e8dfd173a7dcf1bdbf10a9cccc97aaab145f"}, - {file = "pymongo-3.11.0-cp34-cp34m-win32.whl", hash = "sha256:83c5a3ecd96a9f3f11cfe6dfcbcec7323265340eb24cc996acaecea129865a3a"}, - {file = "pymongo-3.11.0-cp34-cp34m-win_amd64.whl", hash = "sha256:890b0f1e18dbd898aeb0ab9eae1ab159c6bcbe87f0abb065b0044581d8614062"}, - {file = "pymongo-3.11.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:9fc17fdac8f1973850d42e51e8ba6149d93b1993ed6768a24f352f926dd3d587"}, - {file = "pymongo-3.11.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:421aa1b92c291c429668bd8d8d8ec2bd00f183483a756928e3afbf2b6f941f00"}, - {file = "pymongo-3.11.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:a2787319dc69854acdfd6452e6a8ba8f929aeb20843c7f090e04159fc18e6245"}, - {file = "pymongo-3.11.0-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:455f4deb00158d5ec8b1d3092df6abb681b225774ab8a59b3510293b4c8530e3"}, - {file = "pymongo-3.11.0-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:25e617daf47d8dfd4e152c880cd0741cbdb48e51f54b8de9ddbfe74ecd87dd16"}, - {file = "pymongo-3.11.0-cp35-cp35m-manylinux2014_ppc64le.whl", hash = "sha256:7122ffe597b531fb065d3314e704a6fe152b81820ca5f38543e70ffcc95ecfd4"}, - {file = "pymongo-3.11.0-cp35-cp35m-manylinux2014_s390x.whl", hash = "sha256:d0565481dc196986c484a7fb13214fc6402201f7fb55c65fd215b3324962fe6c"}, - {file = "pymongo-3.11.0-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:4437300eb3a5e9cc1a73b07d22c77302f872f339caca97e9bf8cf45eca8fa0d2"}, - {file = "pymongo-3.11.0-cp35-cp35m-win32.whl", hash = "sha256:d38b35f6eef4237b1d0d8e845fc1546dad85c55eba447e28c211da8c7ef9697c"}, - {file = "pymongo-3.11.0-cp35-cp35m-win_amd64.whl", hash = "sha256:137e6fa718c7eff270dbd2fc4b90d94b1a69c9e9eb3f3de9e850a7fd33c822dc"}, - {file = "pymongo-3.11.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c0d660a186e36c526366edf8a64391874fe53cf8b7039224137aee0163c046df"}, - {file = "pymongo-3.11.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:d1b3366329c45a474b3bbc9b9c95d4c686e03f35da7fd12bc144626d1f2a7c04"}, - {file = "pymongo-3.11.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:b7c522292407fa04d8195032493aac937e253ad9ae524aab43b9d9d242571f03"}, - {file = "pymongo-3.11.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:9755c726aa6788f076114dfdc03b92b03ff8860316cca00902cce88bcdb5fedd"}, - {file = "pymongo-3.11.0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:50531caa7b4be1c4ed5e2d5793a4e51cc9bd62a919a6fd3299ef7c902e206eab"}, - {file = "pymongo-3.11.0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:cc4057f692ac35bbe82a0a908d42ce3a281c9e913290fac37d7fa3bd01307dfb"}, - {file = "pymongo-3.11.0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:213c445fe7e654621c6309e874627c35354b46ef3ee807f5a1927dc4b30e1a67"}, - {file = "pymongo-3.11.0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:4ae23fbbe9eadf61279a26eba866bbf161a6f7e2ffad14a42cf20e9cb8e94166"}, - {file = "pymongo-3.11.0-cp36-cp36m-win32.whl", hash = "sha256:8deda1f7b4c03242f2a8037706d9584e703f3d8c74d6d9cac5833db36fe16c42"}, - {file = "pymongo-3.11.0-cp36-cp36m-win_amd64.whl", hash = "sha256:e8c446882cbb3774cd78c738c9f58220606b702b7c1655f1423357dc51674054"}, - {file = "pymongo-3.11.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d9de8427a5601799784eb0e7fa1b031aa64086ce04de29df775a8ca37eedac41"}, - {file = "pymongo-3.11.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:3d9bb1ba935a90ec4809a8031efd988bdb13cdba05d9e9a3e9bf151bf759ecde"}, - {file = "pymongo-3.11.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:96782ebb3c9e91e174c333208b272ea144ed2a684413afb1038e3b3342230d72"}, - {file = "pymongo-3.11.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:50127b13b38e8e586d5e97d342689405edbd74ad0bd891d97ee126a8c7b6e45f"}, - {file = "pymongo-3.11.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:bd312794f51e37dcf77f013d40650fe4fbb211dd55ef2863839c37480bd44369"}, - {file = "pymongo-3.11.0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:4797c0080f41eba90404335e5ded3aa66731d303293a675ff097ce4ea3025bb9"}, - {file = "pymongo-3.11.0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:1f865b1d1c191d785106f54df9abdc7d2f45a946b45fd1ea0a641b4f982a2a77"}, - {file = "pymongo-3.11.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:cccf1e7806f12300e3a3b48f219e111000c2538483e85c869c35c1ae591e6ce9"}, - {file = "pymongo-3.11.0-cp37-cp37m-win32.whl", hash = "sha256:05fcc6f9c60e6efe5219fbb5a30258adb3d3e5cbd317068f3d73c09727f2abb6"}, - {file = "pymongo-3.11.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9dbab90c348c512e03f146e93a5e2610acec76df391043ecd46b6b775d5397e6"}, - {file = "pymongo-3.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:689142dc0c150e9cb7c012d84cac2c346d40beb891323afb6caf18ec4caafae0"}, - {file = "pymongo-3.11.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:4b32744901ee9990aa8cd488ec85634f443526def1e5190a407dc107148249d7"}, - {file = "pymongo-3.11.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e6a15cf8f887d9f578dd49c6fb3a99d53e1d922fdd67a245a67488d77bf56eb2"}, - {file = "pymongo-3.11.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e8d188ee39bd0ffe76603da887706e4e7b471f613625899ddf1e27867dc6a0d3"}, - {file = "pymongo-3.11.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:9ee0eef254e340cc11c379f797af3977992a7f2c176f1a658740c94bf677e13c"}, - {file = "pymongo-3.11.0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:91e96bf85b7c07c827d339a386e8a3cf2e90ef098c42595227f729922d0851df"}, - {file = "pymongo-3.11.0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:ce208f80f398522e49d9db789065c8ad2cd37b21bd6b23d30053474b7416af11"}, - {file = "pymongo-3.11.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:475a34a0745c456ceffaec4ce86b7e0983478f1b6140890dff7b161e7bcd895b"}, - {file = "pymongo-3.11.0-cp38-cp38-win32.whl", hash = "sha256:40696a9a53faa7d85aaa6fd7bef1cae08f7882640bad08c350fb59dee7ad069b"}, - {file = "pymongo-3.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:03dc64a9aa7a5d405aea5c56db95835f6a2fa31b3502c5af1760e0e99210be30"}, - {file = "pymongo-3.11.0-py2.7-macosx-10.15-x86_64.egg", hash = "sha256:63a5387e496a98170ffe638b435c0832c0f2011a6f4ff7a2880f17669fff8c03"}, - {file = "pymongo-3.11.0.tar.gz", hash = "sha256:076a7f2f7c251635cf6116ac8e45eefac77758ee5a77ab7bd2f63999e957613b"}, + {file = "pymongo-3.11.4-cp27-cp27m-macosx_10_14_intel.whl", hash = "sha256:b7efc7e7049ef366777cfd35437c18a4166bb50a5606a1c840ee3b9624b54fc9"}, + {file = "pymongo-3.11.4-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:517ba47ca04a55b1f50ee8df9fd97f6c37df5537d118fb2718952b8623860466"}, + {file = "pymongo-3.11.4-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:225c61e08fe517aede7912937939e09adf086c8e6f7e40d4c85ad678c2c2aea3"}, + {file = "pymongo-3.11.4-cp27-cp27m-win32.whl", hash = "sha256:e4e9db78b71db2b1684ee4ecc3e32c4600f18cdf76e6b9ae03e338e52ee4b168"}, + {file = "pymongo-3.11.4-cp27-cp27m-win_amd64.whl", hash = "sha256:8e0004b0393d72d76de94b4792a006cb960c1c65c7659930fbf9a81ce4341982"}, + {file = "pymongo-3.11.4-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:fedf0dee7a412ca6d1d6d92c158fe9cbaa8ea0cae90d268f9ccc0744de7a97d0"}, + {file = "pymongo-3.11.4-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:f947b359cc4769af8b49be7e37af01f05fcf15b401da2528021148e4a54426d1"}, + {file = "pymongo-3.11.4-cp34-cp34m-macosx_10_6_intel.whl", hash = "sha256:3a3498a8326111221560e930f198b495ea6926937e249f475052ffc6893a6680"}, + {file = "pymongo-3.11.4-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:9a4f6e0b01df820ba9ed0b4e618ca83a1c089e48d4f268d0e00dcd49893d4549"}, + {file = "pymongo-3.11.4-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:d65bac5f6724d9ea6f0b5a0f0e4952fbbf209adcf6b5583b54c54bd2fcd74dc0"}, + {file = "pymongo-3.11.4-cp34-cp34m-win32.whl", hash = "sha256:15b083d1b789b230e5ac284442d9ecb113c93f3785a6824f748befaab803b812"}, + {file = "pymongo-3.11.4-cp34-cp34m-win_amd64.whl", hash = "sha256:f08665d3cc5abc2f770f472a9b5f720a9b3ab0b8b3bb97c7c1487515e5653d39"}, + {file = "pymongo-3.11.4-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:977b1d4f868986b4ba5d03c317fde4d3b66e687d74473130cd598e3103db34fa"}, + {file = "pymongo-3.11.4-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:510cd3bfabb63a07405b7b79fae63127e34c118b7531a2cbbafc7a24fd878594"}, + {file = "pymongo-3.11.4-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:071552b065e809d24c5653fcc14968cfd6fde4e279408640d5ac58e3353a3c5f"}, + {file = "pymongo-3.11.4-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:f4ba58157e8ae33ee86fadf9062c506e535afd904f07f9be32731f4410a23b7f"}, + {file = "pymongo-3.11.4-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:b413117210fa6d92664c3d860571e8e8727c3e8f2ff197276c5d0cb365abd3ad"}, + {file = "pymongo-3.11.4-cp35-cp35m-manylinux2014_ppc64le.whl", hash = "sha256:08b8723248730599c9803ae4c97b8f3f76c55219104303c88cb962a31e3bb5ee"}, + {file = "pymongo-3.11.4-cp35-cp35m-manylinux2014_s390x.whl", hash = "sha256:8a41fdc751dc4707a4fafb111c442411816a7c225ebb5cadb57599534b5d5372"}, + {file = "pymongo-3.11.4-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:f664ed7613b8b18f0ce5696b146776266a038c19c5cd6efffa08ecc189b01b73"}, + {file = "pymongo-3.11.4-cp35-cp35m-win32.whl", hash = "sha256:5c36428cc4f7fae56354db7f46677fd21222fc3cb1e8829549b851172033e043"}, + {file = "pymongo-3.11.4-cp35-cp35m-win_amd64.whl", hash = "sha256:d0a70151d7de8a3194cdc906bcc1a42e14594787c64b0c1c9c975e5a2af3e251"}, + {file = "pymongo-3.11.4-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:9b9298964389c180a063a9e8bac8a80ed42de11d04166b20249bfa0a489e0e0f"}, + {file = "pymongo-3.11.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b2f41261b648cf5dee425f37ff14f4ad151c2f24b827052b402637158fd056ef"}, + {file = "pymongo-3.11.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e02beaab433fd1104b2804f909e694cfbdb6578020740a9051597adc1cd4e19f"}, + {file = "pymongo-3.11.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:8898f6699f740ca93a0879ed07d8e6db02d68af889d0ebb3d13ab017e6b1af1e"}, + {file = "pymongo-3.11.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:62c29bc36a6d9be68fe7b5aaf1e120b4aa66a958d1e146601fcd583eb12cae7b"}, + {file = "pymongo-3.11.4-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:424799c71ff435094e5fb823c40eebb4500f0e048133311e9c026467e8ccebac"}, + {file = "pymongo-3.11.4-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:3551912f5c34d8dd7c32c6bb00ae04192af47f7b9f653608f107d19c1a21a194"}, + {file = "pymongo-3.11.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:5db59223ed1e634d842a053325f85f908359c6dac9c8ddce8ef145061fae7df8"}, + {file = "pymongo-3.11.4-cp36-cp36m-win32.whl", hash = "sha256:fea5cb1c63efe1399f0812532c7cf65458d38fd011be350bc5021dfcac39fba8"}, + {file = "pymongo-3.11.4-cp36-cp36m-win_amd64.whl", hash = "sha256:d4e62417e89b717a7bcd8576ac3108cd063225942cc91c5b37ff5465fdccd386"}, + {file = "pymongo-3.11.4-cp37-cp37m-macosx_10_6_intel.whl", hash = "sha256:4c7e8c8e1e1918dcf6a652ac4b9d87164587c26fd2ce5dd81e73a5ab3b3d492f"}, + {file = "pymongo-3.11.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:38a7b5140a48fc91681cdb5cb95b7cd64640b43d19259fdd707fa9d5a715f2b2"}, + {file = "pymongo-3.11.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:aff3656af2add93f290731a6b8930b23b35c0c09569150130a58192b3ec6fc61"}, + {file = "pymongo-3.11.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:03be7ad107d252bb7325d4af6309fdd2c025d08854d35f0e7abc8bf048f4245e"}, + {file = "pymongo-3.11.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:6060794aac9f7b0644b299f46a9c6cbc0bc470bd01572f4134df140afd41ded6"}, + {file = "pymongo-3.11.4-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:73326b211e7410c8bd6a74500b1e3f392f39cf10862e243d00937e924f112c01"}, + {file = "pymongo-3.11.4-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:20d75ea11527331a2980ab04762a9d960bcfea9475c54bbeab777af880de61cd"}, + {file = "pymongo-3.11.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:3135dd574ef1286189f3f04a36c8b7a256376914f8cbbce66b94f13125ded858"}, + {file = "pymongo-3.11.4-cp37-cp37m-win32.whl", hash = "sha256:7c97554ea521f898753d9773891d0347ebfaddcc1dee2ad94850b163171bf1f1"}, + {file = "pymongo-3.11.4-cp37-cp37m-win_amd64.whl", hash = "sha256:a08c8b322b671857c81f4c30cd3c8df2895fd3c0e9358714f39e0ef8fb327702"}, + {file = "pymongo-3.11.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f3d851af3852f16ad4adc7ee054fd9c90a7a5063de94d815b7f6a88477b9f4c6"}, + {file = "pymongo-3.11.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:3bfc7689a1bacb9bcd2f2d5185d99507aa29f667a58dd8adaa43b5a348139e46"}, + {file = "pymongo-3.11.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:b8f94acd52e530a38f25e4d5bf7ddfdd4bea9193e718f58419def0d4406b58d3"}, + {file = "pymongo-3.11.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e4b631688dfbdd61b5610e20b64b99d25771c6d52d9da73349342d2a0f11c46a"}, + {file = "pymongo-3.11.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:474e21d0e07cd09679e357d1dac76e570dab86665e79a9d3354b10a279ac6fb3"}, + {file = "pymongo-3.11.4-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:421d13523d11c57f57f257152bc4a6bb463aadf7a3918e9c96fefdd6be8dbfb8"}, + {file = "pymongo-3.11.4-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:0cabfc297f4cf921f15bc789a8fbfd7115eb9f813d3f47a74b609894bc66ab0d"}, + {file = "pymongo-3.11.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:fe4189846448df013cd9df11bba38ddf78043f8c290a9f06430732a7a8601cce"}, + {file = "pymongo-3.11.4-cp38-cp38-win32.whl", hash = "sha256:eb4d176394c37a76e8b0afe54b12d58614a67a60a7f8c0dd3a5afbb013c01092"}, + {file = "pymongo-3.11.4-cp38-cp38-win_amd64.whl", hash = "sha256:fffff7bfb6799a763d3742c59c6ee7ffadda21abed557637bc44ed1080876484"}, + {file = "pymongo-3.11.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:13acf6164ead81c9fc2afa0e1ea6d6134352973ce2bb35496834fee057063c04"}, + {file = "pymongo-3.11.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:d360e5d5dd3d55bf5d1776964625018d85b937d1032bae1926dd52253decd0db"}, + {file = "pymongo-3.11.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:0aaf4d44f1f819360f9432df538d54bbf850f18152f34e20337c01b828479171"}, + {file = "pymongo-3.11.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:08bda7b2c522ff9f1e554570da16298271ebb0c56ab9699446aacba249008988"}, + {file = "pymongo-3.11.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:1a994a42f49dab5b6287e499be7d3d2751776486229980d8857ad53b8333d469"}, + {file = "pymongo-3.11.4-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:161fcd3281c42f644aa8dec7753cca2af03ce654e17d76da4f0dab34a12480ca"}, + {file = "pymongo-3.11.4-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:78f07961f4f214ea8e80be63cffd5cc158eb06cd922ffbf6c7155b11728f28f9"}, + {file = "pymongo-3.11.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:ad31f184dcd3271de26ab1f9c51574afb99e1b0e484ab1da3641256b723e4994"}, + {file = "pymongo-3.11.4-cp39-cp39-win32.whl", hash = "sha256:5e606846c049ed40940524057bfdf1105af6066688c0e6a1a3ce2038589bae70"}, + {file = "pymongo-3.11.4-cp39-cp39-win_amd64.whl", hash = "sha256:3491c7de09e44eded16824cb58cf9b5cc1dc6f066a0bb7aa69929d02aa53b828"}, + {file = "pymongo-3.11.4-py2.7-macosx-10.14-intel.egg", hash = "sha256:506a6dab4c7ffdcacdf0b8e70bd20eb2e77fa994519547c9d88d676400fcad58"}, + {file = "pymongo-3.11.4.tar.gz", hash = "sha256:539d4cb1b16b57026999c53e5aab857fe706e70ae5310cc8c232479923f932e6"}, ] pyparsing = [ {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, @@ -768,47 +1337,178 @@ pytest = [ {file = "pytest-5.4.3-py3-none-any.whl", hash = "sha256:5c0db86b698e8f170ba4582a492248919255fcd4c79b1ee64ace34301fb589a1"}, {file = "pytest-5.4.3.tar.gz", hash = "sha256:7979331bfcba207414f5e1263b5a0f8f521d0f457318836a7355531ed1a4c7d8"}, ] +pytest-cov = [ + {file = "pytest-cov-2.12.1.tar.gz", hash = "sha256:261ceeb8c227b726249b376b8526b600f38667ee314f910353fa318caa01f4d7"}, + {file = "pytest_cov-2.12.1-py2.py3-none-any.whl", hash = "sha256:261bb9e47e65bd099c89c3edf92972865210c36813f80ede5277dceb77a4a62a"}, +] pytest-django = [ - {file = "pytest-django-3.9.0.tar.gz", hash = "sha256:664e5f42242e5e182519388f01b9f25d824a9feb7cd17d8f863c8d776f38baf9"}, - {file = "pytest_django-3.9.0-py2.py3-none-any.whl", hash = "sha256:64f99d565dd9497af412fcab2989fe40982c1282d4118ff422b407f3f7275ca5"}, + {file = "pytest-django-3.10.0.tar.gz", hash = "sha256:4de6dbd077ed8606616958f77655fed0d5e3ee45159475671c7fa67596c6dba6"}, + {file = "pytest_django-3.10.0-py2.py3-none-any.whl", hash = "sha256:c33e3d3da14d8409b125d825d4e74da17bb252191bf6fc3da6856e27a8b73ea4"}, ] 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"}, ] pytz = [ - {file = "pytz-2020.1-py2.py3-none-any.whl", hash = "sha256:a494d53b6d39c3c6e44c3bec237336e14305e4f29bbf800b599253057fbb79ed"}, - {file = "pytz-2020.1.tar.gz", hash = "sha256:c35965d010ce31b23eeb663ed3cc8c906275d6be1a34393a1d73a41febf4a048"}, + {file = "pytz-2021.1-py2.py3-none-any.whl", hash = "sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798"}, + {file = "pytz-2021.1.tar.gz", hash = "sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da"}, ] redis = [ {file = "redis-3.5.3-py2.py3-none-any.whl", hash = "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24"}, {file = "redis-3.5.3.tar.gz", hash = "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2"}, ] +regex = [ + {file = "regex-2021.4.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:619d71c59a78b84d7f18891fe914446d07edd48dc8328c8e149cbe0929b4e000"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:47bf5bf60cf04d72bf6055ae5927a0bd9016096bf3d742fa50d9bf9f45aa0711"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:281d2fd05555079448537fe108d79eb031b403dac622621c78944c235f3fcf11"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:bd28bc2e3a772acbb07787c6308e00d9626ff89e3bfcdebe87fa5afbfdedf968"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:7c2a1af393fcc09e898beba5dd59196edaa3116191cc7257f9224beaed3e1aa0"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c38c71df845e2aabb7fb0b920d11a1b5ac8526005e533a8920aea97efb8ec6a4"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:96fcd1888ab4d03adfc9303a7b3c0bd78c5412b2bfbe76db5b56d9eae004907a"}, + {file = "regex-2021.4.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:ade17eb5d643b7fead300a1641e9f45401c98eee23763e9ed66a43f92f20b4a7"}, + {file = "regex-2021.4.4-cp36-cp36m-win32.whl", hash = "sha256:e8e5b509d5c2ff12f8418006d5a90e9436766133b564db0abaec92fd27fcee29"}, + {file = "regex-2021.4.4-cp36-cp36m-win_amd64.whl", hash = "sha256:11d773d75fa650cd36f68d7ca936e3c7afaae41b863b8c387a22aaa78d3c5c79"}, + {file = "regex-2021.4.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3029c340cfbb3ac0a71798100ccc13b97dddf373a4ae56b6a72cf70dfd53bc8"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:18c071c3eb09c30a264879f0d310d37fe5d3a3111662438889ae2eb6fc570c31"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4c557a7b470908b1712fe27fb1ef20772b78079808c87d20a90d051660b1d69a"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:01afaf2ec48e196ba91b37451aa353cb7eda77efe518e481707e0515025f0cd5"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:3a9cd17e6e5c7eb328517969e0cb0c3d31fd329298dd0c04af99ebf42e904f82"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:90f11ff637fe8798933fb29f5ae1148c978cccb0452005bf4c69e13db951e765"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:919859aa909429fb5aa9cf8807f6045592c85ef56fdd30a9a3747e513db2536e"}, + {file = "regex-2021.4.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:339456e7d8c06dd36a22e451d58ef72cef293112b559010db3d054d5560ef439"}, + {file = "regex-2021.4.4-cp37-cp37m-win32.whl", hash = "sha256:67bdb9702427ceddc6ef3dc382455e90f785af4c13d495f9626861763ee13f9d"}, + {file = "regex-2021.4.4-cp37-cp37m-win_amd64.whl", hash = "sha256:32e65442138b7b76dd8173ffa2cf67356b7bc1768851dded39a7a13bf9223da3"}, + {file = "regex-2021.4.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1e1c20e29358165242928c2de1482fb2cf4ea54a6a6dea2bd7a0e0d8ee321500"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:314d66636c494ed9c148a42731b3834496cc9a2c4251b1661e40936814542b14"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:6d1b01031dedf2503631d0903cb563743f397ccaf6607a5e3b19a3d76fc10480"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:741a9647fcf2e45f3a1cf0e24f5e17febf3efe8d4ba1281dcc3aa0459ef424dc"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:4c46e22a0933dd783467cf32b3516299fb98cfebd895817d685130cc50cd1093"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:e512d8ef5ad7b898cdb2d8ee1cb09a8339e4f8be706d27eaa180c2f177248a10"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:980d7be47c84979d9136328d882f67ec5e50008681d94ecc8afa8a65ed1f4a6f"}, + {file = "regex-2021.4.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:ce15b6d103daff8e9fee13cf7f0add05245a05d866e73926c358e871221eae87"}, + {file = "regex-2021.4.4-cp38-cp38-win32.whl", hash = "sha256:a91aa8619b23b79bcbeb37abe286f2f408d2f2d6f29a17237afda55bb54e7aac"}, + {file = "regex-2021.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:c0502c0fadef0d23b128605d69b58edb2c681c25d44574fc673b0e52dce71ee2"}, + {file = "regex-2021.4.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:598585c9f0af8374c28edd609eb291b5726d7cbce16be6a8b95aa074d252ee17"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:ee54ff27bf0afaf4c3b3a62bcd016c12c3fdb4ec4f413391a90bd38bc3624605"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:7d9884d86dd4dd489e981d94a65cd30d6f07203d90e98f6f657f05170f6324c9"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bf5824bfac591ddb2c1f0a5f4ab72da28994548c708d2191e3b87dd207eb3ad7"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:563085e55b0d4fb8f746f6a335893bda5c2cef43b2f0258fe1020ab1dd874df8"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9c3db21af35e3b3c05764461b262d6f05bbca08a71a7849fd79d47ba7bc33ed"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:3916d08be28a1149fb97f7728fca1f7c15d309a9f9682d89d79db75d5e52091c"}, + {file = "regex-2021.4.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:fd45ff9293d9274c5008a2054ecef86a9bfe819a67c7be1afb65e69b405b3042"}, + {file = "regex-2021.4.4-cp39-cp39-win32.whl", hash = "sha256:fa4537fb4a98fe8fde99626e4681cc644bdcf2a795038533f9f711513a862ae6"}, + {file = "regex-2021.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:97f29f57d5b84e73fbaf99ab3e26134e6687348e95ef6b48cfd2c06807005a07"}, + {file = "regex-2021.4.4.tar.gz", hash = "sha256:52ba3d3f9b942c49d7e4bc105bb28551c44065f139a65062ab7912bef10c9afb"}, +] requests = [ - {file = "requests-2.24.0-py2.py3-none-any.whl", hash = "sha256:fe75cc94a9443b9246fc7049224f75604b113c36acb93f87b80ed42c44cbb898"}, - {file = "requests-2.24.0.tar.gz", hash = "sha256:b3559a131db72c33ee969480840fff4bb6dd111de7dd27c8ee1f820f4f00231b"}, + {file = "requests-2.25.1-py2.py3-none-any.whl", hash = "sha256:c210084e36a42ae6b9219e00e48287def368a26d03a048ddad7bfee44f75871e"}, + {file = "requests-2.25.1.tar.gz", hash = "sha256:27973dd4a904a4f13b263a19c866c13b92a39ed1c964655f025f3f8d3d75b804"}, +] +rollbar = [ + {file = "rollbar-0.14.7.tar.gz", hash = "sha256:ee2dd1a2b512f93e9c0f26c8cf6bb28c4f06ae7e0c33a60e39b49337e0d92d57"}, ] s3transfer = [ - {file = "s3transfer-0.3.3-py2.py3-none-any.whl", hash = "sha256:2482b4259524933a022d59da830f51bd746db62f047d6eb213f2f8855dcb8a13"}, - {file = "s3transfer-0.3.3.tar.gz", hash = "sha256:921a37e2aefc64145e7b73d50c71bb4f26f46e4c9f414dc648c6245ff92cf7db"}, + {file = "s3transfer-0.4.2-py2.py3-none-any.whl", hash = "sha256:9b3752887a2880690ce628bc263d6d13a3864083aeacff4890c1c9839a5eb0bc"}, + {file = "s3transfer-0.4.2.tar.gz", hash = "sha256:cb022f4b16551edebbb31a377d3f09600dbada7363d8c5db7976e7f47732e1b2"}, +] +sentry-sdk = [ + {file = "sentry-sdk-1.1.0.tar.gz", hash = "sha256:c1227d38dca315ba35182373f129c3e2722e8ed999e52584e6aca7d287870739"}, + {file = "sentry_sdk-1.1.0-py2.py3-none-any.whl", hash = "sha256:c7d380a21281e15be3d9f67a3c4fbb4f800c481d88ff8d8931f39486dd7b4ada"}, ] six = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] +snowballstemmer = [ + {file = "snowballstemmer-2.1.0-py2.py3-none-any.whl", hash = "sha256:b51b447bea85f9968c13b650126a888aabd4cb4463fca868ec596826325dedc2"}, + {file = "snowballstemmer-2.1.0.tar.gz", hash = "sha256:e997baa4f2e9139951b6f4c631bad912dfd3c792467e2f03d7239464af90e914"}, +] +sphinx = [ + {file = "Sphinx-4.0.2-py3-none-any.whl", hash = "sha256:d1cb10bee9c4231f1700ec2e24a91be3f3a3aba066ea4ca9f3bbe47e59d5a1d4"}, + {file = "Sphinx-4.0.2.tar.gz", hash = "sha256:b5c2ae4120bf00c799ba9b3699bc895816d272d120080fbc967292f29b52b48c"}, +] +sphinxcontrib-applehelp = [ + {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, + {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, +] +sphinxcontrib-devhelp = [ + {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, + {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, +] +sphinxcontrib-htmlhelp = [ + {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, + {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, +] +sphinxcontrib-jsmath = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] +sphinxcontrib-qthelp = [ + {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, + {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, +] +sphinxcontrib-serializinghtml = [ + {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, + {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, ] sqlparse = [ - {file = "sqlparse-0.3.1-py2.py3-none-any.whl", hash = "sha256:022fb9c87b524d1f7862b3037e541f68597a730a8843245c349fc93e1643dc4e"}, - {file = "sqlparse-0.3.1.tar.gz", hash = "sha256:e162203737712307dfe78860cc56c8da8a852ab2ee33750e33aeadf38d12c548"}, + {file = "sqlparse-0.4.1-py3-none-any.whl", hash = "sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0"}, + {file = "sqlparse-0.4.1.tar.gz", hash = "sha256:0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8"}, +] +toml = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] +typed-ast = [ + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, + {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, + {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, + {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, + {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, + {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, + {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, + {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, + {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, + {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, +] +typing-extensions = [ + {file = "typing_extensions-3.10.0.0-py2-none-any.whl", hash = "sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497"}, + {file = "typing_extensions-3.10.0.0-py3-none-any.whl", hash = "sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84"}, + {file = "typing_extensions-3.10.0.0.tar.gz", hash = "sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342"}, ] urllib3 = [ - {file = "urllib3-1.22-py2.py3-none-any.whl", hash = "sha256:06330f386d6e4b195fbfc736b297f58c5a892e4440e54d294d7004e3a9bbea1b"}, - {file = "urllib3-1.22.tar.gz", hash = "sha256:cc44da8e1145637334317feebd728bd869a35285b93cbb4cca2577da7e62db4f"}, + {file = "urllib3-1.26.6-py2.py3-none-any.whl", hash = "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4"}, + {file = "urllib3-1.26.6.tar.gz", hash = "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f"}, ] wcwidth = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, ] +yarg = [ + {file = "yarg-0.1.9-py2.py3-none-any.whl", hash = "sha256:4f9cebdc00fac946c9bf2783d634e538a71c7d280a4d806d45fd4dc0ef441492"}, + {file = "yarg-0.1.9.tar.gz", hash = "sha256:55695bf4d1e3e7f756496c36a69ba32c40d18f821e38f61d028f6049e5e15911"}, +] zipp = [ - {file = "zipp-3.1.0-py3-none-any.whl", hash = "sha256:aa36550ff0c0b7ef7fa639055d797116ee891440eac1a56f378e2d3179e0320b"}, - {file = "zipp-3.1.0.tar.gz", hash = "sha256:c599e4d75c98f6798c509911d08a22e6c021d074469042177c8c86fb92eefd96"}, + {file = "zipp-3.4.1-py3-none-any.whl", hash = "sha256:51cb66cc54621609dd593d1787f286ee42a5c0adbb4b29abea5a63edc3e03098"}, + {file = "zipp-3.4.1.tar.gz", hash = "sha256:3607921face881ba3e026887d8150cca609d517579abe052ac81fc5aeffdbd76"}, ] diff --git a/pyproject.toml b/pyproject.toml index c111789f..9a83e908 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,8 +1,9 @@ [tool.poetry] name = "django-q" -version = "1.3.4" +version = "1.3.9" description = "A multiprocessing distributed task queue for Django" authors = ["Ilan Steemers "] +maintainers = ["Ilan Steemers "] license = "MIT" readme = 'README.rst' @@ -10,26 +11,29 @@ repository = "https://github.com/koed00/django-q" homepage = "https://django-q.readthedocs.org" documentation = "https://django-q.readthedocs.org" -keywords = ["django", "distributed", "multiprocessing", "queue","scheduler"] +keywords = ["django", "distributed", "multiprocessing", "queue", "scheduler"] -classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Environment :: Web Environment', - 'Framework :: Django', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: MIT License', - 'Operating System :: POSIX', - 'Operating System :: MacOS', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Topic :: Internet :: WWW/HTTP', - 'Topic :: System :: Distributed Computing', - 'Topic :: Software Development :: Libraries :: Python Modules', - ] -include=['CHANGELOG.md'] +classifiers = [ + 'Development Status :: 5 - Production/Stable', + 'Environment :: Web Environment', + 'Framework :: Django', + 'Intended Audience :: Developers', + 'License :: OSI Approved :: MIT License', + 'Operating System :: POSIX', + 'Operating System :: MacOS', + 'Programming Language :: Python', + 'Programming Language :: Python :: 3', + 'Programming Language :: Python :: 3.6', + 'Programming Language :: Python :: 3.7', + 'Programming Language :: Python :: 3.8', + 'Programming Language :: Python :: 3.9', + 'Topic :: Internet :: WWW/HTTP', + 'Topic :: System :: Distributed Computing', + 'Topic :: Software Development :: Libraries :: Python Modules', +] +include = ['CHANGELOG.md'] + +[tool.poetry.plugins] # Optional super table [tool.poetry.plugins."djangoq.errorreporters"] "rollbar" = "django_q_rollbar:Rollbar" @@ -37,30 +41,39 @@ include=['CHANGELOG.md'] [tool.poetry.dependencies] -python = ">=3.6" +python = ">=3.6.2, <4" django = ">=2.2" blessed = "^1.17.6" -arrow = "^0.15.6" - -django-q-rollbar= { version = "^0.1", optional = true } -django-q-sentry = { version = "^0.1", optional = true } +arrow = "^1.1.0" django-picklefield = "^3.0.1" -hiredis = {version = "^1.0.1", optional = true} -redis = {version = "^3.5.3", optional = true} -psutil = {version = "^5.7.0", optional = true} -django-redis = {version = "^4.12.1", optional = true} -iron-mq = {version = "^0.9", optional = true} -boto3 = {version = "^1.14.12", optional = true} -pymongo = {version = "^3.10.1", optional = true} -croniter = {version = "^0.3.34", optional = true} + +hiredis = { version = "^1.0.1", optional = true } +redis = { version = "^3.5.3", optional = true } +psutil = { version = "^5.7.0", optional = true } +django-redis = { version = "^4.12.1", optional = true } +iron-mq = { version = "^0.9", optional = true } +boto3 = { version = "^1.14.12", optional = true } +pymongo = { version = "^3.10.1", optional = true } +croniter = { version = "^0.3.34", optional = true } +django-q-rollbar = {version = ">=0.1", optional = true} +django-q-sentry = {version = ">=0.1", optional = true} + [tool.poetry.dev-dependencies] pytest = "^5.4.2" pytest-django = "^3.9.0" +Sphinx = "^4.0.2" +pytest-cov = "^2.12.0" +black = { version = "^21.5b1", allow-prereleases = true } +isort = {extras = ["requirements_deprecated_finder"], version = "^5.8.0"} [tool.poetry.extras] +requires = ["poetry_core>=1.0.0"] +build-backend = ["poetry.core.masonry.api"] +testing = ["django-redis", "croniter", "hiredis", "psutil", "iron-mq", "boto3", "pymongo"] rollbar = ["django-q-rollbar"] -sentry = ["django-q-sentry "] -requires = ["poetry>=0.12"] -build-backend = ["poetry.masonry.api"] +sentry = ["django-q-sentry"] +[tool.isort] +profile = "black" +multi_line_output = 3 \ No newline at end of file diff --git a/requirements.in b/requirements.in deleted file mode 100644 index fadec170..00000000 --- a/requirements.in +++ /dev/null @@ -1,11 +0,0 @@ -arrow -blessed -django-picklefield -hiredis -redis -psutil -django-redis -iron-mq -boto3 -pymongo -croniter diff --git a/requirements.txt b/requirements.txt index 520fa73f..eb44d83e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,34 +1,40 @@ -# -# This file is autogenerated by pip-compile -# To update, run: -# -# pip-compile requirements.in -# -arrow==0.17.0 # via -r requirements.in -asgiref==3.2.10 # via django -blessed==1.17.11 # via -r requirements.in -boto3==1.16.4 # via -r requirements.in -botocore==1.19.4 # via boto3, s3transfer -certifi==2020.6.20 # via requests -chardet==3.0.4 # via requests -croniter==0.3.35 # via -r requirements.in -django-picklefield==3.0.1 # via -r requirements.in -django-redis==4.12.1 # via -r requirements.in -django==3.1.2 # via django-picklefield, django-redis -hiredis==1.1.0 # via -r requirements.in -idna==2.10 # via requests -iron-core==1.2.0 # via iron-mq -iron-mq==0.9 # via -r requirements.in -jmespath==0.10.0 # via boto3, botocore -natsort==7.0.1 # via croniter -psutil==5.7.3 # via -r requirements.in -pymongo==3.11.0 # via -r requirements.in -python-dateutil==2.8.1 # via arrow, botocore, croniter, iron-core -pytz==2020.1 # via django -redis==3.5.3 # via -r requirements.in, django-redis -requests==2.24.0 # via iron-core -s3transfer==0.3.3 # via boto3 -six==1.15.0 # via blessed, python-dateutil -sqlparse==0.4.1 # via django -urllib3==1.25.11 # via botocore, requests -wcwidth==0.2.5 # via blessed +ansicon==1.89.0; platform_system == "Windows" and python_version >= "2.7" \ + --hash=sha256:f1def52d17f65c2c9682cf8370c03f541f410c1752d6a14029f97318e4b9dfec \ + --hash=sha256:e4d039def5768a47e4afec8e89e83ec3ae5a26bf00ad851f914d1240b444d2b1 +arrow==1.1.1; python_version >= "3.6" \ + --hash=sha256:77a60a4db5766d900a2085ce9074c5c7b8e2c99afeaa98ad627637ff6f292510 \ + --hash=sha256:dee7602f6c60e3ec510095b5e301441bc56288cb8f51def14dcb3079f623823a +asgiref==3.3.4; python_version >= "3.6" \ + --hash=sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee \ + --hash=sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78 +blessed==1.18.1; python_version >= "2.7" \ + --hash=sha256:dd7c0d33db9a2e7f597b446996484d0ed46e1586239db064fb5025008937dcae \ + --hash=sha256:8b09936def6bc06583db99b65636b980075733e13550cb6af262ce724a55da23 +django-picklefield==3.0.1; python_version >= "3" \ + --hash=sha256:15ccba592ca953b9edf9532e64640329cd47b136b7f8f10f2939caa5f9ce4287 \ + --hash=sha256:3c702a54fde2d322fe5b2f39b8f78d9f655b8f77944ab26f703be6c0ed335a35 +django==3.2.4; python_version >= "3.6" \ + --hash=sha256:ea735cbbbb3b2fba6d4da4784a0043d84c67c92f1fdf15ad6db69900e792c10f \ + --hash=sha256:66c9d8db8cc6fe938a28b7887c1596e42d522e27618562517cc8929eb7e7f296 +jinxed==1.1.0; platform_system == "Windows" and python_version >= "2.7" \ + --hash=sha256:6a61ccf963c16aa885304f27e6e5693783676897cea0c7f223270c8b8e78baf8 \ + --hash=sha256:d8f1731f134e9e6b04d95095845ae6c10eb15cb223a5f0cabdea87d4a279c305 +python-dateutil==2.8.1; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" \ + --hash=sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c \ + --hash=sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a +pytz==2021.1; python_version >= "3.6" \ + --hash=sha256:eb10ce3e7736052ed3623d49975ce333bcd712c7bb19a58b9e2089d4057d0798 \ + --hash=sha256:83a4a90894bf38e243cf052c8b58f381bfe9a7a483f6a9cab140bc7f702ac4da +six==1.16.0; python_version >= "3.6" and python_full_version < "3.0.0" or python_full_version >= "3.3.0" and python_version >= "3.6" \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 +sqlparse==0.4.1; python_version >= "3.6" \ + --hash=sha256:017cde379adbd6a1f15a61873f43e8274179378e95ef3fede90b5aa64d304ed0 \ + --hash=sha256:0f91fd2e829c44362cbcfab3e9ae12e22badaa8a29ad5ff599f9ec109f0454e8 +typing-extensions==3.10.0.0; python_version < "3.8" and python_version >= "3.6" \ + --hash=sha256:0ac0f89795dd19de6b97debb0c6af1c70987fd80a2d62d1958f7e56fcc31b497 \ + --hash=sha256:779383f6086d90c99ae41cf0ff39aac8a7937a9283ce0a414e5dd782f4c94a84 \ + --hash=sha256:50b6f157849174217d0656f99dc82fe932884fb250826c18350e159ec6cdf342 +wcwidth==0.2.5; python_version >= "2.7" \ + --hash=sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784 \ + --hash=sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83 diff --git a/runtests.py b/runtests.py deleted file mode 100644 index a31b7446..00000000 --- a/runtests.py +++ /dev/null @@ -1,3447 +0,0 @@ -#! /usr/bin/env python - -# Hi There! -# You may be wondering what this giant blob of binary data here is, you might -# even be worried that we're up to something nefarious (good for you for being -# paranoid!). This is a base64 encoding of a zip file, this zip file contains -# a fully functional basic pytest script. -# -# Pytest is a thing that tests packages, pytest itself is a package that some- -# one might want to install, especially if they're looking to run tests inside -# some package they want to install. Pytest has a lot of code to collect and -# execute tests, and other such sort of "tribal knowledge" that has been en- -# coded in its code base. Because of this we basically include a basic copy -# of pytest inside this blob. We do this because it let's you as a maintainer -# or application developer who wants people who don't deal with python much to -# easily run tests without installing the complete pytest package. -# -# If you're wondering how this is created: you can create it yourself if you -# have a complete pytest installation by using this command on the command- -# line: ``py.test --genscript=runtests.py``. - -sources = """ -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 -""" - -import sys -import base64 -import zlib - -class DictImporter: - def __init__(self, sources): - self.sources = sources - - def find_module(self, fullname, path=None): - if fullname == "argparse" and sys.version_info >= (2,7): - # we were generated with = (3, 0): - exec("def do_exec(co, loc): exec(co, loc)\n") - import pickle - sources = sources.encode("ascii") # ensure bytes - sources = pickle.loads(zlib.decompress(base64.decodebytes(sources))) - else: - import cPickle as pickle - exec("def do_exec(co, loc): exec co in loc\n") - sources = pickle.loads(zlib.decompress(base64.decodestring(sources))) - - importer = DictImporter(sources) - sys.meta_path.insert(0, importer) - entry = "import pytest; raise SystemExit(pytest.cmdline.main())" - do_exec(entry, locals()) # noqa diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 68c61a22..00000000 --- a/setup.cfg +++ /dev/null @@ -1,2 +0,0 @@ -[bdist_wheel] -universal=0 \ No newline at end of file diff --git a/setup.py b/setup.py deleted file mode 100644 index efe8a1c6..00000000 --- a/setup.py +++ /dev/null @@ -1,69 +0,0 @@ -import os -from setuptools import setup, Command - -with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme: - README = readme.read() - -os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) - - -class PyTest(Command): - user_options = [] - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def run(self): - import subprocess - import sys - - errno = subprocess.call([sys.executable, 'runtests.py']) - raise SystemExit(errno) - - -setup( - name='django-q', - version='1.3.4', - author='Ilan Steemers', - author_email='koed00@gmail.com', - keywords='django multiprocessing worker scheduler queue', - packages=['django_q'], - include_package_data=True, - url='https://django-q.readthedocs.org', - license='MIT', - description='A multiprocessing distributed task queue for Django', - long_description=README, - install_requires=['django>=2.2', 'django-picklefield', 'blessed', 'arrow'], - test_requires=['pytest', 'pytest-django', ], - cmdclass={'test': PyTest}, - classifiers=[ - 'Development Status :: 5 - Production/Stable', - 'Environment :: Web Environment', - 'Framework :: Django', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: MIT License', - 'Operating System :: POSIX', - 'Operating System :: MacOS', - 'Programming Language :: Python', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - 'Programming Language :: Python :: 3.8', - 'Topic :: Internet :: WWW/HTTP', - 'Topic :: System :: Distributed Computing', - 'Topic :: Software Development :: Libraries :: Python Modules', - ], - entry_points={ - 'djangoq.errorreporters': [ - 'rollbar = django_q_rollbar:Rollbar', - 'sentry = django_q_sentry:Sentry', - ] - }, - extras_require={ - 'rollbar': ["django-q-rollbar>=0.1"], - 'sentry': ["django-q-sentry>=0.1"], - } -) From 771bd709bb2cf510ffea4bdbeb552602b7b2173c Mon Sep 17 00:00:00 2001 From: javedgouri Date: Tue, 14 Sep 2021 01:18:19 +0530 Subject: [PATCH 6/6] added fixes for long polling --- django_q/brokers/aws_sqs.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/django_q/brokers/aws_sqs.py b/django_q/brokers/aws_sqs.py index 6e6da73c..010de968 100644 --- a/django_q/brokers/aws_sqs.py +++ b/django_q/brokers/aws_sqs.py @@ -1,3 +1,5 @@ +import copy + from boto3 import Session from botocore.client import ClientError @@ -77,7 +79,7 @@ def info(self) -> str: @staticmethod def get_connection(list_key: str = Conf.PREFIX) -> Session: - config = Conf.SQS + config = copy.deepcopy(Conf.SQS) if "aws_region" in config: config["region_name"] = config["aws_region"] del config["aws_region"]