diff --git a/cove_iati/lib/exceptions.py b/cove_iati/lib/exceptions.py index b97be5a5..90e9f77d 100644 --- a/cove_iati/lib/exceptions.py +++ b/cove_iati/lib/exceptions.py @@ -1,6 +1,6 @@ import json from libcove.lib.exceptions import CoveInputDataError -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ class UnrecognisedFileTypeXML(CoveInputDataError): diff --git a/cove_iati/lib/iati.py b/cove_iati/lib/iati.py index c78cdf06..e5fbce92 100644 --- a/cove_iati/lib/iati.py +++ b/cove_iati/lib/iati.py @@ -7,7 +7,7 @@ import requests from bdd_tester import bdd_tester from django.utils.html import format_html -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from libcove.lib.exceptions import CoveInputDataError from libcove.lib.tools import ignore_errors diff --git a/cove_iati/tests.py b/cove_iati/tests.py index 29f60f41..9883762e 100644 --- a/cove_iati/tests.py +++ b/cove_iati/tests.py @@ -742,7 +742,7 @@ def test_participating_org(): "codeforiati:registry-identifier": "psi", "count": 2, "name": "Population Service " "International", - "status": "active", + "status": "withdrawn", "type_count": { "Participating Org": 0, "Transaction Provider": 0, diff --git a/cove_iati/tests_functional.py b/cove_iati/tests_functional.py index 0d5c7c4b..554e579b 100644 --- a/cove_iati/tests_functional.py +++ b/cove_iati/tests_functional.py @@ -4,17 +4,21 @@ import requests from selenium import webdriver from selenium.common.exceptions import NoSuchElementException +from selenium.webdriver.common.by import By from selenium.webdriver.chrome.options import Options BROWSER = os.environ.get('BROWSER', 'ChromeHeadless') +CHROME_SNAP = bool(os.environ.get('CHROME_SNAP', False)) @pytest.fixture(scope="module") def browser(request): if BROWSER == 'ChromeHeadless': - chrome_options = Options() - chrome_options.add_argument("--headless") - browser = webdriver.Chrome(chrome_options=chrome_options) + options = Options() + options.add_argument("--headless") + if CHROME_SNAP: + options.add_argument("--remote-debugging-port=9222") + browser = webdriver.Chrome(options=options) else: browser = getattr(webdriver, BROWSER)() browser.implicitly_wait(3) @@ -34,37 +38,37 @@ def test_accordion(server_url, browser): browser.get(server_url) def buttons(): - return [b.is_displayed() for b in browser.find_elements_by_tag_name('button')] + return [b.is_displayed() for b in browser.find_elements(By.TAG_NAME, 'button')] time.sleep(0.5) assert buttons() == [True, False, False] - assert 'Upload a file (.csv, .xlsx, .xml)' in browser.find_elements_by_tag_name('label')[0].text - browser.find_element_by_partial_link_text('Link').click() + assert 'Upload a file (.csv, .xlsx, .xml)' in browser.find_elements(By.TAG_NAME, 'label')[0].text + browser.find_element(By.PARTIAL_LINK_TEXT, 'Link').click() browser.implicitly_wait(1) time.sleep(0.5) assert buttons() == [False, True, False] - browser.find_element_by_partial_link_text('Paste').click() + browser.find_element(By.PARTIAL_LINK_TEXT, 'Paste').click() time.sleep(0.5) assert buttons() == [False, False, True] - assert 'Paste (XML only)' in browser.find_elements_by_tag_name('label')[2].text + assert 'Paste (XML only)' in browser.find_elements(By.TAG_NAME, 'label')[2].text # Now test that the whole banner is clickable - browser.find_element_by_id('headingOne').click() + browser.find_element(By.ID, 'headingOne').click() time.sleep(0.5) assert buttons() == [True, False, False] - browser.find_element_by_id('headingTwo').click() + browser.find_element(By.ID, 'headingTwo').click() time.sleep(0.5) assert buttons() == [False, True, False] - browser.find_element_by_id('headingThree').click() + browser.find_element(By.ID, 'headingThree').click() time.sleep(0.5) assert buttons() == [False, False, True] def test_index_page_iati(server_url, browser): browser.get(server_url) - assert 'How to use IATI CoVE' in browser.find_element_by_tag_name('body').text - assert 'XML - according to version 2.03 of the IATI schema' in browser.find_element_by_tag_name('body').text - assert 'Spreadsheet - Excel, CSV (UTF-8, Windows-1252 and ISO-8859-1 encodings supported) - see sample data' in browser.find_element_by_tag_name('body').text + assert 'How to use IATI CoVE' in browser.find_element(By.TAG_NAME, 'body').text + assert 'XML - according to version 2.03 of the IATI schema' in browser.find_element(By.TAG_NAME, 'body').text + assert 'Spreadsheet - Excel, CSV (UTF-8, Windows-1252 and ISO-8859-1 encodings supported) - see sample data' in browser.find_element(By.TAG_NAME, 'body').text @pytest.mark.parametrize(('link_text', 'url'), [ @@ -72,18 +76,18 @@ def test_index_page_iati(server_url, browser): ]) def test_index_page_iati_links(server_url, browser, link_text, url): browser.get(server_url) - link = browser.find_element_by_link_text(link_text) + link = browser.find_element(By.LINK_TEXT, link_text) href = link.get_attribute("href") assert url in href def test_common_index_elements(server_url, browser): browser.get(server_url) - browser.find_element_by_css_selector('#more-information .panel-title').click() + browser.find_element(By.CSS_SELECTOR, '#more-information .panel-title').click() time.sleep(0.5) - assert 'What happens to the data I provide to this site?' in browser.find_element_by_tag_name('body').text - assert 'Why do you delete data after seven days?' in browser.find_element_by_tag_name('body').text - assert 'Why provide converted versions?' in browser.find_element_by_tag_name('body').text + assert 'What happens to the data I provide to this site?' in browser.find_element(By.TAG_NAME, 'body').text + assert 'Why do you delete data after seven days?' in browser.find_element(By.TAG_NAME, 'body').text + assert 'Why provide converted versions?' in browser.find_element(By.TAG_NAME, 'body').text @pytest.mark.parametrize(('source_filename', 'expected_text', 'conversion_successful'), [ @@ -118,15 +122,15 @@ def test_explore_iati_url_input(server_url, browser, httpserver, source_filename source_url = httpserver.url + '/' + source_filename browser.get(server_url) - browser.find_element_by_partial_link_text('Link').click() + browser.find_element(By.PARTIAL_LINK_TEXT, 'Link').click() time.sleep(0.5) - browser.find_element_by_id('id_source_url').send_keys(source_url) - browser.find_element_by_css_selector("#fetchURL > div.form-group > button.btn.btn-primary").click() + browser.find_element(By.ID, 'id_source_url').send_keys(source_url) + browser.find_element(By.CSS_SELECTOR, "#fetchURL > div.form-group > button.btn.btn-primary").click() data_url = browser.current_url # Click and un-collapse all explore sections - all_sections = browser.find_elements_by_class_name('panel-heading') + all_sections = browser.find_elements(By.CLASS_NAME, 'panel-heading') for section in all_sections: if section.get_attribute('data-toggle') == "collapse" and section.get_attribute('aria-expanded') != 'true': browser.execute_script("arguments[0].scrollIntoView();", section) @@ -141,7 +145,7 @@ def test_explore_iati_url_input(server_url, browser, httpserver, source_filename # Expand all sections with the expand all button this time try: - browser.find_element_by_link_text('Expand all').click() + browser.find_element(By.LINK_TEXT, 'Expand all').click() time.sleep(0.5) except NoSuchElementException: pass @@ -151,7 +155,7 @@ def test_explore_iati_url_input(server_url, browser, httpserver, source_filename def check_url_input_result_page(server_url, browser, httpserver, source_filename, expected_text, conversion_successful): - body_text = browser.find_element_by_tag_name('body').text + body_text = browser.find_element(By.TAG_NAME, 'body').text if isinstance(expected_text, str): expected_text = [expected_text] @@ -162,7 +166,7 @@ def check_url_input_result_page(server_url, browser, httpserver, source_filename assert 'Converted to XML' in body_text if source_filename == 'namespace_good.xlsx': - converted_file = browser.find_element_by_link_text("XML (Converted from Original)").get_attribute("href") + converted_file = browser.find_element(By.LINK_TEXT, "XML (Converted from Original)").get_attribute("href") assert requests.get(converted_file).text == ''' @@ -174,7 +178,7 @@ def check_url_input_result_page(server_url, browser, httpserver, source_filename ''' if source_filename == 'basic_iati_org_valid.xlsx': - converted_file = browser.find_element_by_link_text("XML (Converted from Original)").get_attribute("href") + converted_file = browser.find_element(By.LINK_TEXT, "XML (Converted from Original)").get_attribute("href") assert requests.get(converted_file).text == ''' @@ -220,13 +224,13 @@ def test_rulesets_table_toggle(server_url, browser, httpserver): source_url = httpserver.url + '/basic_iati_ruleset_errors.xml' browser.get(server_url) - browser.find_element_by_partial_link_text('Link').click() + browser.find_element(By.PARTIAL_LINK_TEXT, 'Link').click() time.sleep(0.5) - browser.find_element_by_id('id_source_url').send_keys(source_url) - browser.find_element_by_css_selector('#fetchURL > div.form-group > button.btn.btn-primary').click() + browser.find_element(By.ID, 'id_source_url').send_keys(source_url) + browser.find_element(By.CSS_SELECTOR, '#fetchURL > div.form-group > button.btn.btn-primary').click() # Click and un-collapse all explore sections - all_sections = browser.find_elements_by_class_name('panel-heading') + all_sections = browser.find_elements(By.CLASS_NAME, 'panel-heading') for section in all_sections: if section.get_attribute('data-toggle') == 'collapse': if section.get_attribute('aria-expanded') != 'true': @@ -234,22 +238,22 @@ def test_rulesets_table_toggle(server_url, browser, httpserver): section.click() time.sleep(0.5) - toggle_button = browser.find_element_by_name('ruleset-table-toggle') - table_header = browser.find_element_by_css_selector('table#ruleset-by-rule thead tr') + toggle_button = browser.find_element(By.NAME, 'ruleset-table-toggle') + table_header = browser.find_element(By.CSS_SELECTOR, 'table#ruleset-by-rule thead tr') header_html = ''.join(table_header.get_attribute('innerHTML').strip().split()) assert toggle_button.text == 'See same results by activity' - assert browser.find_element_by_id('ruleset-by-rule').is_displayed() - assert not browser.find_element_by_id('ruleset-by-activity').is_displayed() + assert browser.find_element(By.ID, 'ruleset-by-rule').is_displayed() + assert not browser.find_element(By.ID, 'ruleset-by-activity').is_displayed() assert header_html == 'RulesetRuleActivityExplanationPath' toggle_button.click() time.sleep(0.5) - toggle_button = browser.find_element_by_name('ruleset-table-toggle') - table_header = browser.find_element_by_css_selector('table#ruleset-by-activity thead tr') + toggle_button = browser.find_element(By.NAME, 'ruleset-table-toggle') + table_header = browser.find_element(By.CSS_SELECTOR, 'table#ruleset-by-activity thead tr') header_html = ''.join(table_header.get_attribute('innerHTML').strip().split()) assert toggle_button.text == 'See same results by ruleset' - assert browser.find_element_by_id('ruleset-by-activity').is_displayed() - assert not browser.find_element_by_id('ruleset-by-rule').is_displayed() + assert browser.find_element(By.ID, 'ruleset-by-activity').is_displayed() + assert not browser.find_element(By.ID, 'ruleset-by-rule').is_displayed() assert header_html == 'ActivityRulesetRuleExplanationPath' diff --git a/cove_iati/urls.py b/cove_iati/urls.py index e51dfd40..4e5b8b53 100644 --- a/cove_iati/urls.py +++ b/cove_iati/urls.py @@ -1,4 +1,4 @@ -from django.conf.urls import url +from django.urls import re_path from cove.urls import urlpatterns, handler500 # noqa: F401 from django.conf.urls.static import static @@ -7,10 +7,10 @@ import cove_iati.views urlpatterns = [ - url(r'^$', cove_iati.views.data_input_iati, name='index'), - url(r'^data/(.+)/(.+)$', cove_iati.views.explore_iati, name='explore_suffix'), - url(r'^data/(.+)$', cove_iati.views.explore_iati, name='explore'), - url(r'^api_test', cove_iati.views.api_test, name='api_test'), + re_path(r'^$', cove_iati.views.data_input_iati, name='index'), + re_path(r'^data/(.+)/(.+)$', cove_iati.views.explore_iati, name='explore_suffix'), + re_path(r'^data/(.+)$', cove_iati.views.explore_iati, name='explore'), + re_path(r'^api_test', cove_iati.views.api_test, name='api_test'), ] + urlpatterns urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/cove_iati/views.py b/cove_iati/views.py index 06706b58..76cc9ac7 100644 --- a/cove_iati/views.py +++ b/cove_iati/views.py @@ -10,7 +10,7 @@ from django.conf import settings from django.http import HttpResponse, HttpResponseBadRequest from django.shortcuts import render -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_POST import iatiutils.merge_indicator diff --git a/requirements.in b/requirements.in index 30937085..24dadb9a 100644 --- a/requirements.in +++ b/requirements.in @@ -1,4 +1,4 @@ -Django>3.2,<3.3 +Django>4.2,<4.3 #^^ rq.filter: <1.12 flattentool>=0.17.2 libcove @@ -23,6 +23,7 @@ xmltodict rangedict openpyxl gunicorn +lxml<5 # We have a fork of the bdd-tester repo, in order to add a single commit that # fixes the previous commit we were using, to work with the new pip resolver. diff --git a/requirements.txt b/requirements.txt index 1fd06d34..4295aade 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,81 +2,74 @@ # This file is autogenerated by pip-compile with Python 3.11 # by the following command: # -# pip-compile requirements.in +# pip-compile # -e git+https://github.com/OpenDataServices/bdd-tester.git@e1a1a578e28222904f3f1567409b068222ec02e6#egg=bdd-tester # via -r requirements.in -e git+https://github.com/OpenDataServices/iati-utils.git@704fa589ad2d3743d3928dcbeeeb06a5e73f8437#egg=iatiutils # via -r requirements.in -appdirs==1.4.4 - # via requests-cache -asgiref==3.6.0 +asgiref==3.8.1 # via django -attrs==22.2.0 +attrs==24.2.0 # via # cattrs # jsonschema + # referencing # requests-cache -backports-datetime-fromisoformat==2.0.0 +backports-datetime-fromisoformat==2.0.1 # via flattentool behave==1.2.5 # via bdd-tester -bleach==6.0.0 +bleach==6.1.0 # via -r requirements.in -btrees==5.0 +btrees==6.0 # via zodb cached-property==1.5.2 - # via - # -r requirements.in - # libcove -cattrs==22.2.0 + # via -r requirements.in +cattrs==23.2.3 # via requests-cache -certifi==2022.12.7 +certifi==2024.7.4 # via # requests # sentry-sdk -cffi==1.15.1 +cffi==1.17.0 # via persistent -charset-normalizer==3.0.1 +charset-normalizer==3.3.2 # via requests -click==8.1.3 +click==8.1.7 # via iatiutils commonmark==0.9.1 # via -r requirements.in -contextlib2==21.6.0 - # via schema dealer==2.1.0 # via -r requirements.in defusedxml==0.7.1 # via odfpy -django==3.2.18 +django==4.2.15 # via # -r requirements.in # django-bootstrap3 # django-debug-toolbar # libcoveweb -django-bootstrap3==22.2 +django-bootstrap3==24.2 # via # -r requirements.in # libcoveweb -django-debug-toolbar==3.8.1 +django-debug-toolbar==4.4.6 + # via -r requirements.in +django-environ==0.11.2 # via -r requirements.in -django-environ==0.9.0 - # via - # -r requirements.in - # libcoveweb et-xmlfile==1.1.0 # via openpyxl -flattentool==0.20.1 +flattentool==0.25.0 # via # -r requirements.in # libcove # libcoveweb -gunicorn==20.1.0 +gunicorn==23.0.0 # via -r requirements.in -idna==3.4 +idna==3.7 # via requests -ijson==3.2.0.post0 +ijson==3.3.0 # via flattentool json-merge-patch==0.2 # via -r requirements.in @@ -84,52 +77,60 @@ jsonref==1.1.0 # via # flattentool # libcove -jsonschema==3.2.0 +jsonschema==4.23.0 # via # -r requirements.in # libcove -libcove==0.29.0 +jsonschema-specifications==2023.12.1 + # via jsonschema +libcove==0.32.1 # via # -r requirements.in # libcoveweb -libcoveweb==0.26.0 +libcoveweb==0.30.4 # via -r requirements.in -lxml==4.9.2 +lxml==4.9.4 # via + # -r requirements.in # bdd-tester # flattentool # iatiutils -markupsafe==2.1.2 +markupsafe==2.1.5 # via werkzeug odfpy==1.4.1 # via flattentool -openpyxl==3.1.1 +openpyxl==3.1.5 # via # -r requirements.in # flattentool -parse==1.19.0 +packaging==24.1 + # via gunicorn +parse==1.20.2 # via # behave # parse-type -parse-type==0.6.0 +parse-type==0.6.2 # via behave -persistent==5.0 +persistent==6.0 # via # btrees # zodb -pycparser==2.21 +platformdirs==4.2.2 + # via requests-cache +pycparser==2.22 # via cffi -pyrsistent==0.19.3 - # via jsonschema -python-dateutil==2.8.2 +python-dateutil==2.9.0.post0 # via -r requirements.in -pytz==2022.7.1 - # via - # django - # flattentool +pytz==2024.1 + # via flattentool rangedict==0.1.7 # via -r requirements.in -requests==2.28.2 +referencing==0.35.1 + # via + # jsonschema + # jsonschema-specifications + # libcove +requests==2.32.3 # via # -r requirements.in # bdd-tester @@ -137,7 +138,7 @@ requests==2.28.2 # libcove # libcoveweb # requests-cache -requests-cache==0.9.8 +requests-cache==1.2.1 # via -r requirements.in rfc3339-validator==0.1.4 # via libcove @@ -145,39 +146,41 @@ rfc3987==1.3.8 # via # -r requirements.in # libcove -schema==0.7.5 +rpds-py==0.20.0 + # via + # jsonschema + # referencing +schema==0.7.7 # via flattentool -sentry-sdk==1.16.0 +sentry-sdk==2.13.0 # via -r requirements.in six==1.16.0 # via # bdd-tester # behave # bleach - # jsonschema # parse-type # python-dateutil # rfc3339-validator # url-normalize - # zodb -sqlparse==0.4.3 +sqlparse==0.5.1 # via # django # django-debug-toolbar strict-rfc3339==0.7 # via -r requirements.in -transaction==3.0.1 +transaction==4.0 # via zodb url-normalize==1.4.3 # via requests-cache -urllib3==1.26.14 +urllib3==2.2.2 # via # requests # requests-cache # sentry-sdk webencodings==0.5.1 # via bleach -werkzeug==2.2.3 +werkzeug==3.0.4 # via libcoveweb xmltodict==0.13.0 # via @@ -187,23 +190,28 @@ zc-lockfile==3.0.post1 # via zodb zc-zlibstorage==1.2.0 # via flattentool -zconfig==3.6.1 +zconfig==4.1 # via zodb -zipp==3.15.0 +zipp==3.20.0 # via -r requirements.in -zodb==5.8.0 +zodb==6.0 # via # flattentool # zc-zlibstorage -zodbpickle==2.6 +zodbpickle==4.0 # via zodb -zope-interface==5.5.2 +zope-deferredimport==5.0 + # via persistent +zope-interface==7.0.1 # via # btrees # persistent # transaction # zc-zlibstorage # zodb + # zope-proxy +zope-proxy==5.3 + # via zope-deferredimport # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements_dev.in b/requirements_dev.in index 85842d7c..3e29bcac 100644 --- a/requirements_dev.in +++ b/requirements_dev.in @@ -1,4 +1,4 @@ --r requirements.in +-r requirements.txt flake8 pytest @@ -7,10 +7,7 @@ pytest-cov pytest-localserver pytest-xdist coveralls -# Selenium 4.3.0 changes the API, so install a version before that. -# We did the same thing for 360 cove: -# https://github.com/ThreeSixtyGiving/dataquality/commit/bfbc1cbab2b40368ab2c37472fc2e02d5d833b97 -selenium<4.3.0 +selenium transifex-client libsass Sphinx diff --git a/requirements_dev.txt b/requirements_dev.txt index 25929bfb..1dd83a76 100644 --- a/requirements_dev.txt +++ b/requirements_dev.txt @@ -5,224 +5,253 @@ # pip-compile requirements_dev.in # -e git+https://github.com/OpenDataServices/bdd-tester.git@e1a1a578e28222904f3f1567409b068222ec02e6#egg=bdd-tester - # via -r requirements.in + # via -r requirements.txt -e git+https://github.com/OpenDataServices/iati-utils.git@704fa589ad2d3743d3928dcbeeeb06a5e73f8437#egg=iatiutils - # via -r requirements.in -alabaster==0.7.13 + # via -r requirements.txt +alabaster==0.7.16 # via sphinx -appdirs==1.4.4 - # via requests-cache -asgiref==3.6.0 - # via django -async-generator==1.10 +asgiref==3.8.1 # via - # trio - # trio-websocket -attrs==22.2.0 + # -r requirements.txt + # django +attrs==24.2.0 # via + # -r requirements.txt # cattrs # hypothesis # jsonschema # outcome - # pytest + # referencing # requests-cache # trio -babel==2.12.1 +babel==2.16.0 # via sphinx -backports-datetime-fromisoformat==2.0.0 - # via flattentool +backports-datetime-fromisoformat==2.0.1 + # via + # -r requirements.txt + # flattentool behave==1.2.5 - # via bdd-tester -bleach==6.0.0 - # via -r requirements.in -btrees==5.0 - # via zodb + # via + # -r requirements.txt + # bdd-tester +bleach==6.1.0 + # via -r requirements.txt +btrees==6.0 + # via + # -r requirements.txt + # zodb cached-property==1.5.2 + # via -r requirements.txt +cattrs==23.2.3 # via - # -r requirements.in - # libcove -cattrs==22.2.0 - # via requests-cache -certifi==2022.12.7 + # -r requirements.txt + # requests-cache +certifi==2024.7.4 # via + # -r requirements.txt # requests + # selenium # sentry-sdk - # urllib3 -cffi==1.15.1 +cffi==1.17.0 # via - # cryptography + # -r requirements.txt # persistent -charset-normalizer==3.0.1 - # via requests -click==8.1.3 - # via iatiutils +charset-normalizer==3.3.2 + # via + # -r requirements.txt + # requests +click==8.1.7 + # via + # -r requirements.txt + # iatiutils commonmark==0.9.1 # via - # -r requirements.in + # -r requirements.txt # recommonmark -contextlib2==21.6.0 - # via schema -coverage[toml]==6.5.0 +coverage[toml]==7.6.1 # via # coveralls # pytest-cov -coveralls==3.3.1 +coveralls==4.0.1 # via -r requirements_dev.in -cryptography==39.0.1 - # via - # pyopenssl - # urllib3 dealer==2.1.0 - # via -r requirements.in + # via -r requirements.txt defusedxml==0.7.1 - # via odfpy -django==3.2.18 # via - # -r requirements.in + # -r requirements.txt + # odfpy +django==4.2.15 + # via + # -r requirements.txt # django-bootstrap3 # django-debug-toolbar # libcoveweb -django-bootstrap3==22.2 - # via - # -r requirements.in - # libcoveweb -django-debug-toolbar==3.8.1 - # via -r requirements.in -django-environ==0.9.0 +django-bootstrap3==24.2 # via - # -r requirements.in + # -r requirements.txt # libcoveweb +django-debug-toolbar==4.4.6 + # via -r requirements.txt +django-environ==0.11.2 + # via -r requirements.txt docopt==0.6.2 # via coveralls -docutils==0.18.1 +docutils==0.20.1 # via # recommonmark # sphinx # sphinx-rtd-theme et-xmlfile==1.1.0 - # via openpyxl -execnet==1.9.0 + # via + # -r requirements.txt + # openpyxl +execnet==2.1.1 # via pytest-xdist -flake8==6.0.0 +flake8==7.1.1 # via -r requirements_dev.in -flattentool==0.20.1 +flattentool==0.25.0 # via - # -r requirements.in + # -r requirements.txt # libcove # libcoveweb -gunicorn==20.1.0 - # via -r requirements.in +gunicorn==23.0.0 + # via -r requirements.txt h11==0.14.0 # via wsproto -hypothesis==6.68.2 +hypothesis==6.111.1 # via -r requirements_dev.in -idna==3.4 +idna==3.7 # via + # -r requirements.txt # requests # trio - # urllib3 -ijson==3.2.0.post0 - # via flattentool +ijson==3.3.0 + # via + # -r requirements.txt + # flattentool imagesize==1.4.1 # via sphinx iniconfig==2.0.0 # via pytest -jinja2==3.1.2 +jinja2==3.1.4 # via sphinx json-merge-patch==0.2 - # via -r requirements.in + # via -r requirements.txt jsonref==1.1.0 # via + # -r requirements.txt # flattentool # libcove -jsonschema==3.2.0 +jsonschema==4.23.0 # via - # -r requirements.in + # -r requirements.txt # libcove -libcove==0.29.0 +jsonschema-specifications==2023.12.1 + # via + # -r requirements.txt + # jsonschema +libcove==0.32.1 # via - # -r requirements.in + # -r requirements.txt # libcoveweb -libcoveweb==0.26.0 - # via -r requirements.in -libsass==0.22.0 +libcoveweb==0.30.4 + # via -r requirements.txt +libsass==0.23.0 # via -r requirements_dev.in -lxml==4.9.2 +lxml==4.9.4 # via + # -r requirements.txt # bdd-tester # flattentool # iatiutils -markupsafe==2.1.2 +markupsafe==2.1.5 # via + # -r requirements.txt # jinja2 # werkzeug mccabe==0.7.0 # via flake8 odfpy==1.4.1 - # via flattentool -openpyxl==3.1.1 # via - # -r requirements.in + # -r requirements.txt + # flattentool +openpyxl==3.1.5 + # via + # -r requirements.txt # flattentool -outcome==1.2.0 +outcome==1.3.0.post0 # via trio -packaging==23.0 +packaging==24.1 # via + # -r requirements.txt + # gunicorn # pytest # sphinx -parse==1.19.0 +parse==1.20.2 # via + # -r requirements.txt # behave # parse-type -parse-type==0.6.0 - # via behave -persistent==5.0 +parse-type==0.6.2 + # via + # -r requirements.txt + # behave +persistent==6.0 # via + # -r requirements.txt # btrees # zodb -pluggy==1.0.0 +platformdirs==4.2.2 + # via + # -r requirements.txt + # requests-cache +pluggy==1.5.0 # via pytest -pycodestyle==2.10.0 +pycodestyle==2.12.1 # via flake8 -pycparser==2.21 - # via cffi -pyflakes==3.0.1 +pycparser==2.22 + # via + # -r requirements.txt + # cffi +pyflakes==3.2.0 # via flake8 -pygments==2.14.0 +pygments==2.18.0 # via sphinx -pyopenssl==23.0.0 - # via urllib3 -pyrsistent==0.19.3 - # via jsonschema pysocks==1.7.1 # via urllib3 -pytest==7.2.1 +pytest==8.3.2 # via # -r requirements_dev.in # pytest-cov # pytest-django # pytest-xdist -pytest-cov==4.0.0 +pytest-cov==5.0.0 # via -r requirements_dev.in -pytest-django==4.5.2 +pytest-django==4.8.0 # via -r requirements_dev.in -pytest-localserver==0.7.1 +pytest-localserver==0.9.0 # via -r requirements_dev.in -pytest-xdist==3.2.0 +pytest-xdist==3.6.1 # via -r requirements_dev.in -python-dateutil==2.8.2 - # via -r requirements.in -pytz==2022.7.1 +python-dateutil==2.9.0.post0 + # via -r requirements.txt +pytz==2024.1 # via - # django + # -r requirements.txt # flattentool rangedict==0.1.7 - # via -r requirements.in + # via -r requirements.txt recommonmark==0.7.1 # via -r requirements_dev.in -requests==2.28.2 +referencing==0.35.1 + # via + # -r requirements.txt + # jsonschema + # jsonschema-specifications + # libcove +requests==2.32.3 # via - # -r requirements.in + # -r requirements.txt # bdd-tester # coveralls # iatiutils @@ -230,33 +259,41 @@ requests==2.28.2 # libcoveweb # requests-cache # sphinx -requests-cache==0.9.8 - # via -r requirements.in +requests-cache==1.2.1 + # via -r requirements.txt rfc3339-validator==0.1.4 - # via libcove + # via + # -r requirements.txt + # libcove rfc3987==1.3.8 # via - # -r requirements.in + # -r requirements.txt # libcove -schema==0.7.5 - # via flattentool -selenium==4.2.0 +rpds-py==0.20.0 + # via + # -r requirements.txt + # jsonschema + # referencing +schema==0.7.7 + # via + # -r requirements.txt + # flattentool +selenium==4.23.1 # via -r requirements_dev.in -sentry-sdk==1.16.0 - # via -r requirements.in +sentry-sdk==2.13.0 + # via -r requirements.txt six==1.16.0 # via + # -r requirements.txt # bdd-tester # behave # bleach - # jsonschema # parse-type # python-dateutil # rfc3339-validator # transifex-client # url-normalize - # zodb -sniffio==1.3.0 +sniffio==1.3.1 # via trio snowballstemmer==2.2.0 # via sphinx @@ -264,87 +301,118 @@ sortedcontainers==2.4.0 # via # hypothesis # trio -sphinx==6.1.3 +sphinx==7.4.7 # via # -r requirements_dev.in # recommonmark # sphinx-rtd-theme -sphinx-rtd-theme==1.2.0 + # sphinxcontrib-jquery +sphinx-rtd-theme==2.0.0 # via -r requirements_dev.in -sphinxcontrib-applehelp==1.0.4 +sphinxcontrib-applehelp==2.0.0 # via sphinx -sphinxcontrib-devhelp==1.0.2 +sphinxcontrib-devhelp==2.0.0 # via sphinx -sphinxcontrib-htmlhelp==2.0.1 +sphinxcontrib-htmlhelp==2.1.0 # via sphinx -sphinxcontrib-jquery==2.0.0 +sphinxcontrib-jquery==4.1 # via sphinx-rtd-theme sphinxcontrib-jsmath==1.0.1 # via sphinx -sphinxcontrib-qthelp==1.0.3 +sphinxcontrib-qthelp==2.0.0 # via sphinx -sphinxcontrib-serializinghtml==1.1.5 +sphinxcontrib-serializinghtml==2.0.0 # via sphinx -sqlparse==0.4.3 +sqlparse==0.5.1 # via + # -r requirements.txt # django # django-debug-toolbar strict-rfc3339==0.7 - # via -r requirements.in -transaction==3.0.1 - # via zodb + # via -r requirements.txt +transaction==4.0 + # via + # -r requirements.txt + # zodb transifex-client==0.12.5 # via -r requirements_dev.in -trio==0.22.0 +trio==0.26.2 # via # selenium # trio-websocket -trio-websocket==0.9.2 +trio-websocket==0.11.1 + # via selenium +typing-extensions==4.12.2 # via selenium url-normalize==1.4.3 - # via requests-cache -urllib3[secure,socks]==1.26.14 # via + # -r requirements.txt + # requests-cache +urllib3[socks]==2.2.2 + # via + # -r requirements.txt # requests # requests-cache # selenium # sentry-sdk # transifex-client -urllib3-secure-extra==0.1.0 - # via urllib3 webencodings==0.5.1 - # via bleach -werkzeug==2.2.3 # via + # -r requirements.txt + # bleach +websocket-client==1.8.0 + # via selenium +werkzeug==3.0.4 + # via + # -r requirements.txt # libcoveweb # pytest-localserver wsproto==1.2.0 # via trio-websocket xmltodict==0.13.0 # via - # -r requirements.in + # -r requirements.txt # flattentool zc-lockfile==3.0.post1 - # via zodb + # via + # -r requirements.txt + # zodb zc-zlibstorage==1.2.0 - # via flattentool -zconfig==3.6.1 - # via zodb -zipp==3.15.0 - # via -r requirements.in -zodb==5.8.0 # via + # -r requirements.txt + # flattentool +zconfig==4.1 + # via + # -r requirements.txt + # zodb +zipp==3.20.0 + # via -r requirements.txt +zodb==6.0 + # via + # -r requirements.txt # flattentool # zc-zlibstorage -zodbpickle==2.6 - # via zodb -zope-interface==5.5.2 +zodbpickle==4.0 + # via + # -r requirements.txt + # zodb +zope-deferredimport==5.0 + # via + # -r requirements.txt + # persistent +zope-interface==7.0.1 # via + # -r requirements.txt # btrees # persistent # transaction # zc-zlibstorage # zodb + # zope-proxy +zope-proxy==5.3 + # via + # -r requirements.txt + # zope-deferredimport # The following packages are considered to be unsafe in a requirements file: # setuptools