diff --git a/poetry.lock b/poetry.lock index 33f0bb9ca..370687964 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry 1.4.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. [[package]] name = "alabaster" version = "0.7.13" description = "A configurable sidebar-enabled Sphinx theme" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -16,7 +15,6 @@ files = [ name = "amqp" version = "5.1.1" description = "Low-level AMQP client for Python (fork of amqplib)." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -31,7 +29,6 @@ vine = ">=5.0.0" name = "anyio" version = "4.0.0" description = "High level compatibility layer for multiple asynchronous event loop implementations" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -40,7 +37,6 @@ files = [ ] [package.dependencies] -exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" sniffio = ">=1.1" @@ -53,7 +49,6 @@ trio = ["trio (>=0.22)"] name = "appnope" version = "0.1.3" description = "Disable App Nap on macOS >= 10.9" -category = "dev" optional = false python-versions = "*" files = [ @@ -65,7 +60,6 @@ files = [ name = "argon2-cffi" version = "21.3.0" description = "The secure Argon2 password hashing algorithm." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -85,7 +79,6 @@ tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pytest"] name = "argon2-cffi-bindings" version = "21.2.0" description = "Low-level CFFI bindings for Argon2" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -123,7 +116,6 @@ tests = ["pytest"] name = "asgiref" version = "3.7.2" description = "ASGI specs, helper code, and adapters" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -131,9 +123,6 @@ files = [ {file = "asgiref-3.7.2.tar.gz", hash = "sha256:9e0ce3aa93a819ba5b45120216b23878cf6e8525eb3848653452b4192b92afed"}, ] -[package.dependencies] -typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} - [package.extras] tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] @@ -141,7 +130,6 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] name = "astroid" version = "3.0.0" description = "An abstract syntax tree for Python with inference support." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -149,14 +137,10 @@ files = [ {file = "astroid-3.0.0.tar.gz", hash = "sha256:1defdbca052635dd29657ea674edfc45e4b5be9cd53630c5b084fcfed94344a8"}, ] -[package.dependencies] -typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} - [[package]] name = "asttokens" version = "2.4.0" description = "Annotate AST trees with source code positions" -category = "dev" optional = false python-versions = "*" files = [ @@ -174,7 +158,6 @@ test = ["astroid", "pytest"] name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -186,7 +169,6 @@ files = [ name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -205,7 +187,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "babel" version = "2.12.1" description = "Internationalization utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -217,7 +198,6 @@ files = [ name = "backcall" version = "0.2.0" description = "Specifications for callback functions passed in to an API" -category = "dev" optional = false python-versions = "*" files = [ @@ -229,7 +209,6 @@ files = [ name = "backoff" version = "2.2.1" description = "Function decoration for backoff and retry" -category = "main" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -241,7 +220,6 @@ files = [ name = "billiard" version = "4.1.0" description = "Python multiprocessing fork with improvements and bugfixes" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -253,7 +231,6 @@ files = [ name = "black" version = "23.9.1" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -287,8 +264,6 @@ mypy-extensions = ">=0.4.3" packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} [package.extras] colorama = ["colorama (>=0.4.3)"] @@ -300,7 +275,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "boto3" version = "1.28.57" description = "The AWS SDK for Python" -category = "main" optional = false python-versions = ">= 3.7" files = [ @@ -320,7 +294,6 @@ crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] name = "botocore" version = "1.31.57" description = "Low-level, data-driven core of boto 3." -category = "main" optional = false python-versions = ">= 3.7" files = [ @@ -340,7 +313,6 @@ crt = ["awscrt (==0.16.26)"] name = "celery" version = "5.3.4" description = "Distributed Task Queue." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -396,7 +368,6 @@ zstd = ["zstandard (==0.21.0)"] name = "certifi" version = "2023.7.22" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -408,7 +379,6 @@ files = [ name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -473,7 +443,6 @@ pycparser = "*" name = "cfgv" version = "3.4.0" description = "Validate configuration and produce human readable error messages." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -485,7 +454,6 @@ files = [ name = "charset-normalizer" version = "3.3.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -585,7 +553,6 @@ files = [ name = "click" version = "8.1.7" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -600,7 +567,6 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} name = "click-didyoumean" version = "0.3.0" description = "Enables git-like *did-you-mean* feature in click" -category = "main" optional = false python-versions = ">=3.6.2,<4.0.0" files = [ @@ -615,7 +581,6 @@ click = ">=7" name = "click-plugins" version = "1.1.1" description = "An extension module for click to enable registering CLI commands via setuptools entry-points." -category = "main" optional = false python-versions = "*" files = [ @@ -633,7 +598,6 @@ dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] name = "click-repl" version = "0.3.0" description = "REPL plugin for Click" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -652,7 +616,6 @@ testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"] name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -664,7 +627,6 @@ files = [ name = "country-converter" version = "1.2" description = "The country converter (coco) - a Python package for converting country names between different classifications schemes" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -684,7 +646,6 @@ test = ["coveralls", "pytest (>=5.4.0)", "pytest-black", "pytest-cov (>=2.7.0)", name = "coverage" version = "7.3.1" description = "Code coverage measurement for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -749,7 +710,6 @@ toml = ["tomli"] name = "crispy-bootstrap5" version = "0.7" description = "Bootstrap5 template pack for django-crispy-forms" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -768,7 +728,6 @@ test = ["pytest", "pytest-django"] name = "cron-descriptor" version = "1.4.0" description = "A Python library that converts cron expressions into human readable strings." -category = "main" optional = false python-versions = "*" files = [ @@ -782,7 +741,6 @@ dev = ["polib"] name = "cryptography" version = "41.0.4" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -828,7 +786,6 @@ test-randomorder = ["pytest-randomly"] name = "dateutils" version = "0.6.12" description = "Various utilities for working with date and datetime objects" -category = "main" optional = false python-versions = "*" files = [ @@ -844,7 +801,6 @@ pytz = "*" name = "decorator" version = "5.1.1" description = "Decorators for Humans" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -856,7 +812,6 @@ files = [ name = "defusedxml" version = "0.7.1" description = "XML bomb protection for Python stdlib modules" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -868,7 +823,6 @@ files = [ name = "distlib" version = "0.3.7" description = "Distribution utilities" -category = "dev" optional = false python-versions = "*" files = [ @@ -880,7 +834,6 @@ files = [ name = "django" version = "4.2.5" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -901,7 +854,6 @@ bcrypt = ["bcrypt"] name = "django-allauth" version = "0.54.0" description = "Integrated set of Django applications addressing authentication, registration, account management as well as 3rd party (social) account authentication." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -919,7 +871,6 @@ requests-oauthlib = ">=0.3.0" name = "django-anymail" version = "10.1" description = "Django email backends and webhooks for Amazon SES, Brevo (Sendinblue), MailerSend, Mailgun, Mailjet, Mandrill, Postal, Postmark, SendGrid, and SparkPost" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -940,7 +891,6 @@ postal = ["cryptography"] name = "django-appconf" version = "1.0.6" description = "A helper class for handling configuration defaults of packaged apps gracefully." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -955,7 +905,6 @@ django = "*" name = "django-celery-beat" version = "2.5.0" description = "Database-backed Periodic Tasks." -category = "main" optional = false python-versions = "*" files = [ @@ -975,7 +924,6 @@ tzdata = "*" name = "django-cors-headers" version = "4.2.0" description = "django-cors-headers is a Django application for handling the server headers required for Cross-Origin Resource Sharing (CORS)." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -990,7 +938,6 @@ Django = ">=3.2" name = "django-coverage-plugin" version = "3.1.0" description = "Django template coverage.py plugin" -category = "dev" optional = false python-versions = "*" files = [ @@ -1005,7 +952,6 @@ coverage = "*" name = "django-crispy-forms" version = "2.0" description = "Best way to have Django DRY forms" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1020,7 +966,6 @@ django = ">=3.2" name = "django-debug-toolbar" version = "4.2.0" description = "A configurable set of panels that display various debug information about the current request/response." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1036,7 +981,6 @@ sqlparse = ">=0.2" name = "django-elasticsearch-dsl-drf" version = "0.22.4" description = "Integrate Elasticsearch DSL with Django REST framework." -category = "main" optional = false python-versions = ">=2.7" files = [] @@ -1060,7 +1004,6 @@ resolved_reference = "c3305525bc58c1d5fd826e95e9c89ee95460e6da" name = "django-environ" version = "0.11.2" description = "A package that allows you to utilize 12factor inspired environment variables to configure your Django application." -category = "main" optional = false python-versions = ">=3.6,<4" files = [ @@ -1069,15 +1012,14 @@ files = [ ] [package.extras] -develop = ["coverage[toml] (>=5.0a4)", "furo (>=2021.8.17b43,<2021.9.0)", "pytest (>=4.6.11)", "sphinx (>=3.5.0)", "sphinx-notfound-page"] -docs = ["furo (>=2021.8.17b43,<2021.9.0)", "sphinx (>=3.5.0)", "sphinx-notfound-page"] +develop = ["coverage[toml] (>=5.0a4)", "furo (>=2021.8.17b43,<2021.9.dev0)", "pytest (>=4.6.11)", "sphinx (>=3.5.0)", "sphinx-notfound-page"] +docs = ["furo (>=2021.8.17b43,<2021.9.dev0)", "sphinx (>=3.5.0)", "sphinx-notfound-page"] testing = ["coverage[toml] (>=5.0a4)", "pytest (>=4.6.11)"] [[package]] name = "django-extensions" version = "3.2.3" description = "Extensions for Django" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1092,7 +1034,6 @@ Django = ">=3.2" name = "django-lifecycle" version = "1.1.2" description = "Declarative model lifecycle hooks." -category = "main" optional = false python-versions = "*" files = [ @@ -1107,7 +1048,6 @@ Django = ">=3.2" name = "django-model-utils" version = "4.3.1" description = "Django model mixins and utilities" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1122,7 +1062,6 @@ Django = ">=3.2" name = "django-nine" version = "0.2.7" description = "Version checking library." -category = "main" optional = false python-versions = "*" files = [ @@ -1138,7 +1077,6 @@ packaging = "*" name = "django-opensearch-dsl" version = "0.5.1" description = "Wrapper around opensearch-py for django models" -category = "main" optional = false python-versions = "*" files = [ @@ -1153,7 +1091,6 @@ opensearch-py = ">=2.2.0" name = "django-prometheus" version = "2.3.1" description = "Django middlewares to monitor your application with Prometheus.io." -category = "main" optional = false python-versions = "*" files = [ @@ -1168,7 +1105,6 @@ prometheus-client = ">=0.7" name = "django-redis" version = "5.4.0" description = "Full featured redis cache backend for Django." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1187,7 +1123,6 @@ hiredis = ["redis[hiredis] (>=3,!=4.0.0,!=4.0.1)"] name = "django-select2" version = "8.2.1" description = "This is a Django_ integration of Select2_." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1208,7 +1143,6 @@ test = ["pytest", "pytest-cov", "pytest-django", "selenium"] name = "django-storages" version = "1.14.1" description = "Support for many storage backends in Django" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1232,7 +1166,6 @@ sftp = ["paramiko (>=1.15)"] name = "django-stubs" version = "4.2.4" description = "Mypy stubs for Django" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1244,19 +1177,17 @@ files = [ django = "*" django-stubs-ext = ">=4.2.2" mypy = ">=1.0.0" -tomli = {version = "*", markers = "python_version < \"3.11\""} types-pytz = "*" types-PyYAML = "*" typing-extensions = "*" [package.extras] -compatible-mypy = ["mypy (>=1.5.0,<1.6.0)"] +compatible-mypy = ["mypy (==1.5.*)"] [[package]] name = "django-stubs-ext" version = "4.2.2" description = "Monkey-patching and extensions for django-stubs" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1272,7 +1203,6 @@ typing-extensions = "*" name = "django-timezone-field" version = "6.0.1" description = "A Django app providing DB, form, and REST framework fields for zoneinfo and pytz timezone objects." -category = "main" optional = false python-versions = ">=3.8,<4.0" files = [ @@ -1287,7 +1217,6 @@ Django = ">=3.2,<5.0" name = "django-webpack-loader" version = "2.0.1" description = "Transparently use webpack with django" -category = "main" optional = false python-versions = "*" files = [ @@ -1299,7 +1228,6 @@ files = [ name = "djangorestframework" version = "3.14.0" description = "Web APIs for Django, made easy." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1315,7 +1243,6 @@ pytz = "*" name = "djangorestframework-csv" version = "2.1.1" description = "CSV Tools for Django REST Framework" -category = "main" optional = false python-versions = "*" files = [ @@ -1331,7 +1258,6 @@ unicodecsv = "*" name = "djangorestframework-stubs" version = "3.14.2" description = "PEP-484 stubs for django-rest-framework" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1348,7 +1274,7 @@ types-requests = ">=0.1.12" typing-extensions = ">=3.10.0" [package.extras] -compatible-mypy = ["mypy (>=1.4.0,<1.5.0)"] +compatible-mypy = ["mypy (==1.4.*)"] coreapi = ["coreapi (>=2.0.0)"] markdown = ["types-Markdown (>=0.1.5)"] @@ -1356,7 +1282,6 @@ markdown = ["types-Markdown (>=0.1.5)"] name = "docutils" version = "0.20.1" description = "Docutils -- Python Documentation Utilities" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1368,7 +1293,6 @@ files = [ name = "drf-spectacular" version = "0.26.5" description = "Sane and flexible OpenAPI 3 schema generation for Django REST framework" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1392,7 +1316,6 @@ sidecar = ["drf-spectacular-sidecar"] name = "elasticsearch" version = "6.8.2" description = "Python client for Elasticsearch" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, <4" files = [ @@ -1407,26 +1330,10 @@ urllib3 = ">=1.21.1" develop = ["coverage", "mock", "nose", "nosexcover", "numpy", "pandas", "pyyaml", "requests (>=2.0.0,<3.0.0)", "sphinx (<1.7)", "sphinx-rtd-theme"] requests = ["requests (>=2.4.0,<3.0.0)"] -[[package]] -name = "exceptiongroup" -version = "1.2.2" -description = "Backport of PEP 654 (exception groups)" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, - {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, -] - -[package.extras] -test = ["pytest (>=6)"] - [[package]] name = "executing" version = "2.0.0" description = "Get the currently executing AST node of a frame, and other information" -category = "dev" optional = false python-versions = "*" files = [ @@ -1441,7 +1348,6 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth name = "factory-boy" version = "3.3.0" description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1460,7 +1366,6 @@ doc = ["Sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] name = "faker" version = "19.6.2" description = "Faker is a Python package that generates fake data for you." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1475,7 +1380,6 @@ python-dateutil = ">=2.4" name = "filelock" version = "3.12.4" description = "A platform independent file lock." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1492,7 +1396,6 @@ typing = ["typing-extensions (>=4.7.1)"] name = "flake8" version = "6.1.0" description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" optional = false python-versions = ">=3.8.1" files = [ @@ -1509,7 +1412,6 @@ pyflakes = ">=3.1.0,<3.2.0" name = "flake8-isort" version = "6.1.0" description = "flake8 plugin that integrates isort ." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1527,7 +1429,6 @@ test = ["pytest"] name = "flower" version = "2.0.1" description = "Celery Flower" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1546,7 +1447,6 @@ tornado = ">=5.0.0,<7.0.0" name = "freezegun" version = "1.3.1" description = "Let your Python tests travel through time" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1561,7 +1461,6 @@ python-dateutil = ">=2.7" name = "gunicorn" version = "20.1.0" description = "WSGI HTTP Server for UNIX" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1582,7 +1481,6 @@ tornado = ["tornado (>=0.2)"] name = "habanero" version = "1.2.3" description = "Low Level Client for Crossref Search API" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1602,7 +1500,6 @@ test = ["pytest"] name = "hiredis" version = "2.2.3" description = "Python wrapper for hiredis" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1701,7 +1598,6 @@ files = [ name = "humanize" version = "4.8.0" description = "Python humanize utilities" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1716,7 +1612,6 @@ tests = ["freezegun", "pytest", "pytest-cov"] name = "identify" version = "2.5.30" description = "File identification library for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1731,7 +1626,6 @@ license = ["ukkonen"] name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1743,7 +1637,6 @@ files = [ name = "imagesize" version = "1.4.1" description = "Getting image size from png/jpeg/jpeg2000/gif file" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1755,7 +1648,6 @@ files = [ name = "inflection" version = "0.5.1" description = "A port of Ruby on Rails inflector to Python" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -1767,7 +1659,6 @@ files = [ name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1779,7 +1670,6 @@ files = [ name = "ipdb" version = "0.13.13" description = "IPython-enabled pdb" -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1788,15 +1678,13 @@ files = [ ] [package.dependencies] -decorator = {version = "*", markers = "python_version > \"3.6\" and python_version < \"3.11\""} -ipython = {version = ">=7.31.1", markers = "python_version > \"3.6\" and python_version < \"3.11\""} -tomli = {version = "*", markers = "python_version > \"3.6\" and python_version < \"3.11\""} +decorator = {version = "*", markers = "python_version >= \"3.11\""} +ipython = {version = ">=7.31.1", markers = "python_version >= \"3.11\""} [[package]] name = "ipython" version = "8.16.1" description = "IPython: Productive Interactive Computing" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -1809,7 +1697,6 @@ appnope = {version = "*", markers = "sys_platform == \"darwin\""} backcall = "*" colorama = {version = "*", markers = "sys_platform == \"win32\""} decorator = "*" -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} jedi = ">=0.16" matplotlib-inline = "*" pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} @@ -1836,7 +1723,6 @@ test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pa name = "isort" version = "5.12.0" description = "A Python utility / library to sort Python imports." -category = "dev" optional = false python-versions = ">=3.8.0" files = [ @@ -1854,7 +1740,6 @@ requirements-deprecated-finder = ["pip-api", "pipreqs"] name = "jedi" version = "0.19.1" description = "An autocompletion tool for Python that can be used for text editors." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -1874,7 +1759,6 @@ testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] name = "jinja2" version = "3.1.2" description = "A very fast and expressive template engine." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1892,7 +1776,6 @@ i18n = ["Babel (>=2.7)"] name = "jmespath" version = "1.0.1" description = "JSON Matching Expressions" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1904,7 +1787,6 @@ files = [ name = "jsonschema" version = "4.19.1" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1926,7 +1808,6 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- name = "jsonschema-specifications" version = "2023.7.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1941,7 +1822,6 @@ referencing = ">=0.28.0" name = "kombu" version = "5.3.2" description = "Messaging library for Python." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1974,7 +1854,6 @@ zookeeper = ["kazoo (>=2.8.0)"] name = "livereload" version = "2.6.3" description = "Python LiveReload is an awesome tool for web developers" -category = "dev" optional = false python-versions = "*" files = [ @@ -1990,7 +1869,6 @@ tornado = {version = "*", markers = "python_version > \"2.7\""} name = "markupsafe" version = "2.1.3" description = "Safely add untrusted strings to HTML/XML markup." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2014,6 +1892,16 @@ files = [ {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win32.whl", hash = "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007"}, + {file = "MarkupSafe-2.1.3-cp312-cp312-win_amd64.whl", hash = "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, @@ -2050,7 +1938,6 @@ files = [ name = "matplotlib-inline" version = "0.1.6" description = "Inline Matplotlib backend for Jupyter" -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2065,7 +1952,6 @@ traitlets = "*" name = "mccabe" version = "0.7.0" description = "McCabe checker, plugin for flake8" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2077,7 +1963,6 @@ files = [ name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2161,7 +2046,6 @@ files = [ name = "mypy" version = "1.5.1" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2196,7 +2080,6 @@ files = [ [package.dependencies] mypy-extensions = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = ">=4.1.0" [package.extras] @@ -2208,7 +2091,6 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2220,7 +2102,6 @@ files = [ name = "nodeenv" version = "1.8.0" description = "Node.js virtual environment builder" -category = "dev" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" files = [ @@ -2235,7 +2116,6 @@ setuptools = "*" name = "numpy" version = "1.26.4" description = "Fundamental package for array computing in Python" -category = "main" optional = false python-versions = ">=3.9" files = [ @@ -2281,7 +2161,6 @@ files = [ name = "oauthlib" version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2298,7 +2177,6 @@ signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] name = "opensearch" version = "0.9.2" description = "Interact with opensearch services" -category = "main" optional = false python-versions = "*" files = [ @@ -2309,7 +2187,6 @@ files = [ name = "opensearch-dsl" version = "2.1.0" description = "Python client for OpenSearch" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2329,7 +2206,6 @@ develop = ["coverage (<7.0.0)", "mock", "pytest (>=3.0.0)", "pytest-cov", "pytes name = "opensearch-py" version = "2.3.1" description = "Python client for OpenSearch" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" files = [ @@ -2354,7 +2230,6 @@ kerberos = ["requests-kerberos"] name = "packaging" version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2366,7 +2241,6 @@ files = [ name = "pandas" version = "2.2.2" description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" optional = false python-versions = ">=3.9" files = [ @@ -2402,7 +2276,7 @@ files = [ ] [package.dependencies] -numpy = {version = ">=1.22.4", markers = "python_version < \"3.11\""} +numpy = {version = ">=1.23.2", markers = "python_version == \"3.11\""} python-dateutil = ">=2.8.2" pytz = ">=2020.1" tzdata = ">=2022.7" @@ -2436,7 +2310,6 @@ xml = ["lxml (>=4.9.2)"] name = "parso" version = "0.8.3" description = "A Python Parser" -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -2452,7 +2325,6 @@ testing = ["docopt", "pytest (<6.0.0)"] name = "pathspec" version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2464,7 +2336,6 @@ files = [ name = "pexpect" version = "4.8.0" description = "Pexpect allows easy control of interactive console applications." -category = "dev" optional = false python-versions = "*" files = [ @@ -2479,7 +2350,6 @@ ptyprocess = ">=0.5" name = "pickleshare" version = "0.7.5" description = "Tiny 'shelve'-like database with concurrency support" -category = "dev" optional = false python-versions = "*" files = [ @@ -2491,7 +2361,6 @@ files = [ name = "pillow" version = "10.0.1" description = "Python Imaging Library (Fork)" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2559,7 +2428,6 @@ tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "pa name = "platformdirs" version = "3.10.0" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2575,7 +2443,6 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-co name = "pluggy" version = "1.3.0" description = "plugin and hook calling mechanisms for python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2591,7 +2458,6 @@ testing = ["pytest", "pytest-benchmark"] name = "pre-commit" version = "3.4.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2610,7 +2476,6 @@ virtualenv = ">=20.10.0" name = "prometheus-client" version = "0.17.1" description = "Python client for the Prometheus monitoring system." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2625,7 +2490,6 @@ twisted = ["twisted"] name = "prompt-toolkit" version = "3.0.39" description = "Library for building powerful interactive command lines in Python" -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -2640,7 +2504,6 @@ wcwidth = "*" name = "psycopg2" version = "2.9.8" description = "psycopg2 - Python-PostgreSQL Database Adapter" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2661,7 +2524,6 @@ files = [ name = "ptyprocess" version = "0.7.0" description = "Run a subprocess in a pseudo terminal" -category = "dev" optional = false python-versions = "*" files = [ @@ -2673,7 +2535,6 @@ files = [ name = "pure-eval" version = "0.2.2" description = "Safely evaluate AST nodes without side effects" -category = "dev" optional = false python-versions = "*" files = [ @@ -2688,7 +2549,6 @@ tests = ["pytest"] name = "pycodestyle" version = "2.11.0" description = "Python style guide checker" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2700,7 +2560,6 @@ files = [ name = "pycountry" version = "22.3.5" description = "ISO country, subdivision, language, currency and script definitions and their translations" -category = "main" optional = false python-versions = ">=3.6, <4" files = [ @@ -2714,7 +2573,6 @@ setuptools = "*" name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2726,7 +2584,6 @@ files = [ name = "pyflakes" version = "3.1.0" description = "passive checker of Python programs" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2738,7 +2595,6 @@ files = [ name = "pygments" version = "2.16.1" description = "Pygments is a syntax highlighting package written in Python." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2753,7 +2609,6 @@ plugins = ["importlib-metadata"] name = "pyjwt" version = "2.8.0" description = "JSON Web Token implementation in Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2774,7 +2629,6 @@ tests = ["coverage[toml] (==5.0.4)", "pytest (>=6.0.0,<7.0.0)"] name = "pylint" version = "2.3.0" description = "python code static checker" -category = "dev" optional = false python-versions = ">=3.4.*" files = [ @@ -2792,7 +2646,6 @@ mccabe = "*" name = "pylint-celery" version = "0.3" description = "pylint-celery is a Pylint plugin to aid Pylint in recognising and understandingerrors caused when using the Celery library" -category = "dev" optional = false python-versions = "*" files = [ @@ -2808,7 +2661,6 @@ pylint-plugin-utils = ">=0.2.1" name = "pylint-django" version = "2.5.3" description = "A Pylint plugin to help Pylint understand the Django web framework" -category = "dev" optional = false python-versions = "*" files = [ @@ -2828,7 +2680,6 @@ with-django = ["Django"] name = "pylint-plugin-utils" version = "0.8.2" description = "Utilities and helpers for writing Pylint plugins" -category = "dev" optional = false python-versions = ">=3.7,<4.0" files = [ @@ -2839,11 +2690,75 @@ files = [ [package.dependencies] pylint = ">=1.7" +[[package]] +name = "pymupdf" +version = "1.24.10" +description = "A high performance Python library for data extraction, analysis, conversion & manipulation of PDF (and other) documents." +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyMuPDF-1.24.10-cp310-none-macosx_10_9_x86_64.whl", hash = "sha256:a320d44a96f0cc69364c4d7384205fdae57a511edb07e68627108546cfd3ca7d"}, + {file = "PyMuPDF-1.24.10-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:cd078bf6c5a016bb34dea0ed75030edaae1b00ca273f1fe41100c8c35a101abe"}, + {file = "PyMuPDF-1.24.10-cp310-none-manylinux2014_aarch64.whl", hash = "sha256:0edcd093db05991e9d32dd2687db408b40895214f9cecd50672cd6b79fee188f"}, + {file = "PyMuPDF-1.24.10-cp310-none-manylinux2014_x86_64.whl", hash = "sha256:9b3188a6d47bb512f749e9612f81f7ddf01c70308de6bb81b77b3a76ac43f402"}, + {file = "PyMuPDF-1.24.10-cp310-none-musllinux_1_2_x86_64.whl", hash = "sha256:e52cc55055f08d9411cd991693fb1e6c7f665e92f7b79cdfa0c3d526b2e7f9bb"}, + {file = "PyMuPDF-1.24.10-cp310-none-win32.whl", hash = "sha256:117b8a2220ec31142f6a5e4ac0235b56f239d88e57e5cef3aa047bc70e4cd1e9"}, + {file = "PyMuPDF-1.24.10-cp310-none-win_amd64.whl", hash = "sha256:98b846dd044bf7242dcea6900b16eb430adbc3f1cef58d80c83a15ca7a35ef8b"}, + {file = "PyMuPDF-1.24.10-cp311-none-macosx_10_9_x86_64.whl", hash = "sha256:5fbd67cce759fc0126902137409cf9da6313b776c4d5ff0d5200f336350f86a3"}, + {file = "PyMuPDF-1.24.10-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:2b14dbdf7c415bb0fa849527abbe7b4f1f55ae23b9355d132951f634438c59ac"}, + {file = "PyMuPDF-1.24.10-cp311-none-manylinux2014_aarch64.whl", hash = "sha256:1a87440a6cbc0d5ad513425baa0f4747841898fca6e37350ca3e6b29e5f40c01"}, + {file = "PyMuPDF-1.24.10-cp311-none-manylinux2014_x86_64.whl", hash = "sha256:c0d1ccdc062ea9961063790831e838bc43fcf9a8436a8b9f55898addf97c0f86"}, + {file = "PyMuPDF-1.24.10-cp311-none-musllinux_1_2_x86_64.whl", hash = "sha256:f68671363be5a2ba104ab7d3bad821d2994cbe3f3408538bbc27d32e6dc9f923"}, + {file = "PyMuPDF-1.24.10-cp311-none-win32.whl", hash = "sha256:49f83556cd1a7d05b36a54ccc01fce324da8a4e6854e36cc5cd94d321e428565"}, + {file = "PyMuPDF-1.24.10-cp311-none-win_amd64.whl", hash = "sha256:05b8d360766b87f4abd186eba16a56b92bae513b2361b13f633fe6256329292e"}, + {file = "PyMuPDF-1.24.10-cp312-none-macosx_10_9_x86_64.whl", hash = "sha256:f323aa7bb55e0214e632bfe24fa140bd5dcfeac2d3977bdce46e760385140513"}, + {file = "PyMuPDF-1.24.10-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:50d2972558d25ce46a8634b58787b28dbeff9b3fe4299530fc9c8c9921061e83"}, + {file = "PyMuPDF-1.24.10-cp312-none-manylinux2014_aarch64.whl", hash = "sha256:0e3969c2fdff682b3b2c6a2b463adde068d6d8e20e2133ef6c8503469259646a"}, + {file = "PyMuPDF-1.24.10-cp312-none-manylinux2014_x86_64.whl", hash = "sha256:cd78ee1ebefdfe72bc36fd4b731cc8c694eb8ef5337d8ea956b0e94cd88751fc"}, + {file = "PyMuPDF-1.24.10-cp312-none-musllinux_1_2_x86_64.whl", hash = "sha256:696eed91d2ee44e76277dfeb6bd904c84ae005378588949df6ed9be9e03b9817"}, + {file = "PyMuPDF-1.24.10-cp312-none-win32.whl", hash = "sha256:1e5413e1aeab2f18e1ca1b3ff17057a4a7c5cbf4ff14abc93203da88fc1a1dd8"}, + {file = "PyMuPDF-1.24.10-cp312-none-win_amd64.whl", hash = "sha256:227a4473fce8fa32b9268da68781048795503b67dc045867fc201e1334204bf1"}, + {file = "PyMuPDF-1.24.10-cp38-none-macosx_10_9_x86_64.whl", hash = "sha256:738baea1e9f9f1df1da6ae9f5699fc96dcad58043c34ddecb69d3840c396dfb5"}, + {file = "PyMuPDF-1.24.10-cp38-none-macosx_11_0_arm64.whl", hash = "sha256:bbd618078c2caab742d34291bd4a4c660981bef3988dfaaadf5d534081abd8ec"}, + {file = "PyMuPDF-1.24.10-cp38-none-manylinux2014_aarch64.whl", hash = "sha256:ccda6f26985347e9f52444c64b35e243f03d8c51106e8c0709f0b0c0b80b669a"}, + {file = "PyMuPDF-1.24.10-cp38-none-manylinux2014_x86_64.whl", hash = "sha256:d31c09e2af29f778249fe93beb4e44657ed2c0f385ccd5906e84b2b6a747ba9a"}, + {file = "PyMuPDF-1.24.10-cp38-none-musllinux_1_2_x86_64.whl", hash = "sha256:dda94921c9daf0416fe77b1366200c970a1b8519f826c30be7148df6a147eb1a"}, + {file = "PyMuPDF-1.24.10-cp38-none-win32.whl", hash = "sha256:8ccb72a67386affe170a36e1a145f0a05daf1df9856130cedf4371015b66acc3"}, + {file = "PyMuPDF-1.24.10-cp38-none-win_amd64.whl", hash = "sha256:634b22c0465dc9e415acea35f98c189391c6685ed943d489c069af7a72d1f8da"}, + {file = "PyMuPDF-1.24.10-cp39-none-macosx_10_9_x86_64.whl", hash = "sha256:903b61b70952368d262603abc4b0cbe06a557872003f92bb8db4b6e608ff0817"}, + {file = "PyMuPDF-1.24.10-cp39-none-macosx_11_0_arm64.whl", hash = "sha256:c3405e120249e2849daac4d52e25433bb0b5da4695ce8edea6cfb9cc819985c4"}, + {file = "PyMuPDF-1.24.10-cp39-none-manylinux2014_aarch64.whl", hash = "sha256:5608a60c601ab34988f96ce122d7c19d0773e57e7bbb30c7b3ced1f5b0da74cf"}, + {file = "PyMuPDF-1.24.10-cp39-none-manylinux2014_x86_64.whl", hash = "sha256:2e95f5c379dc086eaa5a2af73f2e62a0bae95e05b19963603cdf800ca51e65a6"}, + {file = "PyMuPDF-1.24.10-cp39-none-musllinux_1_2_x86_64.whl", hash = "sha256:e6a6458a3a6e7ec371176be17535825ca860d8eab5f8999958b2ac639777df5f"}, + {file = "PyMuPDF-1.24.10-cp39-none-win32.whl", hash = "sha256:c8db06b0d5fbcf9b0e8949415771bd4771c820f43b052b42bce2db44c100e384"}, + {file = "PyMuPDF-1.24.10-cp39-none-win_amd64.whl", hash = "sha256:be120588a1d41220a60d899c43600e537d1bdb73612e0230378d14df40498658"}, + {file = "PyMuPDF-1.24.10.tar.gz", hash = "sha256:bd3ebd6d3fb8a845582098362f885bfb0a31ae4272587efc2c55c5e29fe7327a"}, +] + +[package.dependencies] +PyMuPDFb = "1.24.10" + +[[package]] +name = "pymupdfb" +version = "1.24.10" +description = "MuPDF shared libraries for PyMuPDF." +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyMuPDFb-1.24.10-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:cd6b24630d90dce9ab3e59d06c5e616686f8d7ec626be1311721fcb062aa0078"}, + {file = "PyMuPDFb-1.24.10-py3-none-macosx_11_0_arm64.whl", hash = "sha256:fda2c34b206f724b1b5685b67188e2a57bcaa5c99bc40a0a5bc62057514c5cdf"}, + {file = "PyMuPDFb-1.24.10-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4f50a7472f9bb10cbc7a1cd589ee4626ca030b8a4a02749f9a29eb6f00c0e0db"}, + {file = "PyMuPDFb-1.24.10-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:409f1270ef2e70d845e80149ff3db9cfed578274042316cba55cc3e3882421ea"}, + {file = "PyMuPDFb-1.24.10-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:aca96b6e9ee3096a26810592f4d899f4d3cf3cf0c902ae7e8cca09bce4d946c4"}, + {file = "PyMuPDFb-1.24.10-py3-none-win32.whl", hash = "sha256:2d231b42fe3bf79837df235e7fbdf7ff8b46bf4ca1346d0f0124fb1cdd343ce8"}, + {file = "PyMuPDFb-1.24.10-py3-none-win_amd64.whl", hash = "sha256:27ea65c701608b6b7632703339ca33ea6d513843b26dbe9bdefb2f56f7b9b196"}, + {file = "PyMuPDFb-1.24.10.tar.gz", hash = "sha256:007b91fa9b528c5c0eecea2e49c486ac02e878274f9e31522bdd948adc5f8327"}, +] + [[package]] name = "pytest" version = "7.4.2" description = "pytest: simple powerful testing with Python" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -2853,11 +2768,9 @@ files = [ [package.dependencies] colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} iniconfig = "*" packaging = "*" pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} [package.extras] testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] @@ -2866,7 +2779,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-datadir" version = "1.5.0" description = "pytest plugin for test data directories and files" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -2881,7 +2793,6 @@ pytest = ">=5.0" name = "pytest-django" version = "4.5.2" description = "A Django plugin for pytest." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -2900,7 +2811,6 @@ testing = ["Django", "django-configurations (>=2.0)"] name = "pytest-sugar" version = "0.9.7" description = "pytest-sugar is a plugin for pytest that changes the default look and feel of pytest (e.g. progressbar, show tests that fail instantly)." -category = "dev" optional = false python-versions = "*" files = [ @@ -2920,7 +2830,6 @@ dev = ["black", "flake8", "pre-commit"] name = "pytest-vcr" version = "1.0.2" description = "Plugin for managing VCR.py cassettes" -category = "dev" optional = false python-versions = "*" files = [ @@ -2936,7 +2845,6 @@ vcrpy = "*" name = "python-crontab" version = "3.0.0" description = "Python Crontab API" -category = "main" optional = false python-versions = "*" files = [ @@ -2955,7 +2863,6 @@ cron-schedule = ["croniter"] name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -2970,7 +2877,6 @@ six = ">=1.5" name = "python-slugify" version = "8.0.1" description = "A Python slugify application that also handles Unicode" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2988,7 +2894,6 @@ unidecode = ["Unidecode (>=1.1.1)"] name = "python3-openid" version = "3.2.0" description = "OpenID support for modern servers and consumers." -category = "main" optional = false python-versions = "*" files = [ @@ -3007,7 +2912,6 @@ postgresql = ["psycopg2"] name = "pytz" version = "2023.3.post1" description = "World timezone definitions, modern and historical" -category = "main" optional = false python-versions = "*" files = [ @@ -3019,7 +2923,6 @@ files = [ name = "pyyaml" version = "6.0.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3028,6 +2931,7 @@ files = [ {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, @@ -3035,8 +2939,16 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, @@ -3053,6 +2965,7 @@ files = [ {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, @@ -3060,6 +2973,7 @@ files = [ {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, @@ -3069,7 +2983,6 @@ files = [ name = "redis" version = "4.6.0" description = "Python client for Redis database and key-value store" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3088,7 +3001,6 @@ ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)" name = "referencing" version = "0.30.2" description = "JSON Referencing + Python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3104,7 +3016,6 @@ rpds-py = ">=0.7.0" name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3126,7 +3037,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "requests-oauthlib" version = "1.3.1" description = "OAuthlib authentication support for Requests." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -3145,7 +3055,6 @@ rsa = ["oauthlib[signedtoken] (>=3.0.0)"] name = "rpds-py" version = "0.10.3" description = "Python bindings to Rust's persistent data structures (rpds)" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3252,7 +3161,6 @@ files = [ name = "s3transfer" version = "0.7.0" description = "An Amazon S3 Transfer Manager" -category = "main" optional = false python-versions = ">= 3.7" files = [ @@ -3270,7 +3178,6 @@ crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] name = "sentry-sdk" version = "1.31.0" description = "Python client for Sentry (https://sentry.io)" -category = "main" optional = false python-versions = "*" files = [ @@ -3316,7 +3223,6 @@ tornado = ["tornado (>=5)"] name = "setuptools" version = "68.2.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3333,7 +3239,6 @@ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jar 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.*" files = [ @@ -3345,7 +3250,6 @@ files = [ name = "sniffio" version = "1.3.0" description = "Sniff out which async library your code is running under" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3357,7 +3261,6 @@ files = [ name = "snowballstemmer" version = "2.2.0" description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." -category = "dev" optional = false python-versions = "*" files = [ @@ -3369,7 +3272,6 @@ files = [ name = "sphinx" version = "7.2.6" description = "Python documentation generator" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -3404,7 +3306,6 @@ test = ["cython (>=3.0)", "filelock", "html5lib", "pytest (>=4.6)", "setuptools name = "sphinx-autobuild" version = "2021.3.14" description = "Rebuild Sphinx documentation on changes, with live-reload in the browser." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -3424,7 +3325,6 @@ test = ["pytest", "pytest-cov"] name = "sphinxcontrib-applehelp" version = "1.0.7" description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -3443,7 +3343,6 @@ test = ["pytest"] name = "sphinxcontrib-devhelp" version = "1.0.5" description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -3462,7 +3361,6 @@ test = ["pytest"] name = "sphinxcontrib-htmlhelp" version = "2.0.4" description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -3481,7 +3379,6 @@ test = ["html5lib", "pytest"] 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" files = [ @@ -3496,7 +3393,6 @@ test = ["flake8", "mypy", "pytest"] name = "sphinxcontrib-qthelp" version = "1.0.6" description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -3515,7 +3411,6 @@ test = ["pytest"] name = "sphinxcontrib-serializinghtml" version = "1.1.9" description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" -category = "dev" optional = false python-versions = ">=3.9" files = [ @@ -3534,7 +3429,6 @@ test = ["pytest"] name = "sqlparse" version = "0.4.4" description = "A non-validating SQL parser." -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -3551,7 +3445,6 @@ test = ["pytest", "pytest-cov"] name = "stack-data" version = "0.6.3" description = "Extract data from python stack frames and tracebacks for informative displays" -category = "dev" optional = false python-versions = "*" files = [ @@ -3571,7 +3464,6 @@ tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] name = "termcolor" version = "2.3.0" description = "ANSI color formatting for output in terminal" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3586,7 +3478,6 @@ tests = ["pytest", "pytest-cov"] name = "text-unidecode" version = "1.3" description = "The most basic Text::Unidecode port" -category = "main" optional = false python-versions = "*" files = [ @@ -3594,23 +3485,10 @@ files = [ {file = "text_unidecode-1.3-py2.py3-none-any.whl", hash = "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8"}, ] -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] - [[package]] name = "tornado" version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" optional = false python-versions = ">= 3.8" files = [ @@ -3631,7 +3509,6 @@ files = [ name = "tqdm" version = "4.66.1" description = "Fast, Extensible Progress Meter" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3652,7 +3529,6 @@ telegram = ["requests"] name = "traitlets" version = "5.10.1" description = "Traitlets Python configuration system" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3668,7 +3544,6 @@ test = ["argcomplete (>=3.0.3)", "mypy (>=1.5.1)", "pre-commit", "pytest (>=7.0, name = "types-pytz" version = "2023.3.1.1" description = "Typing stubs for pytz" -category = "dev" optional = false python-versions = "*" files = [ @@ -3680,7 +3555,6 @@ files = [ name = "types-pyyaml" version = "6.0.12.12" description = "Typing stubs for PyYAML" -category = "dev" optional = false python-versions = "*" files = [ @@ -3692,7 +3566,6 @@ files = [ name = "types-requests" version = "2.31.0.6" description = "Typing stubs for requests" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3707,7 +3580,6 @@ types-urllib3 = "*" name = "types-urllib3" version = "1.26.25.14" description = "Typing stubs for urllib3" -category = "dev" optional = false python-versions = "*" files = [ @@ -3719,7 +3591,6 @@ files = [ name = "typing-extensions" version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -3731,7 +3602,6 @@ files = [ name = "tzdata" version = "2023.3" description = "Provider of IANA time zone data" -category = "main" optional = false python-versions = ">=2" files = [ @@ -3743,7 +3613,6 @@ files = [ name = "unicodecsv" version = "0.14.1" description = "Python2's stdlib csv module is nice, but it doesn't support unicode. This module is a drop-in replacement which *does*." -category = "main" optional = false python-versions = "*" files = [ @@ -3754,7 +3623,6 @@ files = [ name = "uritemplate" version = "4.1.1" description = "Implementation of RFC 6570 URI Templates" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3766,7 +3634,6 @@ files = [ name = "urllib3" version = "1.26.16" 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.*, !=3.5.*" files = [ @@ -3783,7 +3650,6 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "vcrpy" version = "5.1.0" description = "Automatically mock your HTTP interactions to simplify and speed up testing" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3800,7 +3666,6 @@ yarl = "*" name = "vine" version = "5.0.0" description = "Promises, promises, promises." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -3812,7 +3677,6 @@ files = [ name = "virtualenv" version = "20.24.5" description = "Virtual Python Environment builder" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3833,7 +3697,6 @@ test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess name = "watchdog" version = "3.0.0" description = "Filesystem events monitoring" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3873,7 +3736,6 @@ watchmedo = ["PyYAML (>=3.10)"] name = "watchfiles" version = "0.19.0" description = "Simple, modern and high performance file watching and code reload in python." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -3908,7 +3770,6 @@ anyio = ">=3.0.0" name = "wcwidth" version = "0.2.8" description = "Measures the displayed width of unicode strings in a terminal" -category = "main" optional = false python-versions = "*" files = [ @@ -3920,7 +3781,6 @@ files = [ name = "werkzeug" version = "2.3.7" description = "The comprehensive WSGI web application library." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -3939,7 +3799,6 @@ watchdog = ["watchdog (>=2.3)"] name = "whitenoise" version = "6.5.0" description = "Radically simplified static file serving for WSGI applications" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -3954,7 +3813,6 @@ brotli = ["Brotli"] name = "wrapt" version = "1.16.0" description = "Module for decorators, wrappers and monkey patching." -category = "dev" optional = false python-versions = ">=3.6" files = [ @@ -4034,7 +3892,6 @@ files = [ name = "yarl" version = "1.9.4" description = "Yet another URL library" -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -4136,5 +3993,5 @@ multidict = ">=4.0" [metadata] lock-version = "2.0" -python-versions = "~3.10" -content-hash = "8722e1c9dfd5afda88591bc4d8f705ab06c14efe16877db32922c5d0523fc3b9" +python-versions = "~3.11" +content-hash = "64ff7e08c564fa9da89da31116bfb289021d11b50c8eee5cb7e43f07c7d12abd" diff --git a/pyproject.toml b/pyproject.toml index 5b4a100a3..0193e1173 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -46,6 +46,7 @@ django-lifecycle = "^1.1.2" country-converter = "^1.2" numpy = "<2" django-select2 = "^8.2.1" +pymupdf = "^1.24.10" [tool.poetry.dev-dependencies] Werkzeug = {extras = ["watchdog"], version = "^2.3.4"} diff --git a/scoap3/articles/admin.py b/scoap3/articles/admin.py index 3e96c7706..7b71beddb 100644 --- a/scoap3/articles/admin.py +++ b/scoap3/articles/admin.py @@ -28,6 +28,7 @@ class ComplianceReportAdmin(admin.ModelAdmin): "check_article_type", "check_doi_registration_time", "check_authors_affiliation", + "check_contains_funded_by_scoap3", "get_is_compliant", "report_date", ] @@ -53,6 +54,8 @@ class ComplianceReportAdmin(admin.ModelAdmin): "check_doi_registration_time_description", "check_authors_affiliation", "check_authors_affiliation_description", + "check_contains_funded_by_scoap3", + "check_contains_funded_by_scoap3_description", ] readonly_fields = [ "article", @@ -70,6 +73,8 @@ class ComplianceReportAdmin(admin.ModelAdmin): "check_doi_registration_time_description", "check_authors_affiliation", "check_authors_affiliation_description", + "check_contains_funded_by_scoap3", + "check_contains_funded_by_scoap3_description", ] list_filter = [ @@ -84,6 +89,7 @@ class ComplianceReportAdmin(admin.ModelAdmin): "article_id__report__check_article_type", "article_id__report__check_doi_registration_time", "article_id__report__check_authors_affiliation", + "article_id__report__check_contains_funded_by_scoap3", ] actions = ["export_as_csv"] @@ -125,6 +131,7 @@ def export_as_csv(self, request, queryset): "Check DOI Registration": "check_doi_registration_time_description", } + response = HttpResponse(content_type="text/csv") response["Content-Disposition"] = f"attachment; filename={filename}" writer = csv.writer(response) @@ -164,6 +171,8 @@ class ArticleComplianceReportInline(admin.StackedInline): "check_doi_registration_time_description", "check_authors_affiliation", "check_authors_affiliation_description", + "check_contains_funded_by_scoap3", + "check_contains_funded_by_scoap3_description", ] can_delete = False can_create = False @@ -186,6 +195,10 @@ class ArticleComplianceReportInline(admin.StackedInline): "check_authors_affiliation", "check_authors_affiliation_description", ), + ( + "check_contains_funded_by_scoap3", + "check_contains_funded_by_scoap3_description", + ), ] }, ), diff --git a/scoap3/articles/migrations/0015_compliancereport_check_contains_funded_by_scoap3_and_more.py b/scoap3/articles/migrations/0015_compliancereport_check_contains_funded_by_scoap3_and_more.py new file mode 100644 index 000000000..2d6d1b7c4 --- /dev/null +++ b/scoap3/articles/migrations/0015_compliancereport_check_contains_funded_by_scoap3_and_more.py @@ -0,0 +1,22 @@ +# Generated by Django 4.2.5 on 2024-09-17 11:31 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("articles", "0014_compliancereport_check_authors_affiliation_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="compliancereport", + name="check_contains_funded_by_scoap3", + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name="compliancereport", + name="check_contains_funded_by_scoap3_description", + field=models.TextField(blank=True, default=""), + ), + ] diff --git a/scoap3/articles/models.py b/scoap3/articles/models.py index be46cd0b0..40a2d962b 100644 --- a/scoap3/articles/models.py +++ b/scoap3/articles/models.py @@ -103,6 +103,10 @@ class ComplianceReport(models.Model): check_doi_registration_time_description = models.TextField(blank=True, default="") check_authors_affiliation = models.BooleanField(default=False) check_authors_affiliation_description = models.TextField(blank=True, default="") + check_contains_funded_by_scoap3 = models.BooleanField(default=False) + check_contains_funded_by_scoap3_description = models.TextField( + blank=True, default="" + ) def __str__(self): return f"Compliance Report for {self.article.title} on {self.report_date.strftime('%Y-%m-%d')}" diff --git a/scoap3/articles/tasks.py b/scoap3/articles/tasks.py index 18087617d..086971eb9 100644 --- a/scoap3/articles/tasks.py +++ b/scoap3/articles/tasks.py @@ -5,7 +5,8 @@ from django.core.paginator import Paginator from django_opensearch_dsl.registries import registry -from scoap3.articles.models import Article, ComplianceReport +from scoap3.articles.models import Article, ArticleFile, ComplianceReport +from scoap3.articles.util import is_string_in_pdf from scoap3.authors.models import Author from scoap3.misc.models import Affiliation from scoap3.misc.utils import fetch_doi_registration_date @@ -133,6 +134,29 @@ def check_authors_affiliation(article): return True, "Authors' affiliations are compliant" +def check_contains_funded_by_scoap3(article): + try: + article_files = ArticleFile.objects.filter(article_id=article) + + if not article_files.exists(): + return False, "No files found for the given article." + + for article_file in article_files: + file_path = article_file.file.path + try: + if is_string_in_pdf(file_path, "Funded by SCOAP3"): + return ( + True, + f"Files contain the required text: 'Funded by SCOAP3'. File: {file_path}", + ) + except FileNotFoundError: + return False, f"File not found: {file_path}" + + return False, "Files do not contain the required text: 'Funded by SCOAP3'" + except Exception as e: + return False, f"An unexpected error occurred: {str(e)}" + + @shared_task(name="compliance_checks", acks_late=True) def compliance_checks(article_id): try: @@ -160,6 +184,10 @@ def compliance_checks(article_id): check_affiliations_compliance, check_affiliations_description, ) = check_authors_affiliation(article) + ( + check_funded_by_scoap3_compliance, + check_funded_by_scoap3_description, + ) = check_contains_funded_by_scoap3(article) article.report.all().delete() @@ -177,6 +205,8 @@ def compliance_checks(article_id): check_license_description=check_license_description, check_authors_affiliation=check_affiliations_compliance, check_authors_affiliation_description=check_affiliations_description, + check_contains_funded_by_scoap3=check_funded_by_scoap3_compliance, + check_contains_funded_by_scoap3_description=check_funded_by_scoap3_description, ) report.save() logger.info("Compliance checks completed for article %s", article_id) diff --git a/scoap3/articles/tests/test_funded_by_scoap3.py b/scoap3/articles/tests/test_funded_by_scoap3.py new file mode 100644 index 000000000..8a8cceb97 --- /dev/null +++ b/scoap3/articles/tests/test_funded_by_scoap3.py @@ -0,0 +1,126 @@ +from io import BytesIO + +import fitz # PyMuPDF +import pytest +from django.core.files import File +from django.core.files.base import ContentFile + +from scoap3.articles.models import Article, ArticleFile +from scoap3.articles.tasks import check_contains_funded_by_scoap3 + +pytestmark = pytest.mark.django_db + + +@pytest.fixture +def create_article(db): + def _create_article(): + return Article.objects.create( + title="Test Article", + subtitle="Subtitle", + abstract="Abstract", + ) + + return _create_article + + +@pytest.fixture +def create_pdf_with_text(): + def _create_pdf_with_text(text): + pdf_bytes = BytesIO() + doc = fitz.open() + page = doc.new_page() + page.insert_text((72, 72), text) + doc.save(pdf_bytes) + doc.close() + pdf_bytes.seek(0) + return ContentFile(pdf_bytes.read(), "test_file.pdf") + + return _create_pdf_with_text + + +@pytest.fixture +def attach_file_to_article(db): + def _attach_file_to_article(article, content, file_name): + file = File(content, name=file_name) + ArticleFile.objects.create(article_id=article, file=file) + + return _attach_file_to_article + + +class TestCheckContainsFundedBySCOAP3: + def test_contains_funded_by( + self, create_article, create_pdf_with_text, attach_file_to_article + ): + article = create_article() + + file_with_text = create_pdf_with_text("Funded by SCOAP3") + attach_file_to_article(article, file_with_text, "file_with_text.pdf") + + result, message = check_contains_funded_by_scoap3(article) + assert result is True + assert message.startswith("Files contain the required text: 'Funded by SCOAP3'") + + def test_contains_funded_by_multiple_files( + self, create_article, create_pdf_with_text, attach_file_to_article + ): + article = create_article() + + file_with_text_1 = create_pdf_with_text("Funded by SCOAP3") + file_with_text_2 = create_pdf_with_text( + "Some other content. Funded by SCOAP3 again." + ) + + attach_file_to_article(article, file_with_text_1, "file_with_text_1.pdf") + attach_file_to_article(article, file_with_text_2, "file_with_text_2.pdf") + + result, message = check_contains_funded_by_scoap3(article) + assert result is True + assert message.startswith("Files contain the required text: 'Funded by SCOAP3'") + + def test_does_not_contain_funded_by( + self, create_article, create_pdf_with_text, attach_file_to_article + ): + article = create_article() + + file_without_text = create_pdf_with_text("Other text") + attach_file_to_article(article, file_without_text, "file_without_text.pdf") + + result, message = check_contains_funded_by_scoap3(article) + assert result is False + assert message == "Files do not contain the required text: 'Funded by SCOAP3'" + + def test_does_not_contain_funded_by_multiple_files( + self, create_article, create_pdf_with_text, attach_file_to_article + ): + article = create_article() + + file_without_text_1 = create_pdf_with_text("This is some random text.") + file_without_text_2 = create_pdf_with_text("Some other random content.") + + attach_file_to_article(article, file_without_text_1, "file_without_text_1.pdf") + attach_file_to_article(article, file_without_text_2, "file_without_text_2.pdf") + + result, message = check_contains_funded_by_scoap3(article) + assert result is False + assert message == "Files do not contain the required text: 'Funded by SCOAP3'" + + def test_mixed_files( + self, create_article, create_pdf_with_text, attach_file_to_article + ): + article = create_article() + + file_with_text = create_pdf_with_text("Funded by SCOAP3") + file_without_text = create_pdf_with_text("Other text") + attach_file_to_article(article, file_with_text, "file_with_text.pdf") + attach_file_to_article(article, file_without_text, "file_without_text.pdf") + + result, message = check_contains_funded_by_scoap3(article) + assert result is True + assert message.startswith("Files contain the required text: 'Funded by SCOAP3'") + + def test_no_files(self, create_article): + article = create_article() + + result, message = check_contains_funded_by_scoap3(article) + assert result is False + assert message == "No files found for the given article." diff --git a/scoap3/articles/util.py b/scoap3/articles/util.py index 92c21c45d..d0f2cb642 100644 --- a/scoap3/articles/util.py +++ b/scoap3/articles/util.py @@ -1,5 +1,7 @@ from datetime import datetime +import fitz + from scoap3.articles.models import ArticleIdentifierType @@ -25,3 +27,23 @@ def get_arxiv_primary_category(article_document): def parse_string_to_date_object(date_string): return datetime.fromisoformat(date_string.replace("Z", "+00:00")) + + +def is_string_in_pdf(pdf_path, search_string): + try: + document = fitz.open(pdf_path) + search_string_lower = search_string.lower() + + for page_num in range(document.page_count): + page = document[page_num] + page_text = page.get_text().lower() + if search_string_lower in page_text: + document.close() + return True + + document.close() + return False + except FileNotFoundError: + raise FileNotFoundError(f"File not found: {pdf_path}") + except Exception as e: + raise Exception(f"An error occurred while reading the PDF: {str(e)}") diff --git a/scoap3/authors/migrations/0005_alter_author_article_id.py b/scoap3/authors/migrations/0005_alter_author_article_id.py new file mode 100644 index 000000000..cf5e67ec3 --- /dev/null +++ b/scoap3/authors/migrations/0005_alter_author_article_id.py @@ -0,0 +1,23 @@ +# Generated by Django 4.2.5 on 2024-09-17 11:31 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + dependencies = [ + ("articles", "0015_compliancereport_check_contains_funded_by_scoap3_and_more"), + ("authors", "0004_alter_authoridentifier_author_id"), + ] + + operations = [ + migrations.AlterField( + model_name="author", + name="article_id", + field=models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="authors", + to="articles.article", + ), + ), + ]