diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 70aeaed5..029145df 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -13,7 +13,7 @@ jobs: - uses: actions/setup-python@v5 with: - python-version: "3.10" + python-version: "3.12" - uses: actions/setup-node@v4 with: @@ -34,8 +34,8 @@ jobs: - name: Collect static run: make collectstatic - - name: Run Flake8 - run: make flake8 + - name: Run ruff + run: make ruff - name: Run isort run: make isort-check diff --git a/.tool-versions b/.tool-versions index 48b0f2c4..1398284a 100644 --- a/.tool-versions +++ b/.tool-versions @@ -1,2 +1,2 @@ nodejs 20.11.1 -python 3.10.13 +python 3.12.2 diff --git a/chartofaccountDIT/exportcsv.py b/chartofaccountDIT/exportcsv.py index b7472580..6b0fb663 100644 --- a/chartofaccountDIT/exportcsv.py +++ b/chartofaccountDIT/exportcsv.py @@ -33,24 +33,36 @@ def _export_nac_iterator(queryset): obj.natural_account_code_description, ] + l5_field_obj(obj.account_L5_code) + [ obj.used_for_budget, - obj.expenditure_category.NAC_category.NAC_category_description - if obj.expenditure_category - else "-", - obj.expenditure_category.grouping_description - if obj.expenditure_category - else "-", - obj.commercial_category.commercial_category - if obj.commercial_category - else "N/A", - obj.expenditure_category.op_del_category.operating_delivery_description - if obj.expenditure_category and obj.expenditure_category.op_del_category - else "N/A", - obj.expenditure_category.linked_budget_code.natural_account_code - if obj.expenditure_category - else "-", - obj.expenditure_category.NAC_category.get_pay_nonpay_display() - if obj.expenditure_category - else "N/A", + ( + obj.expenditure_category.NAC_category.NAC_category_description + if obj.expenditure_category + else "-" + ), + ( + obj.expenditure_category.grouping_description + if obj.expenditure_category + else "-" + ), + ( + obj.commercial_category.commercial_category + if obj.commercial_category + else "N/A" + ), + ( + obj.expenditure_category.op_del_category.operating_delivery_description + if obj.expenditure_category and obj.expenditure_category.op_del_category + else "N/A" + ), + ( + obj.expenditure_category.linked_budget_code.natural_account_code + if obj.expenditure_category + else "-" + ), + ( + obj.expenditure_category.NAC_category.get_pay_nonpay_display() + if obj.expenditure_category + else "N/A" + ), obj.get_cash_non_cash_display(), obj.get_gross_income_display(), obj.active, @@ -81,9 +93,11 @@ def _export_historical_nac_iterator(queryset): obj.natural_account_code, obj.natural_account_code_description, obj.used_for_budget, - obj.expenditure_category.grouping_description - if obj.expenditure_category - else "-", + ( + obj.expenditure_category.grouping_description + if obj.expenditure_category + else "-" + ), obj.NAC_category, obj.commercial_category, obj.account_L5_code, @@ -117,9 +131,11 @@ def _export_exp_cat_iterator(queryset): obj.further_description, obj.linked_budget_code.natural_account_code, obj.linked_budget_code.natural_account_code_description, - obj.op_del_category.operating_delivery_description - if obj.op_del_category - else "-", + ( + obj.op_del_category.operating_delivery_description + if obj.op_del_category + else "-" + ), ] diff --git a/chartofaccountDIT/test/factories.py b/chartofaccountDIT/test/factories.py index 294edd74..c5ef334e 100644 --- a/chartofaccountDIT/test/factories.py +++ b/chartofaccountDIT/test/factories.py @@ -26,7 +26,7 @@ ) -class Analysis1Factory(factory.DjangoModelFactory): +class Analysis1Factory(factory.django.DjangoModelFactory): """ Define Analysis1 Factory """ @@ -37,12 +37,12 @@ class Meta: active = True -class HistoricalAnalysis1Factory(factory.DjangoModelFactory): +class HistoricalAnalysis1Factory(factory.django.DjangoModelFactory): class Meta: model = ArchivedAnalysis1 -class Analysis2Factory(factory.DjangoModelFactory): +class Analysis2Factory(factory.django.DjangoModelFactory): """ Define Analysis2 Factory """ @@ -53,12 +53,12 @@ class Meta: active = True -class HistoricalAnalysis2Factory(factory.DjangoModelFactory): +class HistoricalAnalysis2Factory(factory.django.DjangoModelFactory): class Meta: model = ArchivedAnalysis2 -class NACCategoryFactory(factory.DjangoModelFactory): +class NACCategoryFactory(factory.django.DjangoModelFactory): """ Define NACCategory Factory """ @@ -69,7 +69,7 @@ class Meta: NAC_category_description = factory.Faker("name") -class OperatingDeliveryCategoryFactory(factory.DjangoModelFactory): +class OperatingDeliveryCategoryFactory(factory.django.DjangoModelFactory): """ Define OperatingDeliveryCategory Factory """ @@ -78,7 +78,7 @@ class Meta: model = OperatingDeliveryCategory -class ExpenditureCategoryFactory(factory.DjangoModelFactory): +class ExpenditureCategoryFactory(factory.django.DjangoModelFactory): """ Define ExpenditureCategory Factory """ @@ -90,14 +90,14 @@ class Meta: model = ExpenditureCategory -class HistoricalExpenditureCategoryFactory(factory.DjangoModelFactory): +class HistoricalExpenditureCategoryFactory(factory.django.DjangoModelFactory): grouping_description = "Test Archived Budget Category" class Meta: model = ArchivedExpenditureCategory -class CommercialCategoryFactory(factory.DjangoModelFactory): +class CommercialCategoryFactory(factory.django.DjangoModelFactory): """ Define CommercialCategory Factory """ @@ -108,14 +108,14 @@ class Meta: model = CommercialCategory -class HistoricalCommercialCategoryFactory(factory.DjangoModelFactory): +class HistoricalCommercialCategoryFactory(factory.django.DjangoModelFactory): active = True class Meta: model = ArchivedCommercialCategory -class NaturalCodeFactory(factory.DjangoModelFactory): +class NaturalCodeFactory(factory.django.DjangoModelFactory): """ Define NaturalCode Factory """ @@ -130,7 +130,7 @@ class Meta: used_for_budget = False -class HistoricalNaturalCodeFactory(factory.DjangoModelFactory): +class HistoricalNaturalCodeFactory(factory.django.DjangoModelFactory): active = True natural_account_code = 87654321 @@ -141,7 +141,7 @@ class Meta: model = ArchivedNaturalCode -class ProgrammeCodeFactory(factory.DjangoModelFactory): +class ProgrammeCodeFactory(factory.django.DjangoModelFactory): """ Define ProgrammeCode Factory """ @@ -156,7 +156,7 @@ class Meta: budget_type = factory.Iterator(BudgetType.objects.all()) -class HistoricalProgrammeCodeFactory(factory.DjangoModelFactory): +class HistoricalProgrammeCodeFactory(factory.django.DjangoModelFactory): """ Define ArchivedProgrammeCode Factory """ @@ -170,7 +170,7 @@ class Meta: model = ArchivedProgrammeCode -class InterEntityL1Factory(factory.DjangoModelFactory): +class InterEntityL1Factory(factory.django.DjangoModelFactory): """ Define InterEntityL1 Factory """ @@ -179,7 +179,7 @@ class Meta: model = InterEntityL1 -class InterEntityFactory(factory.DjangoModelFactory): +class InterEntityFactory(factory.django.DjangoModelFactory): """ Define InterEntity Factory """ @@ -191,14 +191,14 @@ class Meta: model = InterEntity -class HistoricalInterEntityFactory(factory.DjangoModelFactory): +class HistoricalInterEntityFactory(factory.django.DjangoModelFactory): active = True class Meta: model = ArchivedInterEntity -class ProjectCodeFactory(factory.DjangoModelFactory): +class ProjectCodeFactory(factory.django.DjangoModelFactory): """ Define ProjectCode Factory """ @@ -212,7 +212,7 @@ class Meta: project_description = "Project Description" -class HistoricalProjectCodeFactory(factory.DjangoModelFactory): +class HistoricalProjectCodeFactory(factory.django.DjangoModelFactory): """ Define ArchivedProjectCode Factory """ @@ -225,7 +225,7 @@ class Meta: model = ArchivedProjectCode -class FCOMappingFactory(factory.DjangoModelFactory): +class FCOMappingFactory(factory.django.DjangoModelFactory): """ Define FCOMapping Factory """ @@ -238,7 +238,7 @@ class Meta: model = FCOMapping -class HistoricalFCOMappingFactory(factory.DjangoModelFactory): +class HistoricalFCOMappingFactory(factory.django.DjangoModelFactory): """ Define ArchivedFCOMapping Factory """ diff --git a/config/settings/base.py b/config/settings/base.py index 0135dc80..dc1c6c62 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -20,7 +20,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent.parent env = environ.Env() -env.read_env() +environ.Env.read_env(BASE_DIR / ".env") DEBUG = env.bool("DEBUG", default=False) diff --git a/config/settings/dev.py b/config/settings/dev.py index 40db0da2..2182d930 100644 --- a/config/settings/dev.py +++ b/config/settings/dev.py @@ -26,11 +26,8 @@ CACHES = { "default": { - "BACKEND": "django_redis.cache.RedisCache", + "BACKEND": "django.core.cache.backends.redis.RedisCache", "LOCATION": CELERY_BROKER_URL, - "OPTIONS": { - "CLIENT_CLASS": "django_redis.client.DefaultClient", - }, "KEY_PREFIX": "cache_", } } diff --git a/config/settings/prod.py b/config/settings/prod.py index 12dc2df0..49b17dd5 100644 --- a/config/settings/prod.py +++ b/config/settings/prod.py @@ -29,11 +29,8 @@ CACHES = { "default": { - "BACKEND": "django_redis.cache.RedisCache", + "BACKEND": "django.core.cache.backends.redis.RedisCache", "LOCATION": CELERY_BROKER_URL, - "OPTIONS": { - "CLIENT_CLASS": "django_redis.client.DefaultClient", - }, "KEY_PREFIX": "cache_", } } diff --git a/config/urls.py b/config/urls.py index de05b57d..9b85eacb 100644 --- a/config/urls.py +++ b/config/urls.py @@ -13,6 +13,7 @@ 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ + from django.conf import settings from django.contrib import admin from django.urls import include, path diff --git a/core/import_csv.py b/core/import_csv.py index 3687f9b7..a847ce28 100644 --- a/core/import_csv.py +++ b/core/import_csv.py @@ -60,10 +60,10 @@ def add_position(d, h): dictionary inside""" c = {} for k, v in d.items(): - if type(v) is dict: + if isinstance(v, dict): c[k] = add_position(v, h) else: - if type(v) is str: + if isinstance(v, str): v = v.lower() if v in h: c[k] = h[v] @@ -145,7 +145,7 @@ def read_csv_from_dict(d, row, year): default_list = {} for k, v in d[IMPORT_CSV_FIELDLIST_KEY].items(): - if type(v) is dict: + if isinstance(v, dict): default_list[k], errormsg = read_csv_from_dict(v, row, year) else: default_list[k] = get_value_from_field( @@ -185,8 +185,8 @@ def get_col_from_obj_key(obj_key): if IMPORT_CSV_IS_FK in obj_key: header_list.append(obj_key[IMPORT_CSV_IS_FK]) if IMPORT_CSV_FIELDLIST_KEY in obj_key: - for k, v in obj_key[IMPORT_CSV_FIELDLIST_KEY].items(): - if type(v) is dict: + for _, v in obj_key[IMPORT_CSV_FIELDLIST_KEY].items(): + if isinstance(v, dict): header_list = header_list + get_col_from_obj_key(v) else: header_list.append(v) @@ -254,13 +254,22 @@ class ImportInfo: def __init__( self, - key={}, + key=None, title="", - h_list=[], + h_list=None, special_import_func=None, - filter=[], + filter=None, extra_func=None, ): + if key is None: + key = {} + + if h_list is None: + h_list = [] + + if filter is None: + filter = [] + self.key = key self.special_func = special_import_func if bool(key): @@ -328,7 +337,7 @@ def get_field_name(obj_key, prefix): field_list.append(prefix + model._meta.pk.name) if IMPORT_CSV_FIELDLIST_KEY in obj_key: for k, v in obj_key[IMPORT_CSV_FIELDLIST_KEY].items(): - if type(v) is dict: + if isinstance(v, dict): field_list = field_list + get_field_name(v, prefix + k + "__") else: field_list.append(prefix + k) diff --git a/core/management/commands/create_stub_data.py b/core/management/commands/create_stub_data.py index ec046200..b4197a26 100644 --- a/core/management/commands/create_stub_data.py +++ b/core/management/commands/create_stub_data.py @@ -29,7 +29,7 @@ def create_departmental_group( ) self.counter += 1 directorate_code_base = int(group_code[0:4]) * 10 - for i in range(howmany_directorate): + for _ in range(howmany_directorate): self.create_directorate( departmental_group, "{}A".format(directorate_code_base), @@ -47,7 +47,7 @@ def create_directorate( group=departmental_group, ) self.counter += 1 - for i in range(howmany_cost_centres): + for _ in range(howmany_cost_centres): CostCentre.objects.create( cost_centre_code=888810 + self.counter, active=True, diff --git a/core/no_cache_middleware.py b/core/no_cache_middleware.py index 9c334f1c..de4d1bea 100644 --- a/core/no_cache_middleware.py +++ b/core/no_cache_middleware.py @@ -5,9 +5,9 @@ def __init__(self, get_response): def __call__(self, request): response = self.get_response(request) - response[ - "Cache-Control" - ] = "private, no-cache, no-store, must-revalidate" # noqa HTTP 1.1. + response["Cache-Control"] = ( + "private, no-cache, no-store, must-revalidate" # noqa HTTP 1.1. + ) response["Pragma"] = "no-cache" # HTTP 1.0. response["Expires"] = "0" # Proxies. diff --git a/core/remove_users.py b/core/remove_users.py index a261658b..cde41a96 100644 --- a/core/remove_users.py +++ b/core/remove_users.py @@ -124,7 +124,7 @@ def bulk_delete_users(file_obj: FileUpload) -> int: else: # needed to avoid processing empty rows at the end of the file break - workbook.close + workbook.close() final_status = FileUpload.PROCESSED if error_found: diff --git a/costcentre/exportcsv.py b/costcentre/exportcsv.py index d3aa20ac..2945eda7 100644 --- a/costcentre/exportcsv.py +++ b/costcentre/exportcsv.py @@ -54,9 +54,11 @@ def export_cc_iterator(queryset): obj.active, obj.used_for_travel, obj.disabled_with_actual, - obj.directorate.group.treasury_segment_fk.segment_long_name - if obj.directorate.group.treasury_segment_fk - else "-", + ( + obj.directorate.group.treasury_segment_fk.segment_long_name + if obj.directorate.group.treasury_segment_fk + else "-" + ), ] @@ -86,9 +88,11 @@ def export_group_iterator(queryset): yield [ obj.group_code, obj.group_name, - obj.treasury_segment_fk.segment_long_name - if obj.treasury_segment_fk - else "-", + ( + obj.treasury_segment_fk.segment_long_name + if obj.treasury_segment_fk + else "-" + ), obj.active, ] diff --git a/costcentre/test/factories.py b/costcentre/test/factories.py index 71ae03e1..d7297e42 100644 --- a/costcentre/test/factories.py +++ b/costcentre/test/factories.py @@ -15,7 +15,7 @@ fake = Faker() -class DepartmentalGroupFactory(factory.DjangoModelFactory): +class DepartmentalGroupFactory(factory.django.DjangoModelFactory): """ Define DepartmentalGroup Factory """ @@ -30,7 +30,7 @@ class Meta: active = True -class DirectorateFactory(factory.DjangoModelFactory): +class DirectorateFactory(factory.django.DjangoModelFactory): class Meta: model = Directorate django_get_or_create = ("directorate_code",) @@ -41,7 +41,7 @@ class Meta: active = True -class FinancialYearFactory(factory.DjangoModelFactory): +class FinancialYearFactory(factory.django.DjangoModelFactory): class Meta: model = FinancialYear django_get_or_create = ("financial_year",) @@ -49,7 +49,7 @@ class Meta: financial_year = 2019 -class FinanceBusinessPartnerFactory(factory.DjangoModelFactory): +class FinanceBusinessPartnerFactory(factory.django.DjangoModelFactory): class Meta: model = BusinessPartner django_get_or_create = ("name", "surname") @@ -58,7 +58,7 @@ class Meta: surname = "FBP" -class BSCEFactory(factory.DjangoModelFactory): +class BSCEFactory(factory.django.DjangoModelFactory): class Meta: model = BSCEEmail django_get_or_create = ("bsce_email",) @@ -66,7 +66,7 @@ class Meta: bsce_email = "bsceuser@test.com" # /PS-IGNORE -class CostCentreFactory(factory.DjangoModelFactory): +class CostCentreFactory(factory.django.DjangoModelFactory): """ Define CostCentre Factory """ @@ -83,7 +83,7 @@ class Meta: bsce_email = factory.SubFactory(BSCEFactory) -class ArchivedCostCentreFactory(factory.DjangoModelFactory): +class ArchivedCostCentreFactory(factory.django.DjangoModelFactory): class Meta: model = ArchivedCostCentre diff --git a/data_lake/test/test_actual_split.py b/data_lake/test/test_actual_split.py index 0fedd60d..ec0aacf6 100644 --- a/data_lake/test/test_actual_split.py +++ b/data_lake/test/test_actual_split.py @@ -51,7 +51,6 @@ def setUp(self): natural_account_code=nac_obj, project_code=project_obj, ) - self.financial_code_obj.save financial_period_queryset = FinancialPeriod.objects.filter( financial_period_code__lt=4 ) diff --git a/docker/Dockerfile.dev b/docker/Dockerfile.dev index c612a9f4..e61afe44 100644 --- a/docker/Dockerfile.dev +++ b/docker/Dockerfile.dev @@ -1,4 +1,4 @@ -FROM python:3.10-bookworm +FROM python:3.12-bookworm ENV PYTHONUNBUFFERED=1 ENV PYTHONDONTWRITEBYTECODE=1 diff --git a/download_file/test/factories.py b/download_file/test/factories.py index 20e7920a..7115220a 100644 --- a/download_file/test/factories.py +++ b/download_file/test/factories.py @@ -3,6 +3,6 @@ from upload_file.models import FileUpload -class FileUploadFactory(factory.DjangoModelFactory): +class FileUploadFactory(factory.django.DjangoModelFactory): class Meta: model = FileUpload diff --git a/download_file/test/test_views.py b/download_file/test/test_views.py index 17851da1..23a6fbda 100644 --- a/download_file/test/test_views.py +++ b/download_file/test/test_views.py @@ -49,15 +49,15 @@ def setUp(self): natural_account_code=nac_obj, project_code=project_obj, ) - financial_code_obj.save - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_apr, ) - apr_figure.save - may_figure = ForecastMonthlyFigure.objects.create( + # may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -65,7 +65,7 @@ def setUp(self): financial_code=financial_code_obj, financial_year=year_obj, ) - may_figure.save + self.year_total = self.amount_apr + self.amount_may def test_download_mi_view(self): @@ -146,16 +146,15 @@ def setUp(self): natural_account_code=nac_obj, project_code=project_obj, ) - financial_code_obj.save - apr_figure = BudgetMonthlyFigure.objects.create( + # apr figure + BudgetMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_apr, ) - apr_figure.save - - may_figure = BudgetMonthlyFigure.objects.create( + # may figure + BudgetMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -163,15 +162,14 @@ def setUp(self): financial_code=financial_code_obj, financial_year=year_obj, ) - may_figure.save financial_code_obj1 = FinancialCode.objects.create( programme=self.programme_obj, cost_centre=cost_centre, natural_account_code=nac_obj, ) - - may_figure1 = BudgetMonthlyFigure.objects.create( + # another may figure + BudgetMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -179,7 +177,6 @@ def setUp(self): financial_code=financial_code_obj1, financial_year=year_obj, ) - may_figure1.save self.year_total = self.amount_apr + self.amount_may diff --git a/end_of_month/restore_archive.py b/end_of_month/restore_archive.py index f9c3761e..b0333f81 100644 --- a/end_of_month/restore_archive.py +++ b/end_of_month/restore_archive.py @@ -71,8 +71,8 @@ def restore_archive(period_id): ).update(archived=False, archived_date=None) # Clear the actual loaded flag for periods after the se - FinancialPeriod.objects.filter(financial_period_code__gt=period_id,).update( - actual_loaded=False, + FinancialPeriod.objects.filter(financial_period_code__gt=period_id).update( + actual_loaded=False ) # Refresh the views used to send daqta to data workspace refresh_materialised_views() diff --git a/end_of_month/test/test_utils.py b/end_of_month/test/test_utils.py index 0c11d033..15489705 100644 --- a/end_of_month/test/test_utils.py +++ b/end_of_month/test/test_utils.py @@ -93,7 +93,6 @@ def __init__(self, year=0): natural_account_code=nac_obj, project_code=project_obj, ) - self.financial_code_obj.save if year == 0: year = get_current_financial_year() @@ -166,7 +165,7 @@ def __init__(self, last_archived_period=16, year=0): self.setup_forecast() self.setup_budget() # prepares the lists used to store the totals - for period in range(0, last_archived_period): + for _ in range(0, last_archived_period): self.archived_forecast.append(0) self.archived_budget.append(0) self.set_archive_period(last_archived_period) diff --git a/forecast/import_actuals.py b/forecast/import_actuals.py index ac1aa2a9..e769cb11 100644 --- a/forecast/import_actuals.py +++ b/forecast/import_actuals.py @@ -212,6 +212,7 @@ def validate_trial_balance_report(file_upload, month_number, year): str(ex), str(ex), ) + workbook.close() raise ex try: @@ -222,8 +223,9 @@ def validate_trial_balance_report(file_upload, month_number, year): str(ex), str(ex), ) - workbook.close + workbook.close() raise ex + return workbook, worksheet @@ -284,7 +286,7 @@ def upload_trial_balance_report(file_upload, month_number, financial_year): else: # needed to avoid processing empty rows at the end of the file break - workbook.close + workbook.close() final_status = FileUpload.PROCESSED if check_financial_code.error_found: diff --git a/forecast/import_budget_or_forecast.py b/forecast/import_budget_or_forecast.py index a4696e67..9c4fab93 100644 --- a/forecast/import_budget_or_forecast.py +++ b/forecast/import_budget_or_forecast.py @@ -84,7 +84,7 @@ def upload_figures(uploadmodel, data_row, year_obj, financialcode_obj, month_dic if period_figure is None: period_figure = 0 # We import from Excel, and the user may have entered spaces in an empty cell. - if type(period_figure) == str: + if isinstance(period_figure, str): period_figure = period_figure.strip() if period_figure == "-": # we accept the '-' as it is a recognised value in Finance for 0 @@ -99,7 +99,10 @@ def upload_figures(uploadmodel, data_row, year_obj, financialcode_obj, month_dic f"Non-numeric value in {data_row[month_idx].coordinate}:{period_figure}" # noqa ) if period_figure: - (figure_obj, created,) = uploadmodel.objects.get_or_create( + ( + figure_obj, + created, + ) = uploadmodel.objects.get_or_create( financial_year=year_obj, financial_code=financialcode_obj, financial_period=period_obj, @@ -215,6 +218,7 @@ def upload_figure_from_file(file_upload, year): title = "Budgets" else: title = "Forecasts" + try: workbook, worksheet = validate_excel_file(file_upload, title) except UploadFileFormatError as ex: @@ -223,8 +227,11 @@ def upload_figure_from_file(file_upload, year): str(ex), str(ex), ) + workbook.close() raise ex + header_dict = xslx_header_to_dict(worksheet[1]) + try: check_header(header_dict, EXPECTED_FIGURE_HEADERS) except UploadFileFormatError as ex: @@ -233,19 +240,21 @@ def upload_figure_from_file(file_upload, year): str(ex), str(ex), ) - workbook.close + workbook.close() raise ex + try: upload_financial_figures(worksheet, year, header_dict, file_upload) - except (UploadFileDataError) as ex: + except UploadFileDataError as ex: set_file_upload_fatal_error( file_upload, str(ex), str(ex), ) - workbook.close + workbook.close() raise ex - workbook.close + + workbook.close() def upload_budget_from_file(file_upload, year): diff --git a/forecast/management/commands/new_financial_year.py b/forecast/management/commands/new_financial_year.py index 9a3faf3c..14e31c87 100644 --- a/forecast/management/commands/new_financial_year.py +++ b/forecast/management/commands/new_financial_year.py @@ -23,7 +23,7 @@ def run_command(self, message, command_name, *arg, **options): ) self.stdout.write(self.style.ERROR(full_error_message)) raise CommandError(full_error_message) - return False + return True def handle_user(self, *args, **options): diff --git a/forecast/models.py b/forecast/models.py index 9084b810..89180b7b 100644 --- a/forecast/models.py +++ b/forecast/models.py @@ -273,9 +273,7 @@ def adj_periods(self): ) def reset_actuals(self): - self.get_queryset().filter(actual_loaded=True,).update( - actual_loaded=False, - ) + self.get_queryset().filter(actual_loaded=True).update(actual_loaded=False) def get_max_period(self): return self.get_queryset().order_by("-financial_period_code").first() @@ -574,9 +572,9 @@ def do_output_subtotal(self, current_row): if self.output_subtotal[column]: subtotal_row = self.subtotals[column].copy() level = self.subtotal_columns.index(column) - subtotal_row[ - self.display_total_column - ] = f"Total {self.previous_values[column]}" + subtotal_row[self.display_total_column] = ( + f"Total {self.previous_values[column]}" + ) show_class = TOTAL_CLASS for out_total in self.subtotal_columns[level + 1 :]: subtotal_row[self.display_total_column] = ( @@ -671,7 +669,7 @@ def calculate_subtotal_data( self.output_subtotal[column] = True if subtotal_time: self.do_output_subtotal(current_row) - for k, totals in self.subtotals.items(): + for _, totals in self.subtotals.items(): self.add_row_to_subtotal(current_row, totals) self.output_row_to_table(current_row, "") @@ -701,7 +699,13 @@ def calculate_subtotal_data( class PivotManager(models.Manager): """Managers returning the data in Monthly figures pivoted""" - def pivot_data(self, columns, filter_dict={}, year=0, order_list=[]): + def pivot_data(self, columns, filter_dict=None, year=0, order_list=None): + if filter_dict is None: + filter_dict = {} + + if order_list is None: + order_list = [] + if year == 0: year = get_current_financial_year() @@ -728,11 +732,17 @@ def subtotal_data( display_total_column, subtotal_columns, data_columns, - filter_dict={}, + filter_dict=None, year=0, - order_list=[], + order_list=None, show_grand_total=True, ): + if filter_dict is None: + filter_dict = {} + + if order_list is None: + order_list = [] + # If requesting a subtotal, the # list of columns must be specified if not subtotal_columns: @@ -768,7 +778,13 @@ def subtotal_data( show_grand_total, ) - def raw_data_annotated(self, columns, filter_dict={}, year=0, order_list=[]): + def raw_data_annotated(self, columns, filter_dict=None, year=0, order_list=None): + if filter_dict is None: + filter_dict = {} + + if order_list is None: + order_list = [] + annotations = { budget_field: Sum("budget"), "Apr": Sum("apr"), diff --git a/forecast/tables.py b/forecast/tables.py index 0296055e..0cfd2c2f 100644 --- a/forecast/tables.py +++ b/forecast/tables.py @@ -122,7 +122,10 @@ class ForecastSubTotalTable(tables.Table): # Display actual/forecast labels is_forecast = True - def __init__(self, column_dict={}, *args, **kwargs): + def __init__(self, column_dict=None, *args, **kwargs): + if column_dict is None: + column_dict = {} + cols = [(budget_field, tables.Column(budget_header, empty_values=()))] year_period_list = [] @@ -253,9 +256,9 @@ def __init__(self, column_dict={}, *args, **kwargs): self.forecast_cols = (12 + len(extra_column_to_display)) - self.num_actuals super().__init__( + *args, extra_columns=extra_column_to_display, sequence=column_list, - *args, **kwargs, ) # change the stile for columns showing "actuals". @@ -287,8 +290,17 @@ class ForecastWithLinkTable(ForecastSubTotalTable, tables.Table): display_view_details = True def __init__( - self, column_name, viewname, arg_link, code="", column_dict={}, *args, **kwargs + self, + column_name, + viewname, + arg_link, + code="", + column_dict=None, + *args, + **kwargs, ): + if column_dict is None: + column_dict = {} link_args = [] if code: diff --git a/forecast/test/factories.py b/forecast/test/factories.py index 682b76ef..8e0af577 100644 --- a/forecast/test/factories.py +++ b/forecast/test/factories.py @@ -14,7 +14,7 @@ ) -class FinancialPeriodFactory(factory.DjangoModelFactory): +class FinancialPeriodFactory(factory.django.DjangoModelFactory): class Meta: model = FinancialPeriod @@ -24,7 +24,7 @@ class Meta: period_calendar_code = 4 -class FinancialCodeFactory(factory.DjangoModelFactory): +class FinancialCodeFactory(factory.django.DjangoModelFactory): programme = factory.SubFactory(ProgrammeCodeFactory) cost_centre = factory.SubFactory(CostCentreFactory) natural_account_code = factory.SubFactory(NaturalCodeFactory) @@ -33,18 +33,18 @@ class Meta: model = FinancialCode -class BudgetMonthlyFigureFactory(factory.DjangoModelFactory): +class BudgetMonthlyFigureFactory(factory.django.DjangoModelFactory): financial_code = factory.SubFactory(FinancialCodeFactory) financial_year = factory.Iterator(FinancialYear.objects.all()) financial_period = factory.Iterator(FinancialPeriod.objects.all()) -class BudgetFactory(factory.DjangoModelFactory): +class BudgetFactory(factory.django.DjangoModelFactory): class Meta: model = BudgetMonthlyFigure -class FinancialCodeFactory(factory.DjangoModelFactory): +class FinancialCodeFactory(factory.django.DjangoModelFactory): programme = factory.SubFactory(ProgrammeCodeFactory) cost_centre = factory.SubFactory(CostCentreFactory) natural_account_code = factory.SubFactory(NaturalCodeFactory) @@ -53,7 +53,7 @@ class Meta: model = FinancialCode -class MonthlyFigureFactory(factory.DjangoModelFactory): +class MonthlyFigureFactory(factory.django.DjangoModelFactory): financial_year = factory.Iterator(FinancialYear.objects.all()) financial_period = factory.Iterator(FinancialPeriod.objects.all()) financial_code = factory.SubFactory(FinancialCodeFactory) @@ -63,16 +63,16 @@ class Meta: model = ForecastMonthlyFigure -class ForecastEditStateFactory(factory.DjangoModelFactory): +class ForecastEditStateFactory(factory.django.DjangoModelFactory): class Meta: model = ForecastEditState -class FutureForecastEditStateFactory(factory.DjangoModelFactory): +class FutureForecastEditStateFactory(factory.django.DjangoModelFactory): class Meta: model = FutureForecastEditState -class UnlockedForecastEditorFactory(factory.DjangoModelFactory): +class UnlockedForecastEditorFactory(factory.django.DjangoModelFactory): class Meta: model = UnlockedForecastEditor diff --git a/forecast/test/test_download_actual_sum.py b/forecast/test/test_download_actual_sum.py index 6962f53c..5b2e5c6f 100644 --- a/forecast/test/test_download_actual_sum.py +++ b/forecast/test/test_download_actual_sum.py @@ -67,17 +67,17 @@ def setUp(self): natural_account_code=nac_obj, project_code=project_obj, ) - financial_code_obj.save self.amount_apr_current_year = 987654300 - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_apr_current_year, ) - apr_figure.save self.amount_apr_next_year = 9898989800 - next_year_april_figures = ForecastMonthlyFigure.objects.create( + # next year april figures + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=1, ), @@ -85,7 +85,6 @@ def setUp(self): financial_code=financial_code_obj, financial_year=next_year_obj, ) - next_year_april_figures.save # Assign forecast view permission can_view_forecasts = Permission.objects.get(codename="can_view_forecasts") self.test_user.user_permissions.add(can_view_forecasts) diff --git a/forecast/test/test_download_edit_forecast.py b/forecast/test/test_download_edit_forecast.py index 49b39b6d..df680b6d 100644 --- a/forecast/test/test_download_edit_forecast.py +++ b/forecast/test/test_download_edit_forecast.py @@ -69,16 +69,16 @@ def setUp(self): natural_account_code=self.nac_obj, project_code=self.project_obj, ) - financial_code_obj.save - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_apr, ) - apr_figure.save self.amount_may = 1234567 - may_figure = ForecastMonthlyFigure.objects.create( + # may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -86,7 +86,6 @@ def setUp(self): financial_code=financial_code_obj, financial_year=year_obj, ) - may_figure.save # This will create a row with no figures. # Changed to create a record with value 0 @@ -100,7 +99,6 @@ def setUp(self): natural_account_code=self.nac_obj, project_code=project_obj1, ) - financial_code_obj1.save ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj1, diff --git a/forecast/test/test_download_forecast.py b/forecast/test/test_download_forecast.py index c1f17820..641462f4 100644 --- a/forecast/test/test_download_forecast.py +++ b/forecast/test/test_download_forecast.py @@ -63,16 +63,16 @@ def setUp(self): natural_account_code=nac_obj, project_code=self.project_obj, ) - financial_code_obj.save - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_apr, ) - apr_figure.save self.amount_may = 1234567 - may_figure = ForecastMonthlyFigure.objects.create( + # may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -80,7 +80,6 @@ def setUp(self): financial_code=financial_code_obj, financial_year=year_obj, ) - may_figure.save # Assign forecast view permission can_view_forecasts = Permission.objects.get(codename="can_view_forecasts") self.test_user.user_permissions.add(can_view_forecasts) diff --git a/forecast/test/test_download_project_detail.py b/forecast/test/test_download_project_detail.py index 25d50d1b..935810c5 100644 --- a/forecast/test/test_download_project_detail.py +++ b/forecast/test/test_download_project_detail.py @@ -62,16 +62,16 @@ def setUp(self): natural_account_code=nac_obj, project_code=project_obj, ) - financial_code_obj.save - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_apr, ) - apr_figure.save self.amount_may = 1234567 - may_figure = ForecastMonthlyFigure.objects.create( + # may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -79,7 +79,6 @@ def setUp(self): financial_code=financial_code_obj, financial_year=year_obj, ) - may_figure.save # Assign forecast view permission can_view_forecasts = Permission.objects.get(codename="can_view_forecasts") diff --git a/forecast/test/test_download_reports.py b/forecast/test/test_download_reports.py index 6a7d0b3b..804814e2 100644 --- a/forecast/test/test_download_reports.py +++ b/forecast/test/test_download_reports.py @@ -48,16 +48,16 @@ def setUp(self): natural_account_code=nac_obj, project_code=project_obj, ) - financial_code_obj.save - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_apr, ) - apr_figure.save self.amount_may = 1234567 - may_figure = ForecastMonthlyFigure.objects.create( + # may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -65,7 +65,6 @@ def setUp(self): financial_code=financial_code_obj, financial_year=year_obj, ) - may_figure.save # Assign download permission can_view_forecasts = Permission.objects.get(codename="can_download_mi_reports") self.test_user.user_permissions.add(can_view_forecasts) @@ -130,16 +129,16 @@ def setUp(self): natural_account_code=nac_obj, project_code=project_obj, ) - financial_code_obj.save - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_apr, ) - apr_figure.save self.amount_may = 1234567 - may_figure = ForecastMonthlyFigure.objects.create( + # may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -147,7 +146,6 @@ def setUp(self): financial_code=financial_code_obj, financial_year=year_obj, ) - may_figure.save can_download_files = Permission.objects.get( codename="can_download_oscar", diff --git a/forecast/test/test_edit_future_year_forecast.py b/forecast/test/test_edit_future_year_forecast.py index c249a604..713d0958 100644 --- a/forecast/test/test_edit_future_year_forecast.py +++ b/forecast/test/test_edit_future_year_forecast.py @@ -59,32 +59,29 @@ def setUp(self): cost_centre=self.cost_centre, natural_account_code=NaturalCodeFactory.create(), ) - financial_code_obj.save self.current_financial_year = get_current_financial_year() - this_year_figure = ForecastMonthlyFigure.objects.create( + # this year figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=get_financial_year_obj(self.current_financial_year), amount=self.current_year_amount, ) - this_year_figure.save - - next_year_figure = ForecastMonthlyFigure.objects.create( + # next year figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=get_financial_year_obj(self.current_financial_year + 1), amount=self.next_year_amount, ) - next_year_figure.save - - next_next_year_figure = ForecastMonthlyFigure.objects.create( + # next next year figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=get_financial_year_obj(self.current_financial_year + 2), amount=self.next_next_year_amount, ) - next_next_year_figure.save def test_correct_current_forecast(self): # Checks the 'Edit-Forecast tab' returns an 'OK' status code @@ -467,16 +464,15 @@ def setUp(self): cost_centre=self.cost_centre, natural_account_code=nac_obj, ) - financial_code_obj.save self.current_financial_year = get_current_financial_year() - this_year_figure = ForecastMonthlyFigure.objects.create( + # this year figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=get_financial_year_obj(self.current_financial_year), amount=self.current_year_amount, ) - this_year_figure.save def test_empty_future_forecast(self): # Tests that there are no emtpy rows derived from forecasts data in other years diff --git a/forecast/test/test_import_forecast_from_csv.py b/forecast/test/test_import_forecast_from_csv.py index aca0e315..1e1d06a0 100644 --- a/forecast/test/test_import_forecast_from_csv.py +++ b/forecast/test/test_import_forecast_from_csv.py @@ -40,7 +40,7 @@ def setUp(self): Analysis2Factory.create(analysis2_code=self.analisys2) self.year_obj = FinancialYear.objects.get(financial_year=2019) self.year_obj.current = True - self.year_obj.save + self.year_obj.save() def get_csv_data(self): header = ( diff --git a/forecast/test/test_utils.py b/forecast/test/test_utils.py index d286971e..25b9efc9 100644 --- a/forecast/test/test_utils.py +++ b/forecast/test/test_utils.py @@ -17,14 +17,15 @@ def create_budget(financial_code_obj, year_obj): budget_july = 1234567 budget_total = budget_apr + budget_may + budget_july # Save several months, and check that the total is displayed - apr_budget = BudgetMonthlyFigure.objects.create( + # apr figure + BudgetMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=budget_apr, ) - apr_budget.save - may_budget = BudgetMonthlyFigure.objects.create( + # may budget + BudgetMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -32,8 +33,8 @@ def create_budget(financial_code_obj, year_obj): financial_code=financial_code_obj, financial_year=year_obj, ) - may_budget.save - july_budget = BudgetMonthlyFigure.objects.create( + # july budget + BudgetMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=4, ), @@ -41,7 +42,6 @@ def create_budget(financial_code_obj, year_obj): financial_code=financial_code_obj, financial_year=year_obj, ) - july_budget.save return budget_total diff --git a/forecast/test/test_view_forecast_hierarchy.py b/forecast/test/test_view_forecast_hierarchy.py index d5fa4b4a..6965a98c 100644 --- a/forecast/test/test_view_forecast_hierarchy.py +++ b/forecast/test/test_view_forecast_hierarchy.py @@ -71,16 +71,16 @@ def setUp(self): natural_account_code=nac_obj, project_code=self.project_obj, ) - financial_code_obj.save - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_apr, ) - apr_figure.save self.amount_may = 1234567 - may_figure = ForecastMonthlyFigure.objects.create( + # may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -88,7 +88,6 @@ def setUp(self): financial_code=financial_code_obj, financial_year=year_obj, ) - may_figure.save # Assign forecast view permission can_view_forecasts = Permission.objects.get(codename="can_view_forecasts") self.test_user.user_permissions.add(can_view_forecasts) diff --git a/forecast/test/test_view_project_details.py b/forecast/test/test_view_project_details.py index 9f087682..4aafb44f 100644 --- a/forecast/test/test_view_project_details.py +++ b/forecast/test/test_view_project_details.py @@ -76,26 +76,25 @@ def setUp(self): natural_account_code=self.nac_obj, project_code=project_obj, ) - financial_code1_obj.save self.expenditure_type = ( financial_code1_obj.forecast_expenditure_type.forecast_expenditure_type_name ) - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code1_obj, financial_year=year_obj, amount=self.amount_apr, ) - apr_figure.save self.amount_may = 1234567 - may_figure = ForecastMonthlyFigure.objects.create( + # may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=4), financial_code=financial_code1_obj, financial_year=year_obj, amount=self.amount_may, ) - may_figure.save # Assign forecast view permission can_view_forecasts = Permission.objects.get(codename="can_view_forecasts") diff --git a/forecast/test/test_views.py b/forecast/test/test_views.py index 9a016c88..9f98b5af 100644 --- a/forecast/test/test_views.py +++ b/forecast/test/test_views.py @@ -141,37 +141,34 @@ def setUp(self): cost_centre=self.cost_centre, natural_account_code=self.nac1_obj, ) - financial_code1_obj.save financial_code2_obj = FinancialCode.objects.create( programme=programme_obj, cost_centre=self.cost_centre, natural_account_code=self.nac2_obj, ) - financial_code2_obj.save - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code1_obj, financial_year=year_obj, amount=self.amount1_apr, ) - apr_figure.save - - apr_figure = ForecastMonthlyFigure.objects.create( + # another apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code2_obj, financial_year=year_obj, amount=self.amount2_apr, ) - apr_figure.save self.amount_may = 1234567 - may_figure = ForecastMonthlyFigure.objects.create( + # may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=4), financial_code=financial_code1_obj, financial_year=year_obj, amount=self.amount_may, ) - may_figure.save # Assign forecast view permission can_view_forecasts = Permission.objects.get(codename="can_view_forecasts") @@ -343,26 +340,25 @@ def setUp(self): cost_centre=self.cost_centre, natural_account_code=nac_obj, ) - financial_code_obj.save self.forecast_expenditure_type_id = ( financial_code_obj.forecast_expenditure_type.forecast_expenditure_type_name ) - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), amount=amount_apr, financial_code=financial_code_obj, financial_year=year_obj, ) - apr_figure.save self.amount_may = 1234567 - may_figure = ForecastMonthlyFigure.objects.create( + # may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=4), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_may, ) - may_figure.save # Assign forecast view permission can_view_forecasts = Permission.objects.get(codename="can_view_forecasts") @@ -612,32 +608,31 @@ def setUp(self): natural_account_code=nac_obj, project_code=self.project_obj, ) - financial_code_obj.save + financial_code_obj1 = FinancialCode.objects.create( programme=self.programme_obj, cost_centre=self.cost_centre1, natural_account_code=nac_obj, project_code=self.project_obj, ) - financial_code_obj1.save - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_apr, ) - apr_figure.save - - apr_figure = ForecastMonthlyFigure.objects.create( + # another apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj1, financial_year=year_obj, amount=-self.amount_apr, ) - apr_figure.save self.amount_may = 891000 - may_figure = ForecastMonthlyFigure.objects.create( + # may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -645,9 +640,8 @@ def setUp(self): financial_code=financial_code_obj, financial_year=year_obj, ) - may_figure.save - - may_figure = ForecastMonthlyFigure.objects.create( + # another may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -655,7 +649,6 @@ def setUp(self): financial_code=financial_code_obj1, financial_year=year_obj, ) - may_figure.save # Assign forecast view permission can_view_forecasts = Permission.objects.get(codename="can_view_forecasts") diff --git a/forecast/utils/export_helpers.py b/forecast/utils/export_helpers.py index 0f4d4921..71bb94a9 100644 --- a/forecast/utils/export_helpers.py +++ b/forecast/utils/export_helpers.py @@ -176,9 +176,7 @@ def export_forecast_to_excel( # noqa C901 row_count += 1 # Formula for Year To Date. Don't use it if there are no actuals if howmany_actuals: - ws[ - f"{year_to_date_col}{row_count}" - ].value = ( + ws[f"{year_to_date_col}{row_count}"].value = ( f"=SUM({first_figure_col}{row_count}:{last_actual_col}{row_count})" ) else: @@ -186,12 +184,12 @@ def export_forecast_to_excel( # noqa C901 ws[f"{year_to_date_col}{row_count}"].value = 0 # Formula for calculating the full year - ws[ - f"{year_total_col}{row_count}" - ].value = f"=SUM({first_figure_col}{row_count}:{last_month_col}{row_count})" - ws[ - f"{over_under_spend_col}{row_count}" - ].value = f"=({budget_col}{row_count}-{year_total_col}{row_count})" + ws[f"{year_total_col}{row_count}"].value = ( + f"=SUM({first_figure_col}{row_count}:{last_month_col}{row_count})" + ) + ws[f"{over_under_spend_col}{row_count}"].value = ( + f"=({budget_col}{row_count}-{year_total_col}{row_count})" + ) format_numbers(ws, row_count, budget_index) unlock_forecast_cells(ws, row_count, first_forecast_index, last_month_index + 1) diff --git a/forecast/utils/import_helpers.py b/forecast/utils/import_helpers.py index 52d03d3d..1d3a4e73 100644 --- a/forecast/utils/import_helpers.py +++ b/forecast/utils/import_helpers.py @@ -395,7 +395,7 @@ def validate_project(self, project): return None def clean_data(self, data): - if type(data) == str: + if isinstance(data, str): return data.strip() else: return data diff --git a/forecast/views/edit_forecast.py b/forecast/views/edit_forecast.py index d7ca4384..96b84e9b 100644 --- a/forecast/views/edit_forecast.py +++ b/forecast/views/edit_forecast.py @@ -547,4 +547,4 @@ class ErrorView( TemplateView, ): def dispatch(self, request, *args, **kwargs): - 1 / 0 + return 1 / 0 diff --git a/future_years/test/future_year_utils.py b/future_years/test/future_year_utils.py index a1e7cedc..849a23ea 100644 --- a/future_years/test/future_year_utils.py +++ b/future_years/test/future_year_utils.py @@ -85,7 +85,6 @@ def __init__(self, test_year): natural_account_code=nac_obj, project_code=project_obj, ) - self.financial_code_obj.save def setup_forecast(self, future: bool): value_dict = {} diff --git a/future_years/test/test_future_year_mi_budget_download.py b/future_years/test/test_future_year_mi_budget_download.py index 828527b9..922d7d00 100644 --- a/future_years/test/test_future_year_mi_budget_download.py +++ b/future_years/test/test_future_year_mi_budget_download.py @@ -40,16 +40,15 @@ def setUp(self): natural_account_code=nac_obj, project_code=project_obj, ) - financial_code_obj.save - apr_figure = BudgetMonthlyFigure.objects.create( + # apr figure + BudgetMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_apr, ) - apr_figure.save - - may_figure = BudgetMonthlyFigure.objects.create( + # may figure + BudgetMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -57,15 +56,14 @@ def setUp(self): financial_code=financial_code_obj, financial_year=year_obj, ) - may_figure.save financial_code_obj1 = FinancialCode.objects.create( programme=self.programme_obj, cost_centre=cost_centre, natural_account_code=nac_obj, ) - - may_figure1 = BudgetMonthlyFigure.objects.create( + # another may figure + BudgetMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -73,7 +71,6 @@ def setUp(self): financial_code=financial_code_obj1, financial_year=year_obj, ) - may_figure1.save self.year_total = self.amount_apr + self.amount_may diff --git a/future_years/test/test_future_year_mi_forecast_download.py b/future_years/test/test_future_year_mi_forecast_download.py index d5b90f12..175d5614 100644 --- a/future_years/test/test_future_year_mi_forecast_download.py +++ b/future_years/test/test_future_year_mi_forecast_download.py @@ -50,16 +50,16 @@ def setUp(self): natural_account_code=nac_obj, project_code=project_obj, ) - financial_code_obj.save - apr_figure = ForecastMonthlyFigure.objects.create( + # apr figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get(financial_period_code=1), financial_code=financial_code_obj, financial_year=year_obj, amount=self.amount_apr, ) - apr_figure.save self.amount_may = 1234567 - may_figure = ForecastMonthlyFigure.objects.create( + # may figure + ForecastMonthlyFigure.objects.create( financial_period=FinancialPeriod.objects.get( financial_period_code=2, ), @@ -67,7 +67,7 @@ def setUp(self): financial_code=financial_code_obj, financial_year=year_obj, ) - may_figure.save + # Assign download permission can_view_forecasts = Permission.objects.get(codename="can_download_mi_reports") self.test_user.user_permissions.add(can_view_forecasts) diff --git a/gifthospitality/test/factories.py b/gifthospitality/test/factories.py index a46a48d3..c4304663 100644 --- a/gifthospitality/test/factories.py +++ b/gifthospitality/test/factories.py @@ -8,7 +8,7 @@ ) -class GiftsAndHospitalityFactory(factory.DjangoModelFactory): +class GiftsAndHospitalityFactory(factory.django.DjangoModelFactory): """ Define GiftsAndHospitality Factory """ @@ -17,7 +17,7 @@ class Meta: model = GiftAndHospitality -class GiftsAndHospitalityCategoryFactory(factory.DjangoModelFactory): +class GiftsAndHospitalityCategoryFactory(factory.django.DjangoModelFactory): """ Define GiftsAndHospitalityCategory Factory """ @@ -26,7 +26,7 @@ class Meta: model = GiftAndHospitalityCategory -class GiftsAndHospitalityClassificationFactory(factory.DjangoModelFactory): +class GiftsAndHospitalityClassificationFactory(factory.django.DjangoModelFactory): """ Define CostCentre Factory """ @@ -35,7 +35,7 @@ class Meta: model = GiftAndHospitalityClassification -class GiftsAndHospitalityCompanyFactory(factory.DjangoModelFactory): +class GiftsAndHospitalityCompanyFactory(factory.django.DjangoModelFactory): """ Define CostCentre Factory """ diff --git a/import_chart_of_account/import_nac_cash_income_fields.py b/import_chart_of_account/import_nac_cash_income_fields.py index eb6dab46..2341a1ac 100644 --- a/import_chart_of_account/import_nac_cash_income_fields.py +++ b/import_chart_of_account/import_nac_cash_income_fields.py @@ -164,7 +164,7 @@ def upload_nac_fields(file_obj: FileUpload) -> int: # noqa C901 else: # needed to avoid processing empty rows at the end of the file break - workbook.close + workbook.close() if not error_found: # copy new fields to tables. Use direct sql for performance @@ -184,5 +184,5 @@ def upload_nac_fields(file_obj: FileUpload) -> int: # noqa C901 set_file_upload_feedback( file_obj, f"Processed {rows_to_process} rows.", final_status ) - file_obj.user_error_message + return final_message, success diff --git a/importdata/tasks.py b/importdata/tasks.py index 340068b9..77c93442 100644 --- a/importdata/tasks.py +++ b/importdata/tasks.py @@ -12,7 +12,7 @@ def import_task(requester, type, file, import_func): import_status=AsyncImportLog.STATUS_STARTED, imported_by=requester, ) - log.save + log.save() return True logid = log.id @@ -31,5 +31,5 @@ def import_task(requester, type, file, import_func): import_message=message, import_end=datetime.now(), ) - log.save + log.save() return result diff --git a/makefile b/makefile index 7f51ec3d..60734705 100644 --- a/makefile +++ b/makefile @@ -92,11 +92,11 @@ isort-check: # Run isort-check isort: # Run isort $(web) isort . -flake8: # Run flake8 - $(web) flake8 $(file) +ruff: # Run ruff + $(web) ruff check check: # Run formatters to see if there are any errors - make flake8 + make ruff make black-check make isort-check diff --git a/oscar_return/management/commands/load_group_to_archive.py b/oscar_return/management/commands/load_group_to_archive.py index 8cee16de..ac04c02c 100644 --- a/oscar_return/management/commands/load_group_to_archive.py +++ b/oscar_return/management/commands/load_group_to_archive.py @@ -29,10 +29,9 @@ def handle(self, *args, **options): import_segment_group(csvfile, year) except (ArchiveYearError, WrongHeaderException) as ex: raise CommandError(f"Failure uploading forecast period: {str(ex)}") + finally: csvfile.close() - return - csvfile.close() if self.upload_s3: os.remove(file_name) self.stdout.write( diff --git a/oscar_return/management/commands/load_segment_to_archive.py b/oscar_return/management/commands/load_segment_to_archive.py index 182dbc72..3cd8b2c5 100644 --- a/oscar_return/management/commands/load_segment_to_archive.py +++ b/oscar_return/management/commands/load_segment_to_archive.py @@ -33,10 +33,9 @@ def handle(self, *args, **options): raise CommandError( f"Failure uploading historical Treasury segment data: {ex}" ) + finally: csvfile.close() - return - csvfile.close() if self.upload_s3: os.remove(file_name) self.stdout.write( diff --git a/pii-ner-exclude.txt b/pii-ner-exclude.txt index 21814a11..0f57ca03 100644 --- a/pii-ner-exclude.txt +++ b/pii-ner-exclude.txt @@ -40,7 +40,6 @@ Control Budget Detail Code Row Sort Order Row Long Name PESA Regional Code -Flake8 Segment Grand Parent Code Segment Grand Parent Long Name Segment Long Name diff --git a/poetry.lock b/poetry.lock index 75319b9f..f7d7f5bf 100644 --- a/poetry.lock +++ b/poetry.lock @@ -16,18 +16,15 @@ vine = ">=5.0.0,<6.0.0" [[package]] name = "asgiref" -version = "3.8.0" +version = "3.8.1" description = "ASGI specs, helper code, and adapters" optional = false python-versions = ">=3.8" files = [ - {file = "asgiref-3.8.0-py3-none-any.whl", hash = "sha256:30fc07797ad71a0abb8fe34aa03c8043308a8389abc7942d797ea9911540bc28"}, - {file = "asgiref-3.8.0.tar.gz", hash = "sha256:ec75d9d0f04e2dbfedef1f20ee73a6594af80c333df47cdd31f37e6701f7c53a"}, + {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, + {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, ] -[package.dependencies] -typing-extensions = {version = ">=4", markers = "python_version < \"3.11\""} - [package.extras] tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] @@ -52,20 +49,22 @@ tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "p [[package]] name = "beautifulsoup4" -version = "4.9.1" +version = "4.12.3" description = "Screen-scraping library" optional = false -python-versions = "*" +python-versions = ">=3.6.0" files = [ - {file = "beautifulsoup4-4.9.1-py2-none-any.whl", hash = "sha256:e718f2342e2e099b640a34ab782407b7b676f47ee272d6739e60b8ea23829f2c"}, - {file = "beautifulsoup4-4.9.1-py3-none-any.whl", hash = "sha256:a6237df3c32ccfaee4fd201c8f5f9d9df619b93121d01353a64a73ce8c6ef9a8"}, - {file = "beautifulsoup4-4.9.1.tar.gz", hash = "sha256:73cc4d115b96f79c7d77c1c7f7a0a8d4c57860d1041df407dd1aae7f07a77fd7"}, + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, ] [package.dependencies] -soupsieve = ">1.2,<2.0" +soupsieve = ">1.2" [package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] html5lib = ["html5lib"] lxml = ["lxml"] @@ -117,72 +116,85 @@ files = [ [[package]] name = "black" -version = "22.12.0" +version = "24.3.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" files = [ - {file = "black-22.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d"}, - {file = "black-22.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351"}, - {file = "black-22.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f"}, - {file = "black-22.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4"}, - {file = "black-22.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2"}, - {file = "black-22.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350"}, - {file = "black-22.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d"}, - {file = "black-22.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc"}, - {file = "black-22.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320"}, - {file = "black-22.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148"}, - {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, - {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, + {file = "black-24.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7d5e026f8da0322b5662fa7a8e752b3fa2dac1c1cbc213c3d7ff9bdd0ab12395"}, + {file = "black-24.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9f50ea1132e2189d8dff0115ab75b65590a3e97de1e143795adb4ce317934995"}, + {file = "black-24.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e2af80566f43c85f5797365077fb64a393861a3730bd110971ab7a0c94e873e7"}, + {file = "black-24.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:4be5bb28e090456adfc1255e03967fb67ca846a03be7aadf6249096100ee32d0"}, + {file = "black-24.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4f1373a7808a8f135b774039f61d59e4be7eb56b2513d3d2f02a8b9365b8a8a9"}, + {file = "black-24.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aadf7a02d947936ee418777e0247ea114f78aff0d0959461057cae8a04f20597"}, + {file = "black-24.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c02e4ea2ae09d16314d30912a58ada9a5c4fdfedf9512d23326128ac08ac3d"}, + {file = "black-24.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:bf21b7b230718a5f08bd32d5e4f1db7fc8788345c8aea1d155fc17852b3410f5"}, + {file = "black-24.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:2818cf72dfd5d289e48f37ccfa08b460bf469e67fb7c4abb07edc2e9f16fb63f"}, + {file = "black-24.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4acf672def7eb1725f41f38bf6bf425c8237248bb0804faa3965c036f7672d11"}, + {file = "black-24.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c7ed6668cbbfcd231fa0dc1b137d3e40c04c7f786e626b405c62bcd5db5857e4"}, + {file = "black-24.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:56f52cfbd3dabe2798d76dbdd299faa046a901041faf2cf33288bc4e6dae57b5"}, + {file = "black-24.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:79dcf34b33e38ed1b17434693763301d7ccbd1c5860674a8f871bd15139e7837"}, + {file = "black-24.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e19cb1c6365fd6dc38a6eae2dcb691d7d83935c10215aef8e6c38edee3f77abd"}, + {file = "black-24.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65b76c275e4c1c5ce6e9870911384bff5ca31ab63d19c76811cb1fb162678213"}, + {file = "black-24.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:b5991d523eee14756f3c8d5df5231550ae8993e2286b8014e2fdea7156ed0959"}, + {file = "black-24.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c45f8dff244b3c431b36e3224b6be4a127c6aca780853574c00faf99258041eb"}, + {file = "black-24.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6905238a754ceb7788a73f02b45637d820b2f5478b20fec82ea865e4f5d4d9f7"}, + {file = "black-24.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7de8d330763c66663661a1ffd432274a2f92f07feeddd89ffd085b5744f85e7"}, + {file = "black-24.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:7bb041dca0d784697af4646d3b62ba4a6b028276ae878e53f6b4f74ddd6db99f"}, + {file = "black-24.3.0-py3-none-any.whl", hash = "sha256:41622020d7120e01d377f74249e677039d20e6344ff5851de8a10f11f513bf93"}, + {file = "black-24.3.0.tar.gz", hash = "sha256:a0c9c4a0771afc6919578cec71ce82a3e31e054904e7197deacbc9382671c41f"}, ] [package.dependencies] click = ">=8.0.0" mypy-extensions = ">=0.4.3" +packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} [package.extras] colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] +d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "boto3" -version = "1.17.89" +version = "1.34.72" description = "The AWS SDK for Python" optional = false -python-versions = ">= 2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.8" files = [ - {file = "boto3-1.17.89-py2.py3-none-any.whl", hash = "sha256:1f02cd513b130f9cd86c99836de6a0a5f78ea55110bdbc9011d9d78ff0fd3204"}, - {file = "boto3-1.17.89.tar.gz", hash = "sha256:06d8dca85a0bb66b7bf2721745895d44691c78dbe7eb3b146702aff85e34af34"}, + {file = "boto3-1.34.72-py3-none-any.whl", hash = "sha256:a33585ef0d811ee0dffd92a96108344997a3059262c57349be0761d7885f6ae7"}, + {file = "boto3-1.34.72.tar.gz", hash = "sha256:cbfabd99c113bbb1708c2892e864b6dd739593b97a76fbb2e090a7d965b63b82"}, ] [package.dependencies] -botocore = ">=1.20.89,<1.21.0" -jmespath = ">=0.7.1,<1.0.0" -s3transfer = ">=0.4.0,<0.5.0" +botocore = ">=1.34.72,<1.35.0" +jmespath = ">=0.7.1,<2.0.0" +s3transfer = ">=0.10.0,<0.11.0" + +[package.extras] +crt = ["botocore[crt] (>=1.21.0,<2.0a0)"] [[package]] name = "botocore" -version = "1.20.89" +version = "1.34.72" description = "Low-level, data-driven core of boto 3." optional = false -python-versions = ">= 2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.8" files = [ - {file = "botocore-1.20.89-py2.py3-none-any.whl", hash = "sha256:e112f9a45db1c5a42f787e4b228a35da6e823bcba70f43f43005b4fb58066446"}, - {file = "botocore-1.20.89.tar.gz", hash = "sha256:ce0fa8bc260ad187824052805d224cee239d953bb4bfb1e52cf35ad79481b316"}, + {file = "botocore-1.34.72-py3-none-any.whl", hash = "sha256:a6b92735a73c19a7e540d77320420da3af3f32c91fa661c738c0b8c9f912d782"}, + {file = "botocore-1.34.72.tar.gz", hash = "sha256:342edb6f91d5839e790411822fc39f9c712c87cdaa7f3b1999f50b1ca16c4a14"}, ] [package.dependencies] -jmespath = ">=0.7.1,<1.0.0" +jmespath = ">=0.7.1,<2.0.0" python-dateutil = ">=2.1,<3.0.0" -urllib3 = ">=1.25.4,<1.27" +urllib3 = {version = ">=1.25.4,<2.2.0 || >2.2.0,<3", markers = "python_version >= \"3.10\""} [package.extras] -crt = ["awscrt (==0.11.15)"] +crt = ["awscrt (==0.19.19)"] [[package]] name = "celery" @@ -241,13 +253,13 @@ zstd = ["zstandard (==0.22.0)"] [[package]] name = "certifi" -version = "2023.11.17" +version = "2024.2.2" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.6" files = [ - {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, - {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, ] [[package]] @@ -429,13 +441,13 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "click-didyoumean" -version = "0.3.0" +version = "0.3.1" description = "Enables git-like *did-you-mean* feature in click" optional = false -python-versions = ">=3.6.2,<4.0.0" +python-versions = ">=3.6.2" files = [ - {file = "click-didyoumean-0.3.0.tar.gz", hash = "sha256:f184f0d851d96b6d29297354ed981b7dd71df7ff500d82fa6d11f0856bee8035"}, - {file = "click_didyoumean-0.3.0-py3-none-any.whl", hash = "sha256:a0713dc7a1de3f06bc0df5a9567ad19ead2d3d5689b434768a6145bff77c0667"}, + {file = "click_didyoumean-0.3.1-py3-none-any.whl", hash = "sha256:5c4bb6007cfea5f2fd6583a2fb6701a22a41eb98957e63d0fac41c10e7c3117c"}, + {file = "click_didyoumean-0.3.1.tar.gz", hash = "sha256:4f82fdff0dbe64ef8ab2279bd6aa3f6a99c3b28c05aa09cbfc07c9d7fbb5a463"}, ] [package.dependencies] @@ -460,19 +472,21 @@ dev = ["coveralls", "pytest (>=3.6)", "pytest-cov", "wheel"] [[package]] name = "click-repl" -version = "0.2.0" +version = "0.3.0" description = "REPL plugin for Click" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "click-repl-0.2.0.tar.gz", hash = "sha256:cd12f68d745bf6151210790540b4cb064c7b13e571bc64b6957d98d120dacfd8"}, - {file = "click_repl-0.2.0-py3-none-any.whl", hash = "sha256:94b3fbbc9406a236f176e0506524b2937e4b23b6f4c0c0b2a0a83f8a64e9194b"}, + {file = "click-repl-0.3.0.tar.gz", hash = "sha256:17849c23dba3d667247dc4defe1757fff98694e90fe37474f3feebb69ced26a9"}, + {file = "click_repl-0.3.0-py3-none-any.whl", hash = "sha256:fb7e06deb8da8de86180a33a9da97ac316751c094c6899382da7feeeeb51b812"}, ] [package.dependencies] -click = "*" -prompt-toolkit = "*" -six = "*" +click = ">=7.0" +prompt-toolkit = ">=3.0.36" + +[package.extras] +testing = ["pytest (>=7.2.1)", "pytest-cov (>=4.0.0)", "tox (>=4.4.3)"] [[package]] name = "colorama" @@ -546,33 +560,49 @@ files = [ {file = "coverage-7.4.4.tar.gz", hash = "sha256:c901df83d097649e257e803be22592aedfd5182f07b3cc87d640bbb9afd50f49"}, ] -[package.dependencies] -tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} - [package.extras] toml = ["tomli"] +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + [[package]] name = "diff-match-patch" -version = "20121119" -description = "The Diff Match and Patch libraries offer robust algorithms to perform the operations required for synchronizing plain text." +version = "20230430" +description = "Diff Match and Patch" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "diff-match-patch-20121119.tar.gz", hash = "sha256:9dba5611fbf27893347349fd51cc1911cb403682a7163373adacc565d11e2e4c"}, + {file = "diff-match-patch-20230430.tar.gz", hash = "sha256:953019cdb9c9d2c9e47b5b12bcff3cf4746fc4598eb406076fa1fc27e6a1f15c"}, + {file = "diff_match_patch-20230430-py3-none-any.whl", hash = "sha256:dce43505fb7b1b317de7195579388df0746d90db07015ed47a85e5e44930ef93"}, ] +[package.extras] +dev = ["attribution (==1.6.2)", "black (==23.3.0)", "flit (==3.8.0)", "mypy (==1.2.0)", "ufmt (==2.1.0)", "usort (==1.0.6)"] + [[package]] name = "dj-database-url" -version = "0.5.0" +version = "2.1.0" description = "Use Database URLs in your Django Application." optional = false python-versions = "*" files = [ - {file = "dj-database-url-0.5.0.tar.gz", hash = "sha256:4aeaeb1f573c74835b0686a2b46b85990571159ffc21aa57ecd4d1e1cb334163"}, - {file = "dj_database_url-0.5.0-py2.py3-none-any.whl", hash = "sha256:851785365761ebe4994a921b433062309eb882fedd318e1b0fcecc607ed02da9"}, + {file = "dj-database-url-2.1.0.tar.gz", hash = "sha256:f2042cefe1086e539c9da39fad5ad7f61173bf79665e69bf7e4de55fa88b135f"}, + {file = "dj_database_url-2.1.0-py3-none-any.whl", hash = "sha256:04bc34b248d4c21aaa13e4ab419ae6575ef5f10f3df735ce7da97722caa356e0"}, ] +[package.dependencies] +Django = ">=3.2" +typing-extensions = ">=3.10.0.0" + [[package]] name = "django" version = "4.2.11" @@ -595,85 +625,97 @@ bcrypt = ["bcrypt"] [[package]] name = "django-admin-list-filter-dropdown" -version = "1.0.1" +version = "1.0.3" description = "Use dropdowns in Django admin list filter" optional = false python-versions = "*" files = [ - {file = "django-admin-list-filter-dropdown-1.0.1.zip", hash = "sha256:e79856c790224c5a466bf222bb99d5a2a73f5e4ed954cb1b6fcc4a52f078b3b9"}, + {file = "django-admin-list-filter-dropdown-1.0.3.tar.gz", hash = "sha256:07cd37b6a9be1b08f11d4a92957c69b67bc70b1f87a2a7d4ae886c93ea51eb53"}, + {file = "django_admin_list_filter_dropdown-1.0.3-py3-none-any.whl", hash = "sha256:bf1b48bab9772dad79db71efef17e78782d4f2421444d5e49bb10e0da71cd6bb"}, ] [[package]] name = "django-audit-log-middleware" -version = "0.0.4" +version = "0.0.5" description = "Simple audit logging for Django requests" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "django_audit_log_middleware-0.0.4.tar.gz", hash = "sha256:e92b1b594db68720ac35edfecc21daaf8d1c446af00622ade4de14bcbc43329b"}, + {file = "django_audit_log_middleware-0.0.5-py3-none-any.whl", hash = "sha256:9d9783da2891b75233684eecc1fe548960f48fbae1faecf5e7422cd9451f8a21"}, + {file = "django_audit_log_middleware-0.0.5.tar.gz", hash = "sha256:8648209ab2976e3d0a6708be28a1650e7c316a1cfa9fdf209bbc766771666bbd"}, ] [package.dependencies] django = ">=2.2.0" -django-ipware = ">=3.0.2,<3.1.0" +django-ipware = ">=3.0.2" [[package]] name = "django-autocomplete-light" -version = "3.3.2" +version = "3.11.0" description = "Fresh autocompletes for Django" optional = false python-versions = "*" files = [ - {file = "django-autocomplete-light-3.3.2.tar.gz", hash = "sha256:996cc62519a6e2e9cd1c26e57ddc5f14541209a93e62e83d7b3df3ba65c1f458"}, + {file = "django-autocomplete-light-3.11.0.tar.gz", hash = "sha256:212576a17e3308ef7ca77e280b86684167916d2091d4b73640f38845d9516328"}, ] +[package.dependencies] +django = ">=3.2" + [package.extras] genericm2m = ["django-generic-m2m"] -gfk = ["django-querysetsequence (>=0.7.1)"] -nested = ["django-nested-admin"] +gfk = ["django-querysetsequence (>=0.11)"] +nested = ["django-nested-admin (>=3.0.21)"] tags = ["django-taggit"] [[package]] name = "django-axes" -version = "5.9.0" +version = "6.4.0" description = "Keep track of failed login attempts in Django-powered sites." optional = false -python-versions = "~=3.6" +python-versions = ">=3.7" files = [ - {file = "django-axes-5.9.0.tar.gz", hash = "sha256:320ddc577387b1b7926468b9313fd8048f86b70e35a02faa858cbac003900374"}, - {file = "django_axes-5.9.0-py3-none-any.whl", hash = "sha256:25827cd722b006845e9abd5ecbfba92ebad3935a29258d457158212d4e1f0ded"}, + {file = "django-axes-6.4.0.tar.gz", hash = "sha256:aff0e853ae9cddbdd9e8dc703b46915a9960012dab602552f61b43c0777bc731"}, + {file = "django_axes-6.4.0-py3-none-any.whl", hash = "sha256:70508d108abc19bcfdd3e9ef7c9d526a014029a8e2ba51f03a5a8348d6eca1b9"}, ] [package.dependencies] -django = ">=2.0" -django-ipware = ">=3,<4" +django = ">=3.2" + +[package.extras] +ipware = ["django-ipware (>=3)"] [[package]] name = "django-chunk-upload-handlers" -version = "0.0.10" +version = "0.0.14" description = "Chunking Django file handlers for S3 and ClamAV service uploads" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "django_chunk_upload_handlers-0.0.10.tar.gz", hash = "sha256:5e86ee0c8cf8efc8f7911b6cfb0ebd6be87e0b3a8f03b91d345d56f824c6cff7"}, + {file = "django_chunk_upload_handlers-0.0.14.tar.gz", hash = "sha256:4a8c7113f1fea9f307b4caa79995dc5824c7f5bc70bdc486cb93b5091d782854"}, ] [package.dependencies] boto3 = ">=1.17.89" -django = ">=3.0.14" +django = ">=4.2.9,<4.3.0" django-storages = ">=1.11.1" [[package]] name = "django-environ" -version = "0.4.5" -description = "Django-environ allows you to utilize 12factor inspired environment variables to configure your Django application." +version = "0.11.2" +description = "A package that allows you to utilize 12factor inspired environment variables to configure your Django application." optional = false -python-versions = "*" +python-versions = ">=3.6,<4" files = [ - {file = "django-environ-0.4.5.tar.gz", hash = "sha256:6c9d87660142608f63ec7d5ce5564c49b603ea8ff25da595fd6098f6dc82afde"}, - {file = "django_environ-0.4.5-py2.py3-none-any.whl", hash = "sha256:c57b3c11ec1f319d9474e3e5a79134f40174b17c7cc024bbb2fad84646b120c4"}, + {file = "django-environ-0.11.2.tar.gz", hash = "sha256:f32a87aa0899894c27d4e1776fa6b477e8164ed7f6b3e410a62a6d72caaf64be"}, + {file = "django_environ-0.11.2-py2.py3-none-any.whl", hash = "sha256:0ff95ab4344bfeff693836aa978e6840abef2e2f1145adff7735892711590c05"}, ] +[package.extras] +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" @@ -690,71 +732,73 @@ Django = ">=3.2" [[package]] name = "django-filter" -version = "2.4.0" +version = "24.2" description = "Django-filter is a reusable Django application for allowing users to filter querysets dynamically." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "django-filter-2.4.0.tar.gz", hash = "sha256:84e9d5bb93f237e451db814ed422a3a625751cbc9968b484ecc74964a8696b06"}, - {file = "django_filter-2.4.0-py3-none-any.whl", hash = "sha256:e00d32cebdb3d54273c48f4f878f898dced8d5dfaad009438fe61ebdf535ace1"}, + {file = "django-filter-24.2.tar.gz", hash = "sha256:48e5fc1da3ccd6ca0d5f9bb550973518ce977a4edde9d2a8a154a7f4f0b9f96e"}, + {file = "django_filter-24.2-py3-none-any.whl", hash = "sha256:df2ee9857e18d38bed203c8745f62a803fa0f31688c9fe6f8e868120b1848e48"}, ] [package.dependencies] -Django = ">=2.2" +Django = ">=4.2" [[package]] name = "django-guardian" -version = "2.2.0" +version = "2.4.0" description = "Implementation of per object permissions for Django." optional = false python-versions = ">=3.5" files = [ - {file = "django-guardian-2.2.0.tar.gz", hash = "sha256:8cacf49ebcc1e545f0a8997971eec0fe109f5ed31fc2a569a7bf5615453696e2"}, - {file = "django_guardian-2.2.0-py3-none-any.whl", hash = "sha256:ac81e88372fdf1795d84ba065550e739b42e9c6d07cdf201cf5bbf9efa7f396c"}, + {file = "django-guardian-2.4.0.tar.gz", hash = "sha256:c58a68ae76922d33e6bdc0e69af1892097838de56e93e78a8361090bcd9f89a0"}, + {file = "django_guardian-2.4.0-py3-none-any.whl", hash = "sha256:440ca61358427e575323648b25f8384739e54c38b3d655c81d75e0cd0d61b697"}, ] [package.dependencies] -Django = ">=2.1" +Django = ">=2.2" [[package]] name = "django-import-export" -version = "2.4.0" +version = "3.3.7" description = "Django application and library for importing and exporting data with included admin integration." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "django-import-export-2.4.0.tar.gz", hash = "sha256:401d76eca0a5c6cf43bffed16c06e509b9044ce8f6bcff264b776e3952830f1a"}, - {file = "django_import_export-2.4.0-py3-none-any.whl", hash = "sha256:7610f6efff797d65f56c03ba34444507c0b0ccdffe9346c168b9894fc349c55e"}, + {file = "django-import-export-3.3.7.tar.gz", hash = "sha256:39a4216c26a2dba6429b64c68b3fe282a6279bb71afb4015c13df0696bdbb4cd"}, + {file = "django_import_export-3.3.7-py3-none-any.whl", hash = "sha256:dffedd53bed33cfcceb3b2f13d4fd93a21826f9a2ae37b9926a1e1f4be24bcb9"}, ] [package.dependencies] diff-match-patch = "*" -Django = ">=2.0" -tablib = {version = ">=0.14.0", extras = ["html", "ods", "xls", "xlsx", "yaml"]} +Django = ">=3.2" +tablib = {version = "3.5.0", extras = ["html", "ods", "xls", "xlsx", "yaml"]} [[package]] name = "django-ipware" -version = "3.0.2" -description = "A Django utility application that returns client's real IP address" +version = "3.0.7" +description = "A Django application to retrieve user's IP address" optional = false -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "django-ipware-3.0.2.tar.gz", hash = "sha256:c7df8e1410a8e5d6b1fbae58728402ea59950f043c3582e033e866f0f0cf5e94"}, + {file = "django-ipware-3.0.7.tar.gz", hash = "sha256:753f8214a16ccaac54ea977349a96e37b582a28a54065e00c1c46d530862c85e"}, + {file = "django_ipware-3.0.7-py2.py3-none-any.whl", hash = "sha256:a18820ea2b98ff3f87b7530eb6346f5feb65d18e89397606aacc098fa7b93db2"}, ] [[package]] name = "django-log-formatter-ecs" -version = "0.0.3" +version = "0.0.5" description = "ECS log formatter for Django" optional = false python-versions = ">=3.6" files = [ - {file = "django_log_formatter_ecs-0.0.3.tar.gz", hash = "sha256:116d98d61b407dbff6654c7854072d6f3ab519bfc4718330e7aa91d07d17dfc3"}, + {file = "django_log_formatter_ecs-0.0.5-py3-none-any.whl", hash = "sha256:1e8731dd25a11ac64e789f19931e12fe7ef8ad1a172b7bceb2ea5cab185a583e"}, + {file = "django_log_formatter_ecs-0.0.5.tar.gz", hash = "sha256:6b9784fe31eb1bd6598dc7db0f7f647e03ea6c3926c73cd1c9221adefee289ad"}, ] [package.dependencies] -django-ipware = ">=2.1.0" -kubi-ecs-logger = ">=0.0.6" +django-ipware = ">=3.0,<4.0" +kubi-ecs-logger = ">=0.1.0,<0.2.0" [[package]] name = "django-pivot" @@ -770,21 +814,6 @@ files = [ [package.dependencies] django = ">=3.2" -[[package]] -name = "django-redis" -version = "4.12.1" -description = "Full featured redis cache backend for Django." -optional = false -python-versions = ">=3.5" -files = [ - {file = "django-redis-4.12.1.tar.gz", hash = "sha256:306589c7021e6468b2656edc89f62b8ba67e8d5a1c8877e2688042263daa7a63"}, - {file = "django_redis-4.12.1-py3-none-any.whl", hash = "sha256:1133b26b75baa3664164c3f44b9d5d133d1b8de45d94d79f38d1adc5b1d502e5"}, -] - -[package.dependencies] -Django = ">=2.2" -redis = ">=3.0.0" - [[package]] name = "django-reversion" version = "5.0.12" @@ -814,15 +843,18 @@ django = "*" [[package]] name = "django-simple-history" -version = "3.0.0" +version = "3.5.0" description = "Store model history and view/revert changes from admin site." optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "django-simple-history-3.0.0.tar.gz", hash = "sha256:66fe76c560054be393c52b1799661e104fbe372918d37d151e5d41c676158118"}, - {file = "django_simple_history-3.0.0-py2.py3-none-any.whl", hash = "sha256:a312adfe8fbec4c450b08e641b11249a8a589a7e7d1ba2404764b8b5bed53552"}, + {file = "django-simple-history-3.5.0.tar.gz", hash = "sha256:eef2943d7c846270f11c8136f38a3ba00de2bebd7b1b89037de5d9b148ed677a"}, + {file = "django_simple_history-3.5.0-py3-none-any.whl", hash = "sha256:0030b3bb5ed219d6453320213e75cfa00dab7a381946124df9411729101c8874"}, ] +[package.dependencies] +asgiref = ">=3.6" + [[package]] name = "django-staff-sso-client" version = "4.2.2" @@ -843,118 +875,109 @@ test = ["build", "codecov", "flake8 (==4.0.1)", "pytest (==7.1.1)", "pytest-cov" [[package]] name = "django-storages" -version = "1.11.1" +version = "1.14.2" description = "Support for many storage backends in Django" optional = false -python-versions = ">=3.5" +python-versions = ">=3.7" files = [ - {file = "django-storages-1.11.1.tar.gz", hash = "sha256:c823dbf56c9e35b0999a13d7e05062b837bae36c518a40255d522fbe3750fbb4"}, - {file = "django_storages-1.11.1-py3-none-any.whl", hash = "sha256:f28765826d507a0309cfaa849bd084894bc71d81bf0d09479168d44785396f80"}, + {file = "django-storages-1.14.2.tar.gz", hash = "sha256:51b36af28cc5813b98d5f3dfe7459af638d84428c8df4a03990c7d74d1bea4e5"}, + {file = "django_storages-1.14.2-py3-none-any.whl", hash = "sha256:1db759346b52ada6c2efd9f23d8241ecf518813eb31db9e2589207174f58f6ad"}, ] [package.dependencies] -Django = ">=2.2" +Django = ">=3.2" [package.extras] -azure = ["azure-storage-blob (>=1.3.1,<12.0.0)"] +azure = ["azure-core (>=1.13)", "azure-storage-blob (>=12)"] boto3 = ["boto3 (>=1.4.4)"] dropbox = ["dropbox (>=7.2.1)"] -google = ["google-cloud-storage (>=1.15.0)"] +google = ["google-cloud-storage (>=1.27)"] libcloud = ["apache-libcloud"] -sftp = ["paramiko"] +s3 = ["boto3 (>=1.4.4)"] +sftp = ["paramiko (>=1.15)"] [[package]] name = "django-tables2" -version = "2.4.0" +version = "2.7.0" description = "Table/data-grid framework for Django" optional = false python-versions = "*" files = [ - {file = "django-tables2-2.4.0.tar.gz", hash = "sha256:4eb526464ee56a0b7d827d1da9a4f257e44edb5e1cbb6a0cfb6ca0fed70d8e4f"}, - {file = "django_tables2-2.4.0-py2.py3-none-any.whl", hash = "sha256:0f10ecef25708385a9d32d68d7c9478ca8dda31569410cb05a025be3f2c57593"}, + {file = "django-tables2-2.7.0.tar.gz", hash = "sha256:4113fcc575eb438a12e83a4d4ea01452e4800d970e8bdd0e4122ac171af1900d"}, + {file = "django_tables2-2.7.0-py2.py3-none-any.whl", hash = "sha256:99e06d966ca8ac69fd74092eb45c79a280dd5ca0ccb81395d96261f62128e1af"}, ] [package.dependencies] -Django = ">=1.11" +Django = ">=3.2" [package.extras] tablib = ["tablib"] [[package]] name = "djangorestframework" -version = "3.15.0" +version = "3.15.1" description = "Web APIs for Django, made easy." optional = false python-versions = ">=3.6" files = [ - {file = "djangorestframework-3.15.0-py3-none-any.whl", hash = "sha256:5fa616048a7ec287fdaab3148aa5151efb73f7f8be1e23a9d18484e61e672695"}, - {file = "djangorestframework-3.15.0.tar.gz", hash = "sha256:3f4a263012e1b263bf49a4907eb4cfe14de840a09b1ba64596d01a9c54835919"}, + {file = "djangorestframework-3.15.1-py3-none-any.whl", hash = "sha256:3ccc0475bce968608cf30d07fb17d8e52d1d7fc8bfe779c905463200750cbca6"}, + {file = "djangorestframework-3.15.1.tar.gz", hash = "sha256:f88fad74183dfc7144b2756d0d2ac716ea5b4c7c9840995ac3bfd8ec034333c1"}, ] [package.dependencies] django = ">=3.0" +[[package]] +name = "ecs-logging" +version = "2.1.0" +description = "Logging formatters for ECS (Elastic Common Schema) in Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "ecs_logging-2.1.0-py3-none-any.whl", hash = "sha256:02581a56b7fc6cbae2de121a4a398ba3bd73d7bb2d67cd029a8a03df0b144098"}, + {file = "ecs_logging-2.1.0.tar.gz", hash = "sha256:222cc158d4331157d128bc903629010f7724eab8ba4b642efbffd0cb482f4cde"}, +] + +[package.extras] +develop = ["elastic-apm", "mock", "pytest", "pytest-cov", "structlog"] + [[package]] name = "elastic-apm" -version = "6.2.2" +version = "6.21.4.post8347027212" description = "The official Python module for Elastic APM" optional = false python-versions = "<4,>=3.6" files = [ - {file = "elastic-apm-6.2.2.tar.gz", hash = "sha256:22b335d19252364f4892c6bb51d7024573a76364efd2550d10a5013ea61f8094"}, - {file = "elastic_apm-6.2.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:8c37dd8e4008a2dc22eae3f287b0da154a6d5f079a981deabc6a88e6935bce17"}, - {file = "elastic_apm-6.2.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:a1c511e131b044d81aa31743474c0c908ca04c53c67f516b9354cca8f96fa206"}, - {file = "elastic_apm-6.2.2-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:3c6aadf5dd959028847a86cab99b666289909ad9bf0e2331e6407b167a847edf"}, - {file = "elastic_apm-6.2.2-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:b7d5e7bb4469a9e78df99339b2155b8cbd0f4ec5cb866014787ac5cf6fbb6092"}, - {file = "elastic_apm-6.2.2-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6dbfceaff76184cf490a157547961b97a018221a7fc4159c31f2b028dea098a2"}, - {file = "elastic_apm-6.2.2-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e68bb4d0d61864b40a4941b06053bb0c806587fccc866984e865d96c9d1a7580"}, - {file = "elastic_apm-6.2.2-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:999086599c32e7944ab5a45d80536a281a0636c937358b2f308ff41fd55407bc"}, - {file = "elastic_apm-6.2.2-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:db54b974819c7e02954883fa1037662756ba5e564cac61dd65f4238a426974df"}, - {file = "elastic_apm-6.2.2-cp38-cp38-manylinux1_i686.whl", hash = "sha256:127a76fc93dd1a3f35839f7f51d3e62af827a521d3e4e67681fed9289accb5b7"}, - {file = "elastic_apm-6.2.2-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:dbba30675f5bfea2c0c412bb8313cfa4caa34191c4b6b475d7cfda2d4ecebdd7"}, - {file = "elastic_apm-6.2.2-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a1e86b8abe84eb0566b8c35efd6a9daf0287405136eba53f85442631ea891b39"}, - {file = "elastic_apm-6.2.2-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:eb9399614e3e61046277d18a99bfcfbb76fdd078d3152aa414b6c9f081cc1d06"}, - {file = "elastic_apm-6.2.2-cp39-cp39-manylinux1_i686.whl", hash = "sha256:82083fd17c2b9b582ceefa9834ec57f3ba2a2b93586de0de0d3c0727c720569b"}, - {file = "elastic_apm-6.2.2-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:9c30cf1a85b4b9fcf928809a99c3da125fe2d28bc5c3b67094859b23c9c65f67"}, - {file = "elastic_apm-6.2.2-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:797c2aabf015e02c7ff26c133e49bbfaa73127dba394061789f276e951f98fbc"}, - {file = "elastic_apm-6.2.2-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c86f37db7b4874ea38893ab695f1d831cccf4f40c55264863101bfe5bf1c7d94"}, + {file = "elastic-apm-6.21.4.post8347027212.tar.gz", hash = "sha256:1861183c5ba3b46df66e111ba27877dbe8aaa8842777c1f0627c7fb1b65ed249"}, + {file = "elastic_apm-6.21.4.post8347027212-py2.py3-none-any.whl", hash = "sha256:7a5e430658196c9ebcf4530e780268b0dfe2ba2c25041549ee54d9fb8650c418"}, ] [package.dependencies] certifi = "*" -urllib3 = "*" +ecs-logging = "*" +urllib3 = "<2.0.0 || >2.0.0,<3.0.0" +wrapt = ">=1.14.1,<1.15.0" [package.extras] aiohttp = ["aiohttp"] flask = ["blinker"] +opentelemetry = ["opentelemetry-api", "opentelemetry-sdk"] opentracing = ["opentracing (>=2.0.0)"] +sanic = ["sanic"] starlette = ["starlette"] tornado = ["tornado"] [[package]] name = "et-xmlfile" -version = "1.0.1" +version = "1.1.0" description = "An implementation of lxml.xmlfile for the standard library" optional = false -python-versions = "*" -files = [ - {file = "et_xmlfile-1.0.1.tar.gz", hash = "sha256:614d9722d572f6246302c4491846d2c393c199cfa4edc9af593437691683335b"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.2.0" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" +python-versions = ">=3.6" files = [ - {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, - {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, + {file = "et_xmlfile-1.1.0-py3-none-any.whl", hash = "sha256:a2ba85d1d6a74ef63837eed693bcb89c3f752169b0e3e7ae5b16ca5e1b3deada"}, + {file = "et_xmlfile-1.1.0.tar.gz", hash = "sha256:8eb9e2bc2f8c97e37a2dc85a09ecdcdec9d8a396530a6d5a33b30b9a92da0c5c"}, ] -[package.extras] -test = ["pytest (>=6)"] - [[package]] name = "execnet" version = "2.0.2" @@ -971,48 +994,35 @@ testing = ["hatch", "pre-commit", "pytest", "tox"] [[package]] name = "factory-boy" -version = "2.12.0" +version = "3.3.0" description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7" files = [ - {file = "factory_boy-2.12.0-py2.py3-none-any.whl", hash = "sha256:728df59b372c9588b83153facf26d3d28947fc750e8e3c95cefa9bed0e6394ee"}, - {file = "factory_boy-2.12.0.tar.gz", hash = "sha256:faf48d608a1735f0d0a3c9cbf536d64f9132b547dae7ba452c4d99a79e84a370"}, + {file = "factory_boy-3.3.0-py2.py3-none-any.whl", hash = "sha256:a2cdbdb63228177aa4f1c52f4b6d83fab2b8623bf602c7dedd7eb83c0f69c04c"}, + {file = "factory_boy-3.3.0.tar.gz", hash = "sha256:bc76d97d1a65bbd9842a6d722882098eb549ec8ee1081f9fb2e8ff29f0c300f1"}, ] [package.dependencies] Faker = ">=0.7.0" +[package.extras] +dev = ["Django", "Pillow", "SQLAlchemy", "coverage", "flake8", "isort", "mongoengine", "sqlalchemy-utils", "tox", "wheel (>=0.32.0)", "zest.releaser[recommended]"] +doc = ["Sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] + [[package]] name = "faker" -version = "4.18.0" +version = "24.4.0" description = "Faker is a Python package that generates fake data for you." optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "Faker-4.18.0-py3-none-any.whl", hash = "sha256:2ba20a4438429cb08d729175d7bb0435ef3c2c4cedc7b1ceb703ee6da8dad906"}, - {file = "Faker-4.18.0.tar.gz", hash = "sha256:6279746aed175a693108238e6d1ab8d7e26d0ec7ff8474f61025b9fdaae15d65"}, + {file = "Faker-24.4.0-py3-none-any.whl", hash = "sha256:998c29ee7d64429bd59204abffa9ba11f784fb26c7b9df4def78d1a70feb36a7"}, + {file = "Faker-24.4.0.tar.gz", hash = "sha256:a5ddccbe97ab691fad6bd8036c31f5697cfaa550e62e000078d1935fa8a7ec2e"}, ] [package.dependencies] python-dateutil = ">=2.4" -text-unidecode = "1.3" - -[[package]] -name = "flake8" -version = "3.8.4" -description = "the modular source code checker: pep8 pyflakes and co" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -files = [ - {file = "flake8-3.8.4-py2.py3-none-any.whl", hash = "sha256:749dbbd6bfd0cf1318af27bf97a14e28e5ff548ef8e5b1566ccfb25a11e7c839"}, - {file = "flake8-3.8.4.tar.gz", hash = "sha256:aadae8761ec651813c24be05c6f7b4680857ef6afaae4651a4eccaef97ce6c3b"}, -] - -[package.dependencies] -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.6.0a1,<2.7.0" -pyflakes = ">=2.2.0,<2.3.0" [[package]] name = "freezegun" @@ -1030,59 +1040,57 @@ python-dateutil = ">=2.7" [[package]] name = "gevent" -version = "23.9.1" +version = "24.2.1" description = "Coroutine-based network library" optional = false python-versions = ">=3.8" files = [ - {file = "gevent-23.9.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:a3c5e9b1f766a7a64833334a18539a362fb563f6c4682f9634dea72cbe24f771"}, - {file = "gevent-23.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b101086f109168b23fa3586fccd1133494bdb97f86920a24dc0b23984dc30b69"}, - {file = "gevent-23.9.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:36a549d632c14684bcbbd3014a6ce2666c5f2a500f34d58d32df6c9ea38b6535"}, - {file = "gevent-23.9.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:272cffdf535978d59c38ed837916dfd2b5d193be1e9e5dcc60a5f4d5025dd98a"}, - {file = "gevent-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dcb8612787a7f4626aa881ff15ff25439561a429f5b303048f0fca8a1c781c39"}, - {file = "gevent-23.9.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:d57737860bfc332b9b5aa438963986afe90f49645f6e053140cfa0fa1bdae1ae"}, - {file = "gevent-23.9.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:5f3c781c84794926d853d6fb58554dc0dcc800ba25c41d42f6959c344b4db5a6"}, - {file = "gevent-23.9.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:dbb22a9bbd6a13e925815ce70b940d1578dbe5d4013f20d23e8a11eddf8d14a7"}, - {file = "gevent-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:707904027d7130ff3e59ea387dddceedb133cc742b00b3ffe696d567147a9c9e"}, - {file = "gevent-23.9.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:45792c45d60f6ce3d19651d7fde0bc13e01b56bb4db60d3f32ab7d9ec467374c"}, - {file = "gevent-23.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e24c2af9638d6c989caffc691a039d7c7022a31c0363da367c0d32ceb4a0648"}, - {file = "gevent-23.9.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e1ead6863e596a8cc2a03e26a7a0981f84b6b3e956101135ff6d02df4d9a6b07"}, - {file = "gevent-23.9.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65883ac026731ac112184680d1f0f1e39fa6f4389fd1fc0bf46cc1388e2599f9"}, - {file = "gevent-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf7af500da05363e66f122896012acb6e101a552682f2352b618e541c941a011"}, - {file = "gevent-23.9.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:c3e5d2fa532e4d3450595244de8ccf51f5721a05088813c1abd93ad274fe15e7"}, - {file = "gevent-23.9.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c84d34256c243b0a53d4335ef0bc76c735873986d478c53073861a92566a8d71"}, - {file = "gevent-23.9.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ada07076b380918829250201df1d016bdafb3acf352f35e5693b59dceee8dd2e"}, - {file = "gevent-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:921dda1c0b84e3d3b1778efa362d61ed29e2b215b90f81d498eb4d8eafcd0b7a"}, - {file = "gevent-23.9.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:ed7a048d3e526a5c1d55c44cb3bc06cfdc1947d06d45006cc4cf60dedc628904"}, - {file = "gevent-23.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c1abc6f25f475adc33e5fc2dbcc26a732608ac5375d0d306228738a9ae14d3b"}, - {file = "gevent-23.9.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4368f341a5f51611411ec3fc62426f52ac3d6d42eaee9ed0f9eebe715c80184e"}, - {file = "gevent-23.9.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:52b4abf28e837f1865a9bdeef58ff6afd07d1d888b70b6804557e7908032e599"}, - {file = "gevent-23.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:52e9f12cd1cda96603ce6b113d934f1aafb873e2c13182cf8e86d2c5c41982ea"}, - {file = "gevent-23.9.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:de350fde10efa87ea60d742901e1053eb2127ebd8b59a7d3b90597eb4e586599"}, - {file = "gevent-23.9.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:fde6402c5432b835fbb7698f1c7f2809c8d6b2bd9d047ac1f5a7c1d5aa569303"}, - {file = "gevent-23.9.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:dd6c32ab977ecf7c7b8c2611ed95fa4aaebd69b74bf08f4b4960ad516861517d"}, - {file = "gevent-23.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:455e5ee8103f722b503fa45dedb04f3ffdec978c1524647f8ba72b4f08490af1"}, - {file = "gevent-23.9.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:7ccf0fd378257cb77d91c116e15c99e533374a8153632c48a3ecae7f7f4f09fe"}, - {file = "gevent-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d163d59f1be5a4c4efcdd13c2177baaf24aadf721fdf2e1af9ee54a998d160f5"}, - {file = "gevent-23.9.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:7532c17bc6c1cbac265e751b95000961715adef35a25d2b0b1813aa7263fb397"}, - {file = "gevent-23.9.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:78eebaf5e73ff91d34df48f4e35581ab4c84e22dd5338ef32714264063c57507"}, - {file = "gevent-23.9.1-cp38-cp38-win32.whl", hash = "sha256:f632487c87866094546a74eefbca2c74c1d03638b715b6feb12e80120960185a"}, - {file = "gevent-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:62d121344f7465e3739989ad6b91f53a6ca9110518231553fe5846dbe1b4518f"}, - {file = "gevent-23.9.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:bf456bd6b992eb0e1e869e2fd0caf817f0253e55ca7977fd0e72d0336a8c1c6a"}, - {file = "gevent-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43daf68496c03a35287b8b617f9f91e0e7c0d042aebcc060cadc3f049aadd653"}, - {file = "gevent-23.9.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:7c28e38dcde327c217fdafb9d5d17d3e772f636f35df15ffae2d933a5587addd"}, - {file = "gevent-23.9.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fae8d5b5b8fa2a8f63b39f5447168b02db10c888a3e387ed7af2bd1b8612e543"}, - {file = "gevent-23.9.1-cp39-cp39-win32.whl", hash = "sha256:2c7b5c9912378e5f5ccf180d1fdb1e83f42b71823483066eddbe10ef1a2fcaa2"}, - {file = "gevent-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:a2898b7048771917d85a1d548fd378e8a7b2ca963db8e17c6d90c76b495e0e2b"}, - {file = "gevent-23.9.1.tar.gz", hash = "sha256:72c002235390d46f94938a96920d8856d4ffd9ddf62a303a0d7c118894097e34"}, + {file = "gevent-24.2.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:6f947a9abc1a129858391b3d9334c45041c08a0f23d14333d5b844b6e5c17a07"}, + {file = "gevent-24.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde283313daf0b34a8d1bab30325f5cb0f4e11b5869dbe5bc61f8fe09a8f66f3"}, + {file = "gevent-24.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a1df555431f5cd5cc189a6ee3544d24f8c52f2529134685f1e878c4972ab026"}, + {file = "gevent-24.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:14532a67f7cb29fb055a0e9b39f16b88ed22c66b96641df8c04bdc38c26b9ea5"}, + {file = "gevent-24.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd23df885318391856415e20acfd51a985cba6919f0be78ed89f5db9ff3a31cb"}, + {file = "gevent-24.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ca80b121bbec76d7794fcb45e65a7eca660a76cc1a104ed439cdbd7df5f0b060"}, + {file = "gevent-24.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b9913c45d1be52d7a5db0c63977eebb51f68a2d5e6fd922d1d9b5e5fd758cc98"}, + {file = "gevent-24.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:918cdf8751b24986f915d743225ad6b702f83e1106e08a63b736e3a4c6ead789"}, + {file = "gevent-24.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:3d5325ccfadfd3dcf72ff88a92fb8fc0b56cacc7225f0f4b6dcf186c1a6eeabc"}, + {file = "gevent-24.2.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:03aa5879acd6b7076f6a2a307410fb1e0d288b84b03cdfd8c74db8b4bc882fc5"}, + {file = "gevent-24.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8bb35ce57a63c9a6896c71a285818a3922d8ca05d150fd1fe49a7f57287b836"}, + {file = "gevent-24.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d7f87c2c02e03d99b95cfa6f7a776409083a9e4d468912e18c7680437b29222c"}, + {file = "gevent-24.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:968581d1717bbcf170758580f5f97a2925854943c45a19be4d47299507db2eb7"}, + {file = "gevent-24.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7899a38d0ae7e817e99adb217f586d0a4620e315e4de577444ebeeed2c5729be"}, + {file = "gevent-24.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:f5e8e8d60e18d5f7fd49983f0c4696deeddaf6e608fbab33397671e2fcc6cc91"}, + {file = "gevent-24.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:fbfdce91239fe306772faab57597186710d5699213f4df099d1612da7320d682"}, + {file = "gevent-24.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cdf66977a976d6a3cfb006afdf825d1482f84f7b81179db33941f2fc9673bb1d"}, + {file = "gevent-24.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:1dffb395e500613e0452b9503153f8f7ba587c67dd4a85fc7cd7aa7430cb02cc"}, + {file = "gevent-24.2.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:6c47ae7d1174617b3509f5d884935e788f325eb8f1a7efc95d295c68d83cce40"}, + {file = "gevent-24.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7cac622e11b4253ac4536a654fe221249065d9a69feb6cdcd4d9af3503602e0"}, + {file = "gevent-24.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf5b9c72b884c6f0c4ed26ef204ee1f768b9437330422492c319470954bc4cc7"}, + {file = "gevent-24.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f5de3c676e57177b38857f6e3cdfbe8f38d1cd754b63200c0615eaa31f514b4f"}, + {file = "gevent-24.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d4faf846ed132fd7ebfbbf4fde588a62d21faa0faa06e6f468b7faa6f436b661"}, + {file = "gevent-24.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:368a277bd9278ddb0fde308e6a43f544222d76ed0c4166e0d9f6b036586819d9"}, + {file = "gevent-24.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:f8a04cf0c5b7139bc6368b461257d4a757ea2fe89b3773e494d235b7dd51119f"}, + {file = "gevent-24.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:9d8d0642c63d453179058abc4143e30718b19a85cbf58c2744c9a63f06a1d388"}, + {file = "gevent-24.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:94138682e68ec197db42ad7442d3cf9b328069c3ad8e4e5022e6b5cd3e7ffae5"}, + {file = "gevent-24.2.1-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:8f4b8e777d39013595a7740b4463e61b1cfe5f462f1b609b28fbc1e4c4ff01e5"}, + {file = "gevent-24.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:141a2b24ad14f7b9576965c0c84927fc85f824a9bb19f6ec1e61e845d87c9cd8"}, + {file = "gevent-24.2.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:9202f22ef811053077d01f43cc02b4aaf4472792f9fd0f5081b0b05c926cca19"}, + {file = "gevent-24.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2955eea9c44c842c626feebf4459c42ce168685aa99594e049d03bedf53c2800"}, + {file = "gevent-24.2.1-cp38-cp38-win32.whl", hash = "sha256:44098038d5e2749b0784aabb27f1fcbb3f43edebedf64d0af0d26955611be8d6"}, + {file = "gevent-24.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:117e5837bc74a1673605fb53f8bfe22feb6e5afa411f524c835b2ddf768db0de"}, + {file = "gevent-24.2.1-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:2ae3a25ecce0a5b0cd0808ab716bfca180230112bb4bc89b46ae0061d62d4afe"}, + {file = "gevent-24.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ceb59986456ce851160867ce4929edaffbd2f069ae25717150199f8e1548b8"}, + {file = "gevent-24.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:2e9ac06f225b696cdedbb22f9e805e2dd87bf82e8fa5e17756f94e88a9d37cf7"}, + {file = "gevent-24.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:90cbac1ec05b305a1b90ede61ef73126afdeb5a804ae04480d6da12c56378df1"}, + {file = "gevent-24.2.1-cp39-cp39-win32.whl", hash = "sha256:782a771424fe74bc7e75c228a1da671578c2ba4ddb2ca09b8f959abdf787331e"}, + {file = "gevent-24.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:3adfb96637f44010be8abd1b5e73b5070f851b817a0b182e601202f20fa06533"}, + {file = "gevent-24.2.1-pp310-pypy310_pp73-macosx_11_0_universal2.whl", hash = "sha256:7b00f8c9065de3ad226f7979154a7b27f3b9151c8055c162332369262fc025d8"}, + {file = "gevent-24.2.1.tar.gz", hash = "sha256:432fc76f680acf7cf188c2ee0f5d3ab73b63c1f03114c7cd8a34cebbe5aa2056"}, ] [package.dependencies] cffi = {version = ">=1.12.2", markers = "platform_python_implementation == \"CPython\" and sys_platform == \"win32\""} -greenlet = [ - {version = ">=2.0.0", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.11\""}, - {version = ">=3.0rc3", markers = "platform_python_implementation == \"CPython\" and python_version >= \"3.11\""}, -] +greenlet = {version = ">=3.0rc3", markers = "platform_python_implementation == \"CPython\" and python_version >= \"3.11\""} "zope.event" = "*" "zope.interface" = "*" @@ -1091,7 +1099,7 @@ dnspython = ["dnspython (>=1.16.0,<2.0)", "idna"] docs = ["furo", "repoze.sphinx.autointerface", "sphinx", "sphinxcontrib-programoutput", "zope.schema"] monitor = ["psutil (>=5.7.0)"] recommended = ["cffi (>=1.12.2)", "dnspython (>=1.16.0,<2.0)", "idna", "psutil (>=5.7.0)"] -test = ["cffi (>=1.12.2)", "coverage (>=5.0)", "dnspython (>=1.16.0,<2.0)", "idna", "objgraph", "psutil (>=5.7.0)", "requests", "setuptools"] +test = ["cffi (>=1.12.2)", "coverage (>=5.0)", "dnspython (>=1.16.0,<2.0)", "idna", "objgraph", "psutil (>=5.7.0)", "requests"] [[package]] name = "greenlet" @@ -1166,18 +1174,22 @@ test = ["objgraph", "psutil"] [[package]] name = "gunicorn" -version = "19.9.0" +version = "21.2.0" description = "WSGI HTTP Server for UNIX" optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*" +python-versions = ">=3.5" files = [ - {file = "gunicorn-19.9.0-py2.py3-none-any.whl", hash = "sha256:aa8e0b40b4157b36a5df5e599f45c9c76d6af43845ba3b3b0efe2c70473c2471"}, - {file = "gunicorn-19.9.0.tar.gz", hash = "sha256:fa2662097c66f920f53f70621c6c58ca4a3c4d3434205e608e121b5b3b71f4f3"}, + {file = "gunicorn-21.2.0-py3-none-any.whl", hash = "sha256:3213aa5e8c24949e792bcacfc176fef362e7aac80b76c56f6b5122bf350722f0"}, + {file = "gunicorn-21.2.0.tar.gz", hash = "sha256:88ec8bff1d634f98e61b9f65bc4bf3cd918a90806c6f5c48bc5603849ec81033"}, ] +[package.dependencies] +packaging = "*" + [package.extras] -eventlet = ["eventlet (>=0.9.7)"] -gevent = ["gevent (>=0.13)"] +eventlet = ["eventlet (>=0.24.1)"] +gevent = ["gevent (>=1.4.0)"] +setproctitle = ["setproctitle"] tornado = ["tornado (>=0.2)"] [[package]] @@ -1193,13 +1205,13 @@ files = [ [[package]] name = "idna" -version = "2.7" +version = "3.6" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = "*" +python-versions = ">=3.5" files = [ - {file = "idna-2.7-py2.py3-none-any.whl", hash = "sha256:156a6814fb5ac1fc6850fb002e0852d56c0c8d2531923a51032d1b70760e186e"}, - {file = "idna-2.7.tar.gz", hash = "sha256:684a38a6f903c1d71d6d5fac066b58d7768af4de2b832e426ec79c30daa94a16"}, + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, ] [[package]] @@ -1227,36 +1239,26 @@ files = [ [package.extras] colors = ["colorama (>=0.4.6)"] -[[package]] -name = "jdcal" -version = "1.3" -description = "Julian dates from proleptic Gregorian and Julian calendars." -optional = false -python-versions = "*" -files = [ - {file = "jdcal-1.3.tar.gz", hash = "sha256:b760160f8dc8cc51d17875c6b663fafe64be699e10ce34b6a95184b5aa0fdc9e"}, -] - [[package]] name = "jmespath" -version = "0.9.3" +version = "1.0.1" description = "JSON Matching Expressions" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "jmespath-0.9.3-py2.py3-none-any.whl", hash = "sha256:f11b4461f425740a1d908e9a3f7365c3d2e569f6ca68a2ff8bc5bcd9676edd63"}, - {file = "jmespath-0.9.3.tar.gz", hash = "sha256:6a81d4c9aa62caf061cb517b4d9ad1dd300374cd4706997aff9cd6aedd61fc64"}, + {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, + {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, ] [[package]] name = "kombu" -version = "5.3.5" +version = "5.3.6" description = "Messaging library for Python." optional = false python-versions = ">=3.8" files = [ - {file = "kombu-5.3.5-py3-none-any.whl", hash = "sha256:0eac1bbb464afe6fb0924b21bf79460416d25d8abc52546d4f16cad94f789488"}, - {file = "kombu-5.3.5.tar.gz", hash = "sha256:30e470f1a6b49c70dc6f6d13c3e4cc4e178aa6c469ceb6bcd55645385fc84b93"}, + {file = "kombu-5.3.6-py3-none-any.whl", hash = "sha256:49f1e62b12369045de2662f62cc584e7df83481a513db83b01f87b5b9785e378"}, + {file = "kombu-5.3.6.tar.gz", hash = "sha256:f3da5b570a147a5da8280180aa80b03807283d63ea5081fcdb510d18242431d9"}, ] [package.dependencies] @@ -1273,7 +1275,7 @@ mongodb = ["pymongo (>=4.1.1)"] msgpack = ["msgpack"] pyro = ["pyro4"] qpid = ["qpid-python (>=0.26)", "qpid-tools (>=0.26)"] -redis = ["redis (>=4.5.2,!=4.5.5,<6.0.0)"] +redis = ["redis (>=4.5.2,!=4.5.5,!=5.0.2)"] slmq = ["softlayer-messaging (>=1.0.3)"] sqlalchemy = ["sqlalchemy (>=1.4.48,<2.1)"] sqs = ["boto3 (>=1.26.143)", "pycurl (>=7.43.0.5)", "urllib3 (>=1.26.16)"] @@ -1282,16 +1284,17 @@ zookeeper = ["kazoo (>=2.8.0)"] [[package]] name = "kubi-ecs-logger" -version = "0.0.6" +version = "0.1.2" description = "Logger based on Elasticsearch Common Schema." optional = false python-versions = ">=3.6, <4" files = [ - {file = "kubi_ecs_logger-0.0.6.tar.gz", hash = "sha256:65ffd11860e06c0c68e17a508f37d76b28780dc8b4811ffc4316aae75375f673"}, + {file = "kubi_ecs_logger-0.1.2-py3-none-any.whl", hash = "sha256:f35bd3ae9ac4c23977ac5307779c8e98cd7cef0025c11f7368e443d482dc30f6"}, + {file = "kubi_ecs_logger-0.1.2.tar.gz", hash = "sha256:48e9a9a4b1e77b73631efd70d253386f34ca742da1b268b8e72624d903fff99b"}, ] [package.dependencies] -marshmallow = "2.19.2" +marshmallow = "3.19.0" [[package]] name = "markuppy" @@ -1305,31 +1308,23 @@ files = [ [[package]] name = "marshmallow" -version = "2.19.2" +version = "3.19.0" description = "A lightweight library for converting complex datatypes to and from native Python datatypes." optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "marshmallow-2.19.2-py2.py3-none-any.whl", hash = "sha256:0e497a6447ffaad55578138ca512752de7a48d12f444996ededc3d6bf8a09ca2"}, - {file = "marshmallow-2.19.2.tar.gz", hash = "sha256:e21a4dea20deb167c723e0ffb13f4cf33bcbbeb8a334e92406a3308cedea2826"}, + {file = "marshmallow-3.19.0-py3-none-any.whl", hash = "sha256:93f0958568da045b0021ec6aeb7ac37c81bfcccbb9a0e7ed8559885070b3a19b"}, + {file = "marshmallow-3.19.0.tar.gz", hash = "sha256:90032c0fd650ce94b6ec6dc8dfeb0e3ff50c144586462c389b81a07205bedb78"}, ] -[package.extras] -dev = ["flake8 (==3.7.4)", "pytest", "python-dateutil", "pytz", "simplejson", "tox"] -lint = ["flake8 (==3.7.4)"] -reco = ["python-dateutil", "simplejson"] -tests = ["pytest", "pytz"] +[package.dependencies] +packaging = ">=17.0" -[[package]] -name = "mccabe" -version = "0.6.1" -description = "McCabe checker, plugin for flake8" -optional = false -python-versions = "*" -files = [ - {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, - {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, -] +[package.extras] +dev = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)", "pytest", "pytz", "simplejson", "tox"] +docs = ["alabaster (==0.7.12)", "autodocsumm (==0.2.9)", "sphinx (==5.3.0)", "sphinx-issues (==3.0.1)", "sphinx-version-warning (==1.1.2)"] +lint = ["flake8 (==5.0.4)", "flake8-bugbear (==22.10.25)", "mypy (==0.990)", "pre-commit (>=2.4,<3.0)"] +tests = ["pytest", "pytz", "simplejson"] [[package]] name = "mohawk" @@ -1358,45 +1353,46 @@ files = [ [[package]] name = "oauthlib" -version = "2.1.0" +version = "3.2.2" description = "A generic, spec-compliant, thorough implementation of the OAuth request-signing logic" optional = false -python-versions = "*" +python-versions = ">=3.6" files = [ - {file = "oauthlib-2.1.0-py2.py3-none-any.whl", hash = "sha256:d883b36b21a6ad813953803edfa563b1b579d79ca758fe950d1bc9e8b326025b"}, - {file = "oauthlib-2.1.0.tar.gz", hash = "sha256:ac35665a61c1685c56336bda97d5eefa246f1202618a1d6f34fccb1bdd404162"}, + {file = "oauthlib-3.2.2-py3-none-any.whl", hash = "sha256:8139f29aac13e25d502680e9e19963e83f16838d48a0d71c287fe40e7067fbca"}, + {file = "oauthlib-3.2.2.tar.gz", hash = "sha256:9859c40929662bec5d64f34d01c99e093149682a3f38915dc0655d5a633dd918"}, ] [package.extras] -rsa = ["cryptography"] -signals = ["blinker"] -signedtoken = ["cryptography", "pyjwt (>=1.0.0)"] -test = ["blinker", "cryptography", "mock", "nose", "pyjwt (>=1.0.0)", "unittest2"] +rsa = ["cryptography (>=3.0.0)"] +signals = ["blinker (>=1.4.0)"] +signedtoken = ["cryptography (>=3.0.0)", "pyjwt (>=2.0.0,<3)"] [[package]] name = "odfpy" -version = "1.3.6" +version = "1.4.1" description = "Python API and tools to manipulate OpenDocument files" optional = false python-versions = "*" files = [ - {file = "odfpy-1.3.6.tar.gz", hash = "sha256:6bcaf3b23aa9e49ed8c8c177266539b211add4e02402748a994451482a10cb1b"}, + {file = "odfpy-1.4.1.tar.gz", hash = "sha256:db766a6e59c5103212f3cc92ec8dd50a0f3a02790233ed0b52148b70d3c438ec"}, ] +[package.dependencies] +defusedxml = "*" + [[package]] name = "openpyxl" -version = "3.0.5" +version = "3.1.2" description = "A Python library to read/write Excel 2010 xlsx/xlsm files" optional = false -python-versions = ">=3.6," +python-versions = ">=3.6" files = [ - {file = "openpyxl-3.0.5-py2.py3-none-any.whl", hash = "sha256:f7d666b569f729257082cf7ddc56262431878f602dcc2bc3980775c59439cdab"}, - {file = "openpyxl-3.0.5.tar.gz", hash = "sha256:18e11f9a650128a12580a58e3daba14e00a11d9e907c554a17ea016bf1a2c71b"}, + {file = "openpyxl-3.1.2-py2.py3-none-any.whl", hash = "sha256:f91456ead12ab3c6c2e9491cf33ba6d08357d802192379bb482f1033ade496f5"}, + {file = "openpyxl-3.1.2.tar.gz", hash = "sha256:a6f5977418eff3b2d5500d54d9db50c8277a368436f4e4f8ddb1be3422870184"}, ] [package.dependencies] et-xmlfile = "*" -jdcal = "*" [[package]] name = "outcome" @@ -1482,32 +1478,31 @@ test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest- [[package]] name = "pluggy" -version = "0.13.1" +version = "1.4.0" description = "plugin and hook calling mechanisms for python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.8" files = [ - {file = "pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d"}, - {file = "pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0"}, + {file = "pluggy-1.4.0-py3-none-any.whl", hash = "sha256:7db9f7b503d67d1c5b95f59773ebb58a8c1c288129a88665838012cfb07b8981"}, + {file = "pluggy-1.4.0.tar.gz", hash = "sha256:8c85c2876142a764e5b7548e7d9a0e0ddb46f5185161049a79b7e974454223be"}, ] [package.extras] dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "prompt-toolkit" -version = "1.0.15" +version = "3.0.43" description = "Library for building powerful interactive command lines in Python" optional = false -python-versions = "*" +python-versions = ">=3.7.0" files = [ - {file = "prompt_toolkit-1.0.15-py2-none-any.whl", hash = "sha256:3f473ae040ddaa52b52f97f6b4a493cfa9f5920c255a12dc56a7d34397a398a4"}, - {file = "prompt_toolkit-1.0.15-py3-none-any.whl", hash = "sha256:1df952620eccb399c53ebb359cc7d9a8d3a9538cb34c5a1344bdbeb29fbcc381"}, - {file = "prompt_toolkit-1.0.15.tar.gz", hash = "sha256:858588f1983ca497f1cf4ffde01d978a3ea02b01c8a26a8bbc5cd2e66d816917"}, + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, ] [package.dependencies] -six = ">=1.9.0" wcwidth = "*" [[package]] @@ -1522,37 +1517,24 @@ files = [ [[package]] name = "psycopg2" -version = "2.8.6" +version = "2.9.9" description = "psycopg2 - Python-PostgreSQL Database Adapter" optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" -files = [ - {file = "psycopg2-2.8.6-cp27-cp27m-win32.whl", hash = "sha256:068115e13c70dc5982dfc00c5d70437fe37c014c808acce119b5448361c03725"}, - {file = "psycopg2-2.8.6-cp27-cp27m-win_amd64.whl", hash = "sha256:d160744652e81c80627a909a0e808f3c6653a40af435744de037e3172cf277f5"}, - {file = "psycopg2-2.8.6-cp34-cp34m-win32.whl", hash = "sha256:b8cae8b2f022efa1f011cc753adb9cbadfa5a184431d09b273fb49b4167561ad"}, - {file = "psycopg2-2.8.6-cp34-cp34m-win_amd64.whl", hash = "sha256:f22ea9b67aea4f4a1718300908a2fb62b3e4276cf00bd829a97ab5894af42ea3"}, - {file = "psycopg2-2.8.6-cp35-cp35m-win32.whl", hash = "sha256:26e7fd115a6db75267b325de0fba089b911a4a12ebd3d0b5e7acb7028bc46821"}, - {file = "psycopg2-2.8.6-cp35-cp35m-win_amd64.whl", hash = "sha256:00195b5f6832dbf2876b8bf77f12bdce648224c89c880719c745b90515233301"}, - {file = "psycopg2-2.8.6-cp36-cp36m-win32.whl", hash = "sha256:a49833abfdede8985ba3f3ec641f771cca215479f41523e99dace96d5b8cce2a"}, - {file = "psycopg2-2.8.6-cp36-cp36m-win_amd64.whl", hash = "sha256:f974c96fca34ae9e4f49839ba6b78addf0346777b46c4da27a7bf54f48d3057d"}, - {file = "psycopg2-2.8.6-cp37-cp37m-win32.whl", hash = "sha256:6a3d9efb6f36f1fe6aa8dbb5af55e067db802502c55a9defa47c5a1dad41df84"}, - {file = "psycopg2-2.8.6-cp37-cp37m-win_amd64.whl", hash = "sha256:56fee7f818d032f802b8eed81ef0c1232b8b42390df189cab9cfa87573fe52c5"}, - {file = "psycopg2-2.8.6-cp38-cp38-win32.whl", hash = "sha256:ad2fe8a37be669082e61fb001c185ffb58867fdbb3e7a6b0b0d2ffe232353a3e"}, - {file = "psycopg2-2.8.6-cp38-cp38-win_amd64.whl", hash = "sha256:56007a226b8e95aa980ada7abdea6b40b75ce62a433bd27cec7a8178d57f4051"}, - {file = "psycopg2-2.8.6-cp39-cp39-win32.whl", hash = "sha256:2c93d4d16933fea5bbacbe1aaf8fa8c1348740b2e50b3735d1b0bf8154cbf0f3"}, - {file = "psycopg2-2.8.6-cp39-cp39-win_amd64.whl", hash = "sha256:d5062ae50b222da28253059880a871dc87e099c25cb68acf613d9d227413d6f7"}, - {file = "psycopg2-2.8.6.tar.gz", hash = "sha256:fb23f6c71107c37fd667cb4ea363ddeb936b348bbd6449278eb92c189699f543"}, -] - -[[package]] -name = "pycodestyle" -version = "2.6.0" -description = "Python style guide checker" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.7" files = [ - {file = "pycodestyle-2.6.0-py2.py3-none-any.whl", hash = "sha256:2295e7b2f6b5bd100585ebcb1f616591b652db8a741695b3d8f5d28bdc934367"}, - {file = "pycodestyle-2.6.0.tar.gz", hash = "sha256:c58a7d2815e0e8d7972bf1803331fb0152f867bd89adf8a01dfd55085434192e"}, + {file = "psycopg2-2.9.9-cp310-cp310-win32.whl", hash = "sha256:38a8dcc6856f569068b47de286b472b7c473ac7977243593a288ebce0dc89516"}, + {file = "psycopg2-2.9.9-cp310-cp310-win_amd64.whl", hash = "sha256:426f9f29bde126913a20a96ff8ce7d73fd8a216cfb323b1f04da402d452853c3"}, + {file = "psycopg2-2.9.9-cp311-cp311-win32.whl", hash = "sha256:ade01303ccf7ae12c356a5e10911c9e1c51136003a9a1d92f7aa9d010fb98372"}, + {file = "psycopg2-2.9.9-cp311-cp311-win_amd64.whl", hash = "sha256:121081ea2e76729acfb0673ff33755e8703d45e926e416cb59bae3a86c6a4981"}, + {file = "psycopg2-2.9.9-cp312-cp312-win32.whl", hash = "sha256:d735786acc7dd25815e89cc4ad529a43af779db2e25aa7c626de864127e5a024"}, + {file = "psycopg2-2.9.9-cp312-cp312-win_amd64.whl", hash = "sha256:a7653d00b732afb6fc597e29c50ad28087dcb4fbfb28e86092277a559ae4e693"}, + {file = "psycopg2-2.9.9-cp37-cp37m-win32.whl", hash = "sha256:5e0d98cade4f0e0304d7d6f25bbfbc5bd186e07b38eac65379309c4ca3193efa"}, + {file = "psycopg2-2.9.9-cp37-cp37m-win_amd64.whl", hash = "sha256:7e2dacf8b009a1c1e843b5213a87f7c544b2b042476ed7755be813eaf4e8347a"}, + {file = "psycopg2-2.9.9-cp38-cp38-win32.whl", hash = "sha256:ff432630e510709564c01dafdbe996cb552e0b9f3f065eb89bdce5bd31fabf4c"}, + {file = "psycopg2-2.9.9-cp38-cp38-win_amd64.whl", hash = "sha256:bac58c024c9922c23550af2a581998624d6e02350f4ae9c5f0bc642c633a2d5e"}, + {file = "psycopg2-2.9.9-cp39-cp39-win32.whl", hash = "sha256:c92811b2d4c9b6ea0285942b2e7cac98a59e166d59c588fe5cfe1eda58e72d59"}, + {file = "psycopg2-2.9.9-cp39-cp39-win_amd64.whl", hash = "sha256:de80739447af31525feddeb8effd640782cf5998e1a4e9192ebdf829717e3913"}, + {file = "psycopg2-2.9.9.tar.gz", hash = "sha256:d1454bde93fb1e224166811694d600e746430c006fbb031ea06ecc2ea41bf156"}, ] [[package]] @@ -1566,17 +1548,6 @@ files = [ {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] -[[package]] -name = "pyflakes" -version = "2.2.0" -description = "passive checker of Python programs" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pyflakes-2.2.0-py2.py3-none-any.whl", hash = "sha256:0d94e0e05a19e57a99444b6ddcf9a6eb2e5c68d3ca1e98e90707af8152c90a92"}, - {file = "pyflakes-2.2.0.tar.gz", hash = "sha256:35b2d75ee967ea93b55750aa9edbbf72813e06a66ba54438df2cfac9e3c27fc8"}, -] - [[package]] name = "pyperclip" version = "1.8.2" @@ -1612,11 +1583,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"] @@ -1766,17 +1735,18 @@ files = [ [[package]] name = "redis" -version = "3.5.3" -description = "Python client for Redis key-value store" +version = "5.0.3" +description = "Python client for Redis database and key-value store" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "redis-3.5.3-py2.py3-none-any.whl", hash = "sha256:432b788c4530cfe16d8d943a09d40ca6c16149727e4afe8c2c9d5580c59d9f24"}, - {file = "redis-3.5.3.tar.gz", hash = "sha256:0e7e0cfca8660dea8b7d5cd8c4f6c5e29e11f31158c0b0ae91a397f00e5a05a2"}, + {file = "redis-5.0.3-py3-none-any.whl", hash = "sha256:5da9b8fe9e1254293756c16c008e8620b3d15fcc6dde6babde9541850e72a32d"}, + {file = "redis-5.0.3.tar.gz", hash = "sha256:4973bae7444c0fbed64a06b87446f79361cb7e4ec1538c022d696ed7a5015580"}, ] [package.extras] -hiredis = ["hiredis (>=0.1.3)"] +hiredis = ["hiredis (>=1.0.0)"] +ocsp = ["cryptography (>=36.0.1)", "pyopenssl (==20.0.1)", "requests (>=2.26.0)"] [[package]] name = "requests" @@ -1801,48 +1771,74 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] [[package]] name = "requests-oauthlib" -version = "1.0.0" +version = "2.0.0" description = "OAuthlib authentication support for Requests." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +python-versions = ">=3.4" files = [ - {file = "requests-oauthlib-1.0.0.tar.gz", hash = "sha256:8886bfec5ad7afb391ed5443b1f697c6f4ae98d0e5620839d8b4499c032ada3f"}, - {file = "requests_oauthlib-1.0.0-py2.py3-none-any.whl", hash = "sha256:e21232e2465808c0e892e0e4dbb8c2faafec16ac6dc067dd546e9b466f3deac8"}, + {file = "requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9"}, + {file = "requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36"}, ] [package.dependencies] -oauthlib = ">=0.6.2" +oauthlib = ">=3.0.0" requests = ">=2.0.0" [package.extras] -rsa = ["oauthlib[rsa] (>=0.6.2)", "requests (>=2.0.0)"] +rsa = ["oauthlib[signedtoken] (>=3.0.0)"] + +[[package]] +name = "ruff" +version = "0.3.4" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:60c870a7d46efcbc8385d27ec07fe534ac32f3b251e4fc44b3cbfd9e09609ef4"}, + {file = "ruff-0.3.4-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:6fc14fa742e1d8f24910e1fff0bd5e26d395b0e0e04cc1b15c7c5e5fe5b4af91"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3ee7880f653cc03749a3bfea720cf2a192e4f884925b0cf7eecce82f0ce5854"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf133dd744f2470b347f602452a88e70dadfbe0fcfb5fd46e093d55da65f82f7"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3f3860057590e810c7ffea75669bdc6927bfd91e29b4baa9258fd48b540a4365"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:986f2377f7cf12efac1f515fc1a5b753c000ed1e0a6de96747cdf2da20a1b369"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fd98e85869603e65f554fdc5cddf0712e352fe6e61d29d5a6fe087ec82b76c"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:64abeed785dad51801b423fa51840b1764b35d6c461ea8caef9cf9e5e5ab34d9"}, + {file = "ruff-0.3.4-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df52972138318bc7546d92348a1ee58449bc3f9eaf0db278906eb511889c4b50"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:98e98300056445ba2cc27d0b325fd044dc17fcc38e4e4d2c7711585bd0a958ed"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:519cf6a0ebed244dce1dc8aecd3dc99add7a2ee15bb68cf19588bb5bf58e0488"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_i686.whl", hash = "sha256:bb0acfb921030d00070539c038cd24bb1df73a2981e9f55942514af8b17be94e"}, + {file = "ruff-0.3.4-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:cf187a7e7098233d0d0c71175375c5162f880126c4c716fa28a8ac418dcf3378"}, + {file = "ruff-0.3.4-py3-none-win32.whl", hash = "sha256:af27ac187c0a331e8ef91d84bf1c3c6a5dea97e912a7560ac0cef25c526a4102"}, + {file = "ruff-0.3.4-py3-none-win_amd64.whl", hash = "sha256:de0d5069b165e5a32b3c6ffbb81c350b1e3d3483347196ffdf86dc0ef9e37dd6"}, + {file = "ruff-0.3.4-py3-none-win_arm64.whl", hash = "sha256:6810563cc08ad0096b57c717bd78aeac888a1bfd38654d9113cb3dc4d3f74232"}, + {file = "ruff-0.3.4.tar.gz", hash = "sha256:f0f4484c6541a99862b693e13a151435a279b271cff20e37101116a21e2a1ad1"}, +] [[package]] name = "s3transfer" -version = "0.4.2" +version = "0.10.1" description = "An Amazon S3 Transfer Manager" optional = false -python-versions = "*" +python-versions = ">= 3.8" files = [ - {file = "s3transfer-0.4.2-py2.py3-none-any.whl", hash = "sha256:9b3752887a2880690ce628bc263d6d13a3864083aeacff4890c1c9839a5eb0bc"}, - {file = "s3transfer-0.4.2.tar.gz", hash = "sha256:cb022f4b16551edebbb31a377d3f09600dbada7363d8c5db7976e7f47732e1b2"}, + {file = "s3transfer-0.10.1-py3-none-any.whl", hash = "sha256:ceb252b11bcf87080fb7850a224fb6e05c8a776bab8f2b64b7f25b969464839d"}, + {file = "s3transfer-0.10.1.tar.gz", hash = "sha256:5683916b4c724f799e600f41dd9e10a9ff19871bf87623cc8f491cb4f5fa0a19"}, ] [package.dependencies] -botocore = ">=1.12.36,<2.0a.0" +botocore = ">=1.33.2,<2.0a.0" [package.extras] -crt = ["botocore[crt] (>=1.20.29,<2.0a.0)"] +crt = ["botocore[crt] (>=1.33.2,<2.0a.0)"] [[package]] name = "selenium" -version = "4.18.1" +version = "4.19.0" description = "" optional = false python-versions = ">=3.8" files = [ - {file = "selenium-4.18.1-py3-none-any.whl", hash = "sha256:b24a3cdd2d47c29832e81345bfcde0c12bb608738013e53c781b211b418df241"}, - {file = "selenium-4.18.1.tar.gz", hash = "sha256:a11f67afa8bfac6b77e148c987b33f6b14eb1cae4d352722a75de1f26e3f0ae2"}, + {file = "selenium-4.19.0-py3-none-any.whl", hash = "sha256:5b4f49240d61e687a73f7968ae2517d403882aae3550eae2a229c745e619f1d9"}, + {file = "selenium-4.19.0.tar.gz", hash = "sha256:d9dfd6d0b021d71d0a48b865fe7746490ba82b81e9c87b212360006629eb1853"}, ] [package.dependencies] @@ -1854,13 +1850,13 @@ urllib3 = {version = ">=1.26,<3", extras = ["socks"]} [[package]] name = "sentry-sdk" -version = "1.25.1" +version = "1.43.0" description = "Python client for Sentry (https://sentry.io)" optional = false python-versions = "*" files = [ - {file = "sentry-sdk-1.25.1.tar.gz", hash = "sha256:aa796423eb6a2f4a8cd7a5b02ba6558cb10aab4ccdc0537f63a47b038c520c38"}, - {file = "sentry_sdk-1.25.1-py2.py3-none-any.whl", hash = "sha256:79afb7c896014038e358401ad1d36889f97a129dfa8031c49b3f238cd1aa3935"}, + {file = "sentry-sdk-1.43.0.tar.gz", hash = "sha256:41df73af89d22921d8733714fb0fc5586c3461907e06688e6537d01a27e0e0f6"}, + {file = "sentry_sdk-1.43.0-py2.py3-none-any.whl", hash = "sha256:8d768724839ca18d7b4c7463ef7528c40b7aa2bfbf7fe554d5f9a7c044acfd36"}, ] [package.dependencies] @@ -1870,10 +1866,13 @@ urllib3 = {version = ">=1.26.11", markers = "python_version >= \"3.6\""} [package.extras] aiohttp = ["aiohttp (>=3.5)"] arq = ["arq (>=0.23)"] +asyncpg = ["asyncpg (>=0.23)"] beam = ["apache-beam (>=2.12)"] bottle = ["bottle (>=0.12.13)"] celery = ["celery (>=3)"] +celery-redbeat = ["celery-redbeat (>=2)"] chalice = ["chalice (>=1.16.0)"] +clickhouse-driver = ["clickhouse-driver (>=0.2.0)"] django = ["django (>=1.8)"] falcon = ["falcon (>=1.4)"] fastapi = ["fastapi (>=0.79.0)"] @@ -1882,7 +1881,9 @@ grpcio = ["grpcio (>=1.21.1)"] httpx = ["httpx (>=0.16.0)"] huey = ["huey (>=2)"] loguru = ["loguru (>=0.5)"] +openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"] opentelemetry = ["opentelemetry-distro (>=0.35b0)"] +opentelemetry-experimental = ["opentelemetry-distro (>=0.40b0,<1.0)", "opentelemetry-instrumentation-aiohttp-client (>=0.40b0,<1.0)", "opentelemetry-instrumentation-django (>=0.40b0,<1.0)", "opentelemetry-instrumentation-fastapi (>=0.40b0,<1.0)", "opentelemetry-instrumentation-flask (>=0.40b0,<1.0)", "opentelemetry-instrumentation-requests (>=0.40b0,<1.0)", "opentelemetry-instrumentation-sqlite3 (>=0.40b0,<1.0)", "opentelemetry-instrumentation-urllib (>=0.40b0,<1.0)"] pure-eval = ["asttokens", "executing", "pure-eval"] pymongo = ["pymongo (>=3.1)"] pyspark = ["pyspark (>=2.4.4)"] @@ -1912,13 +1913,13 @@ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jar [[package]] name = "six" -version = "1.15.0" +version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ - {file = "six-1.15.0-py2.py3-none-any.whl", hash = "sha256:8b74bedcbbbaca38ff6d7491d76f2b06b3592611af620f8426e82dddb04a5ced"}, - {file = "six-1.15.0.tar.gz", hash = "sha256:30639c035cdb23534cd4aa2dd52c3bf48f06e5f4a941509c8bafd8ce11080259"}, + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] [[package]] @@ -1945,13 +1946,13 @@ files = [ [[package]] name = "soupsieve" -version = "1.9.6" +version = "2.5" description = "A modern CSS selector implementation for Beautiful Soup." optional = false -python-versions = "*" +python-versions = ">=3.8" files = [ - {file = "soupsieve-1.9.6-py2.py3-none-any.whl", hash = "sha256:feb1e937fa26a69e08436aad4a9037cd7e1d4c7212909502ba30701247ff8abd"}, - {file = "soupsieve-1.9.6.tar.gz", hash = "sha256:7985bacc98c34923a439967c1a602dc4f1e15f923b6fcf02344184f86cc7efaa"}, + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, ] [[package]] @@ -1972,13 +1973,13 @@ test = ["pytest", "pytest-cov"] [[package]] name = "tablib" -version = "2.0.0" -description = "Format agnostic tabular data library (XLS, JSON, YAML, CSV)" +version = "3.5.0" +description = "Format agnostic tabular data library (XLS, JSON, YAML, CSV, etc.)" optional = false -python-versions = ">=3.5" +python-versions = ">=3.8" files = [ - {file = "tablib-2.0.0-py3-none-any.whl", hash = "sha256:c5a77c96ad306d5b380def1309d521ad5e98b4f83726f84857ad87e142d13279"}, - {file = "tablib-2.0.0.tar.gz", hash = "sha256:8cc2fa10bc37219ac5e76850eb7fbd50de313c7a1a7895c44af2a8dd206b7be7"}, + {file = "tablib-3.5.0-py3-none-any.whl", hash = "sha256:9821caa9eca6062ff7299fa645e737aecff982e6b2b42046928a6413c8dabfd9"}, + {file = "tablib-3.5.0.tar.gz", hash = "sha256:f6661dfc45e1d4f51fa8a6239f9c8349380859a5bfaa73280645f046d6c96e33"}, ] [package.dependencies] @@ -1999,28 +2000,6 @@ xls = ["xlrd", "xlwt"] xlsx = ["openpyxl (>=2.6.0)"] yaml = ["pyyaml"] -[[package]] -name = "text-unidecode" -version = "1.3" -description = "The most basic Text::Unidecode port" -optional = false -python-versions = "*" -files = [ - {file = "text-unidecode-1.3.tar.gz", hash = "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93"}, - {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" -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 = "trio" version = "0.25.0" @@ -2035,7 +2014,6 @@ files = [ [package.dependencies] attrs = ">=23.2.0" cffi = {version = ">=1.14", markers = "os_name == \"nt\" and implementation_name != \"pypy\""} -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} idna = "*" outcome = "*" sniffio = ">=1.3.0" @@ -2053,7 +2031,6 @@ files = [ ] [package.dependencies] -exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} trio = ">=0.11" wsproto = ">=0.14" @@ -2081,22 +2058,23 @@ files = [ [[package]] name = "urllib3" -version = "1.26.18" +version = "2.2.1" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = ">=3.8" files = [ - {file = "urllib3-1.26.18-py2.py3-none-any.whl", hash = "sha256:34b97092d7e0a3a8cf7cd10e386f401b3737364026c45e622aa02903dffe0f07"}, - {file = "urllib3-1.26.18.tar.gz", hash = "sha256:f8ecc1bba5667413457c529ab955bf8c67b45db799d159066261719e328580a0"}, + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, ] [package.dependencies] -PySocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} +pysocks = {version = ">=1.5.6,<1.5.7 || >1.5.7,<2.0", optional = true, markers = "extra == \"socks\""} [package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] [[package]] name = "vine" @@ -2111,13 +2089,13 @@ files = [ [[package]] name = "wcwidth" -version = "0.1.7" -description = "Measures number of Terminal column cells of wide-character codes" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" optional = false python-versions = "*" files = [ - {file = "wcwidth-0.1.7-py2.py3-none-any.whl", hash = "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c"}, - {file = "wcwidth-0.1.7.tar.gz", hash = "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e"}, + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, ] [[package]] @@ -2134,6 +2112,89 @@ files = [ [package.extras] brotli = ["Brotli"] +[[package]] +name = "wrapt" +version = "1.14.1" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, + {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, + {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, + {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, + {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, + {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, + {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, + {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, + {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, + {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, + {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, + {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, + {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, + {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, + {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, + {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, + {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, + {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, + {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, + {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, + {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, + {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, + {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, + {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, + {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, + {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, + {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, + {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, + {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, + {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, + {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, + {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, + {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, + {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, +] + [[package]] name = "wsproto" version = "1.2.0" @@ -2150,15 +2211,20 @@ h11 = ">=0.9.0,<1" [[package]] name = "xlrd" -version = "1.1.0" -description = "Library for developers to extract data from Microsoft Excel (tm) spreadsheet files" +version = "2.0.1" +description = "Library for developers to extract data from Microsoft Excel (tm) .xls spreadsheet files" optional = false -python-versions = "*" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ - {file = "xlrd-1.1.0-py2.py3-none-any.whl", hash = "sha256:83a1d2f1091078fb3f65876753b5302c5cfb6a41de64b9587b74cefa75157148"}, - {file = "xlrd-1.1.0.tar.gz", hash = "sha256:8a21885513e6d915fe33a8ee5fdfa675433b61405ba13e2a69e62ee36828d7e2"}, + {file = "xlrd-2.0.1-py2.py3-none-any.whl", hash = "sha256:6a33ee89877bd9abc1158129f6e94be74e2679636b8a205b43b85206c3f0bbdd"}, + {file = "xlrd-2.0.1.tar.gz", hash = "sha256:f72f148f54442c6b056bf931dbc34f986fd0c3b0b6b5a58d013c9aef274d0c88"}, ] +[package.extras] +build = ["twine", "wheel"] +docs = ["sphinx"] +test = ["pytest", "pytest-cov"] + [[package]] name = "xlwt" version = "1.3.0" @@ -2172,13 +2238,13 @@ files = [ [[package]] name = "zope-event" -version = "4.4" +version = "5.0" description = "Very basic event publishing system" optional = false -python-versions = "*" +python-versions = ">=3.7" files = [ - {file = "zope.event-4.4-py2.py3-none-any.whl", hash = "sha256:d8e97d165fd5a0997b45f5303ae11ea3338becfe68c401dd88ffd2113fe5cae7"}, - {file = "zope.event-4.4.tar.gz", hash = "sha256:69c27debad9bdacd9ce9b735dad382142281ac770c4a432b533d6d65c4614bcf"}, + {file = "zope.event-5.0-py3-none-any.whl", hash = "sha256:2832e95014f4db26c47a13fdaef84cef2f4df37e66b59d8f1f4a8f319a632c26"}, + {file = "zope.event-5.0.tar.gz", hash = "sha256:bac440d8d9891b4068e2b5a2c5e2c9765a9df762944bda6955f96bb9b91e67cd"}, ] [package.dependencies] @@ -2190,62 +2256,58 @@ test = ["zope.testrunner"] [[package]] name = "zope-interface" -version = "5.1.0" +version = "6.2" description = "Interfaces for Python" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = ">=3.7" files = [ - {file = "zope.interface-5.1.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:645a7092b77fdbc3f68d3cc98f9d3e71510e419f54019d6e282328c0dd140dcd"}, - {file = "zope.interface-5.1.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:d1fe9d7d09bb07228650903d6a9dc48ea649e3b8c69b1d263419cc722b3938e8"}, - {file = "zope.interface-5.1.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:a744132d0abaa854d1aad50ba9bc64e79c6f835b3e92521db4235a1991176813"}, - {file = "zope.interface-5.1.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:461d4339b3b8f3335d7e2c90ce335eb275488c587b61aca4b305196dde2ff086"}, - {file = "zope.interface-5.1.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:269b27f60bcf45438e8683269f8ecd1235fa13e5411de93dae3b9ee4fe7f7bc7"}, - {file = "zope.interface-5.1.0-cp27-cp27m-win32.whl", hash = "sha256:6874367586c020705a44eecdad5d6b587c64b892e34305bb6ed87c9bbe22a5e9"}, - {file = "zope.interface-5.1.0-cp27-cp27m-win_amd64.whl", hash = "sha256:8149ded7f90154fdc1a40e0c8975df58041a6f693b8f7edcd9348484e9dc17fe"}, - {file = "zope.interface-5.1.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:0103cba5ed09f27d2e3de7e48bb320338592e2fabc5ce1432cf33808eb2dfd8b"}, - {file = "zope.interface-5.1.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:b0becb75418f8a130e9d465e718316cd17c7a8acce6fe8fe07adc72762bee425"}, - {file = "zope.interface-5.1.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:fb55c182a3f7b84c1a2d6de5fa7b1a05d4660d866b91dbf8d74549c57a1499e8"}, - {file = "zope.interface-5.1.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:4f98f70328bc788c86a6a1a8a14b0ea979f81ae6015dd6c72978f1feff70ecda"}, - {file = "zope.interface-5.1.0-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:af2c14efc0bb0e91af63d00080ccc067866fb8cbbaca2b0438ab4105f5e0f08d"}, - {file = "zope.interface-5.1.0-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:f68bf937f113b88c866d090fea0bc52a098695173fc613b055a17ff0cf9683b6"}, - {file = "zope.interface-5.1.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:d7804f6a71fc2dda888ef2de266727ec2f3915373d5a785ed4ddc603bbc91e08"}, - {file = "zope.interface-5.1.0-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:74bf0a4f9091131de09286f9a605db449840e313753949fe07c8d0fe7659ad1e"}, - {file = "zope.interface-5.1.0-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:ba4261c8ad00b49d48bbb3b5af388bb7576edfc0ca50a49c11dcb77caa1d897e"}, - {file = "zope.interface-5.1.0-cp35-cp35m-win32.whl", hash = "sha256:ebb4e637a1fb861c34e48a00d03cffa9234f42bef923aec44e5625ffb9a8e8f9"}, - {file = "zope.interface-5.1.0-cp35-cp35m-win_amd64.whl", hash = "sha256:911714b08b63d155f9c948da2b5534b223a1a4fc50bb67139ab68b277c938578"}, - {file = "zope.interface-5.1.0-cp36-cp36m-macosx_10_6_intel.whl", hash = "sha256:e74671e43ed4569fbd7989e5eecc7d06dc134b571872ab1d5a88f4a123814e9f"}, - {file = "zope.interface-5.1.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b1d2ed1cbda2ae107283befd9284e650d840f8f7568cb9060b5466d25dc48975"}, - {file = "zope.interface-5.1.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:ef739fe89e7f43fb6494a43b1878a36273e5924869ba1d866f752c5812ae8d58"}, - {file = "zope.interface-5.1.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:eb9b92f456ff3ec746cd4935b73c1117538d6124b8617bc0fe6fda0b3816e345"}, - {file = "zope.interface-5.1.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:dcefc97d1daf8d55199420e9162ab584ed0893a109f45e438b9794ced44c9fd0"}, - {file = "zope.interface-5.1.0-cp36-cp36m-win32.whl", hash = "sha256:f40db0e02a8157d2b90857c24d89b6310f9b6c3642369852cdc3b5ac49b92afc"}, - {file = "zope.interface-5.1.0-cp36-cp36m-win_amd64.whl", hash = "sha256:14415d6979356629f1c386c8c4249b4d0082f2ea7f75871ebad2e29584bd16c5"}, - {file = "zope.interface-5.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5e86c66a6dea8ab6152e83b0facc856dc4d435fe0f872f01d66ce0a2131b7f1d"}, - {file = "zope.interface-5.1.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:39106649c3082972106f930766ae23d1464a73b7d30b3698c986f74bf1256a34"}, - {file = "zope.interface-5.1.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:8cccf7057c7d19064a9e27660f5aec4e5c4001ffcf653a47531bde19b5aa2a8a"}, - {file = "zope.interface-5.1.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:562dccd37acec149458c1791da459f130c6cf8902c94c93b8d47c6337b9fb826"}, - {file = "zope.interface-5.1.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:da2844fba024dd58eaa712561da47dcd1e7ad544a257482392472eae1c86d5e5"}, - {file = "zope.interface-5.1.0-cp37-cp37m-win32.whl", hash = "sha256:1ae4693ccee94c6e0c88a4568fb3b34af8871c60f5ba30cf9f94977ed0e53ddd"}, - {file = "zope.interface-5.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:dd98c436a1fc56f48c70882cc243df89ad036210d871c7427dc164b31500dc11"}, - {file = "zope.interface-5.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1b87ed2dc05cb835138f6a6e3595593fea3564d712cb2eb2de963a41fd35758c"}, - {file = "zope.interface-5.1.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:558a20a0845d1a5dc6ff87cd0f63d7dac982d7c3be05d2ffb6322a87c17fa286"}, - {file = "zope.interface-5.1.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7b726194f938791a6691c7592c8b9e805fc6d1b9632a833b9c0640828cd49cbc"}, - {file = "zope.interface-5.1.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:60a207efcd8c11d6bbeb7862e33418fba4e4ad79846d88d160d7231fcb42a5ee"}, - {file = "zope.interface-5.1.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:b054eb0a8aa712c8e9030065a59b5e6a5cf0746ecdb5f087cca5ec7685690c19"}, - {file = "zope.interface-5.1.0-cp38-cp38-win32.whl", hash = "sha256:27d287e61639d692563d9dab76bafe071fbeb26818dd6a32a0022f3f7ca884b5"}, - {file = "zope.interface-5.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:a5f8f85986197d1dd6444763c4a15c991bfed86d835a1f6f7d476f7198d5f56a"}, - {file = "zope.interface-5.1.0.tar.gz", hash = "sha256:40e4c42bd27ed3c11b2c983fecfb03356fae1209de10686d03c02c8696a1d90e"}, + {file = "zope.interface-6.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:506f5410b36e5ba494136d9fa04c548eaf1a0d9c442b0b0e7a0944db7620e0ab"}, + {file = "zope.interface-6.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b386b8b9d2b6a5e1e4eadd4e62335571244cb9193b7328c2b6e38b64cfda4f0e"}, + {file = "zope.interface-6.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:abb0b3f2cb606981c7432f690db23506b1db5899620ad274e29dbbbdd740e797"}, + {file = "zope.interface-6.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:de7916380abaef4bb4891740879b1afcba2045aee51799dfd6d6ca9bdc71f35f"}, + {file = "zope.interface-6.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b240883fb43160574f8f738e6d09ddbdbf8fa3e8cea051603d9edfd947d9328"}, + {file = "zope.interface-6.2-cp310-cp310-win_amd64.whl", hash = "sha256:8af82afc5998e1f307d5e72712526dba07403c73a9e287d906a8aa2b1f2e33dd"}, + {file = "zope.interface-6.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4d45d2ba8195850e3e829f1f0016066a122bfa362cc9dc212527fc3d51369037"}, + {file = "zope.interface-6.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:76e0531d86523be7a46e15d379b0e975a9db84316617c0efe4af8338dc45b80c"}, + {file = "zope.interface-6.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59f7374769b326a217d0b2366f1c176a45a4ff21e8f7cebb3b4a3537077eff85"}, + {file = "zope.interface-6.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:25e0af9663eeac6b61b231b43c52293c2cb7f0c232d914bdcbfd3e3bd5c182ad"}, + {file = "zope.interface-6.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14e02a6fc1772b458ebb6be1c276528b362041217b9ca37e52ecea2cbdce9fac"}, + {file = "zope.interface-6.2-cp311-cp311-win_amd64.whl", hash = "sha256:02adbab560683c4eca3789cc0ac487dcc5f5a81cc48695ec247f00803cafe2fe"}, + {file = "zope.interface-6.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:8f5d2c39f3283e461de3655e03faf10e4742bb87387113f787a7724f32db1e48"}, + {file = "zope.interface-6.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:75d2ec3d9b401df759b87bc9e19d1b24db73083147089b43ae748aefa63067ef"}, + {file = "zope.interface-6.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa994e8937e8ccc7e87395b7b35092818905cf27c651e3ff3e7f29729f5ce3ce"}, + {file = "zope.interface-6.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ede888382882f07b9e4cd942255921ffd9f2901684198b88e247c7eabd27a000"}, + {file = "zope.interface-6.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2606955a06c6852a6cff4abeca38346ed01e83f11e960caa9a821b3626a4467b"}, + {file = "zope.interface-6.2-cp312-cp312-win_amd64.whl", hash = "sha256:ac7c2046d907e3b4e2605a130d162b1b783c170292a11216479bb1deb7cadebe"}, + {file = "zope.interface-6.2-cp37-cp37m-macosx_11_0_x86_64.whl", hash = "sha256:febceb04ee7dd2aef08c2ff3d6f8a07de3052fc90137c507b0ede3ea80c21440"}, + {file = "zope.interface-6.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fc711acc4a1c702ca931fdbf7bf7c86f2a27d564c85c4964772dadf0e3c52f5"}, + {file = "zope.interface-6.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:396f5c94654301819a7f3a702c5830f0ea7468d7b154d124ceac823e2419d000"}, + {file = "zope.interface-6.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4dd374927c00764fcd6fe1046bea243ebdf403fba97a937493ae4be2c8912c2b"}, + {file = "zope.interface-6.2-cp37-cp37m-win_amd64.whl", hash = "sha256:a3046e8ab29b590d723821d0785598e0b2e32b636a0272a38409be43e3ae0550"}, + {file = "zope.interface-6.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:de125151a53ecdb39df3cb3deb9951ed834dd6a110a9e795d985b10bb6db4532"}, + {file = "zope.interface-6.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f444de0565db46d26c9fa931ca14f497900a295bd5eba480fc3fad25af8c763e"}, + {file = "zope.interface-6.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2fefad268ff5c5b314794e27e359e48aeb9c8bb2cbb5748a071757a56f6bb8f"}, + {file = "zope.interface-6.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97785604824981ec8c81850dd25c8071d5ce04717a34296eeac771231fbdd5cd"}, + {file = "zope.interface-6.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7b2bed4eea047a949296e618552d3fed00632dc1b795ee430289bdd0e3717f3"}, + {file = "zope.interface-6.2-cp38-cp38-win_amd64.whl", hash = "sha256:d54f66c511ea01b9ef1d1a57420a93fbb9d48a08ec239f7d9c581092033156d0"}, + {file = "zope.interface-6.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5ee9789a20b0081dc469f65ff6c5007e67a940d5541419ca03ef20c6213dd099"}, + {file = "zope.interface-6.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:af27b3fe5b6bf9cd01b8e1c5ddea0a0d0a1b8c37dc1c7452f1e90bf817539c6d"}, + {file = "zope.interface-6.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4bce517b85f5debe07b186fc7102b332676760f2e0c92b7185dd49c138734b70"}, + {file = "zope.interface-6.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ae9793f114cee5c464cc0b821ae4d36e1eba961542c6086f391a61aee167b6f"}, + {file = "zope.interface-6.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e87698e2fea5ca2f0a99dff0a64ce8110ea857b640de536c76d92aaa2a91ff3a"}, + {file = "zope.interface-6.2-cp39-cp39-win_amd64.whl", hash = "sha256:b66335bbdbb4c004c25ae01cc4a54fd199afbc1fd164233813c6d3c2293bb7e1"}, + {file = "zope.interface-6.2.tar.gz", hash = "sha256:3b6c62813c63c543a06394a636978b22dffa8c5410affc9331ce6cdb5bfa8565"}, ] [package.dependencies] setuptools = "*" [package.extras] -docs = ["Sphinx", "repoze.sphinx.autointerface"] +docs = ["Sphinx", "repoze.sphinx.autointerface", "sphinx_rtd_theme"] test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "2.0" -python-versions = "^3.10" -content-hash = "b6eae7458b3b50dac15cb6dcb2c124d3dd1a97ab1a2373ab1ebdc1d4e69da13a" +python-versions = "^3.12" +content-hash = "e969b715fdbfc1bcee1e2e586dcf5db13001867a1d72a496ae4c51be9dd62114" diff --git a/previous_years/archive_current_year_figure.py b/previous_years/archive_current_year_figure.py index 4e9301c4..bf13eb39 100644 --- a/previous_years/archive_current_year_figure.py +++ b/previous_years/archive_current_year_figure.py @@ -22,7 +22,10 @@ def archive_to_temp_previous_year_figures( row_to_archive, financial_year_obj, financialcode_obj ): - (previous_year_obj, created,) = ArchivedForecastDataUpload.objects.get_or_create( + ( + previous_year_obj, + created, + ) = ArchivedForecastDataUpload.objects.get_or_create( financial_year=financial_year_obj, financial_code=financialcode_obj, ) diff --git a/previous_years/import_previous_year.py b/previous_years/import_previous_year.py index d81bdf80..97e869ca 100644 --- a/previous_years/import_previous_year.py +++ b/previous_years/import_previous_year.py @@ -313,7 +313,9 @@ def upload_previous_year_from_file(file_upload, year): str(ex), str(ex), ) + workbook.close() raise ex + try: upload_previous_year(worksheet, year, file_upload) except (UploadFileDataError, ArchiveYearError) as ex: @@ -322,6 +324,7 @@ def upload_previous_year_from_file(file_upload, year): str(ex), str(ex), ) - workbook.close + workbook.close() raise ex - workbook.close + + workbook.close() diff --git a/previous_years/management/commands/archive_current_year.py b/previous_years/management/commands/archive_current_year.py index 9f99d4b5..12e1e64e 100644 --- a/previous_years/management/commands/archive_current_year.py +++ b/previous_years/management/commands/archive_current_year.py @@ -21,6 +21,5 @@ def handle(self, *args, **options): ArchiveYearError, ) as ex: raise CommandError(f"Failure archiving forecast/actual figures: {str(ex)}") - return self.stdout.write(self.style.SUCCESS("Current financial year archived. ")) diff --git a/previous_years/management/commands/upload_previous_year.py b/previous_years/management/commands/upload_previous_year.py index 158648a3..95d1c732 100644 --- a/previous_years/management/commands/upload_previous_year.py +++ b/previous_years/management/commands/upload_previous_year.py @@ -40,7 +40,6 @@ def handle(self, *args, **options): ArchiveYearError, ) as ex: raise CommandError(f"Failure uploading historical actuals: {str(ex)}") - return if self.upload_s3: os.remove(file_name) diff --git a/pyproject.toml b/pyproject.toml index 1481ff09..a92ee532 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,79 +8,74 @@ readme = "README.md" package-mode = false [tool.poetry.dependencies] -python = "^3.10" +python = "^3.12" celery = "^5.3.6" -dj-database-url = "0.5.0" +dj-database-url = "^2.1.0" django = "^4.2.11" -django-admin-list-filter-dropdown = "1.0.1" -django-autocomplete-light = "3.3.2" -django-axes = "5.9.0" -django-environ = "0.4.5" -django-extensions = "^3.2.2" -django-filter = "2.4.0" -django-guardian = "2.2.0" -django-import-export = "2.4.0" -django-log-formatter-ecs = "0.0.3" +django-admin-list-filter-dropdown = "^1.0.3" +django-autocomplete-light = "^3.11.0" +django-axes = "^6.4.0" +django-environ = "^0.11.2" +django-extensions = "^3.2.3" +django-filter = "^24.1" +django-guardian = "^2.4.0" +django-log-formatter-ecs = "^0.0.5" django-pivot = "^1.10" -django-redis = "4.12.1" django-reversion = "^5.0.12" -django-settings-export = "1.2.1" -django-simple-history = "3.0.0" +django-settings-export = "^1.2.1" +django-simple-history = "^3.5.0" django-staff-sso-client = "^4.2.2" -django-tables2 = "2.4.0" +django-tables2 = "^2.4.0" djangorestframework = "^3.14.0" -elastic-apm = "6.2.2" -gunicorn = "19.9.0" -psycopg2 = "2.8.6" -django-chunk-upload-handlers = "0.0.10" -sentry-sdk = "1.25.1" +elastic-apm = "^6.2.2" +gunicorn = "^21.2.0" +psycopg2 = "^2.8.6" +django-chunk-upload-handlers = "^0.0.14" +sentry-sdk = "^1.25.1" whitenoise = "^6.6.0" -mohawk = "1.1.0" -boto3 = "1.17.89" -botocore = "1.20.89" -django-storages = "1.11.1" -openpyxl = "3.0.5" +mohawk = "^1.1.0" +boto3 = "^1.17.89" +django-storages = "^1.14.2" +openpyxl = "^3.0.5" requests = "^2.25.1" +redis = "^5.0.3" -# Locked versions (not direct dependencies) -redis = "3.5.3" # TO RECHECK - +# Are these packages still needed? +django-import-export = "^3.3.07" [tool.poetry.group.prod] optional = true [tool.poetry.group.prod.dependencies] -gevent = "^23.9.0" -psycogreen = "1.0.2" -django-audit-log-middleware = "0.0.4" +gevent = "^24.2.1" +psycogreen = "^1.0.2" +django-audit-log-middleware = "^0.0.5" [tool.poetry.group.dev] optional = true [tool.poetry.group.dev.dependencies] selenium = "^4.18.1" -beautifulsoup4 = "4.9.1" -soupsieve = "1.9.6" -faker = "^4.1.1" -factory-boy = "^2.12.0" -black = "^22.3.0" +beautifulsoup4 = "^4.9.1" +soupsieve = "^2.5" +faker = "^24.4.0" +factory-boy = "^3.3.0" +black = "^24.3.0" pytest = "^7.4.4" pytest-cov = "^4.1.0" pytest-django = "^4.8.0" pytest-xdist = "^3.5.0" behave-django = "^1.4.0" +pytest-random-order = "^1.1.1" pyperclip = "^1.8.0" freezegun = "^1.0.0" isort = "^5.10.1" -flake8 = "^3.8.4" -pytest-random-order = "^1.1.1" - +ruff = "^0.3.4" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" - [tool.isort] profile = "black" multi_line_output = 3 @@ -89,8 +84,7 @@ line_length = 88 lines_after_imports = 2 [tool.black] -# Exclude files with # noqa directive for flake8. They have long lines, -# and black will move the flake8 directive to a new line, and flake8 will complain. +target-version = ["py312"] exclude = ''' ( \.direnv @@ -109,3 +103,18 @@ exclude = ''' | upload_split_file/downloads.py ) ''' + +[tool.ruff] +# Same as Black. +line-length = 88 +indent-width = 4 +# Target python 3.12. +target-version = "py312" +# In addition to the standard set of exclusions, omit all tests, plus a specific file. +extend-exclude = ["config/*", "features/*", "migrations", "manage.py"] + +[tool.ruff.lint] +# Enable flake8-bugbear (`B`) rules. +select = ["E", "F", "B"] +# Never enforce `E501` (line length violations). +ignore = ["E501", "B904"] diff --git a/requirements.txt b/requirements.txt index 294585c3..2ac95479 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,79 +1,81 @@ -amqp==5.2.0 ; python_version >= "3.10" and python_version < "4.0" -asgiref==3.8.0 ; python_version >= "3.10" and python_version < "4.0" -billiard==4.2.0 ; python_version >= "3.10" and python_version < "4.0" -boto3==1.17.89 ; python_version >= "3.10" and python_version < "4.0" -botocore==1.20.89 ; python_version >= "3.10" and python_version < "4.0" -celery==5.3.6 ; python_version >= "3.10" and python_version < "4.0" -certifi==2023.11.17 ; python_version >= "3.10" and python_version < "4" -cffi==1.16.0 ; platform_python_implementation == "CPython" and sys_platform == "win32" and python_version >= "3.10" and python_version < "4.0" -charset-normalizer==3.3.2 ; python_version >= "3.10" and python_version < "4.0" -click-didyoumean==0.3.0 ; python_version >= "3.10" and python_version < "4.0" -click-plugins==1.1.1 ; python_version >= "3.10" and python_version < "4.0" -click-repl==0.2.0 ; python_version >= "3.10" and python_version < "4.0" -click==8.1.7 ; python_version >= "3.10" and python_version < "4.0" -colorama==0.4.6 ; python_version >= "3.10" and python_version < "4.0" and platform_system == "Windows" -diff-match-patch==20121119 ; python_version >= "3.10" and python_version < "4.0" -dj-database-url==0.5.0 ; python_version >= "3.10" and python_version < "4.0" -django-admin-list-filter-dropdown==1.0.1 ; python_version >= "3.10" and python_version < "4.0" -django-audit-log-middleware==0.0.4 ; python_version >= "3.10" and python_version < "4.0" -django-autocomplete-light==3.3.2 ; python_version >= "3.10" and python_version < "4.0" -django-axes==5.9.0 ; python_version >= "3.10" and python_version < "4.0" -django-chunk-upload-handlers==0.0.10 ; python_version >= "3.10" and python_version < "4.0" -django-environ==0.4.5 ; python_version >= "3.10" and python_version < "4.0" -django-extensions==3.2.3 ; python_version >= "3.10" and python_version < "4.0" -django-filter==2.4.0 ; python_version >= "3.10" and python_version < "4.0" -django-guardian==2.2.0 ; python_version >= "3.10" and python_version < "4.0" -django-import-export==2.4.0 ; python_version >= "3.10" and python_version < "4.0" -django-ipware==3.0.2 ; python_version >= "3.10" and python_version < "4.0" -django-log-formatter-ecs==0.0.3 ; python_version >= "3.10" and python_version < "4.0" -django-pivot==1.10.0 ; python_version >= "3.10" and python_version < "4.0" -django-redis==4.12.1 ; python_version >= "3.10" and python_version < "4.0" -django-reversion==5.0.12 ; python_version >= "3.10" and python_version < "4.0" -django-settings-export==1.2.1 ; python_version >= "3.10" and python_version < "4.0" -django-simple-history==3.0.0 ; python_version >= "3.10" and python_version < "4.0" -django-staff-sso-client==4.2.2 ; python_version >= "3.10" and python_version < "4.0" -django-storages==1.11.1 ; python_version >= "3.10" and python_version < "4.0" -django-tables2==2.4.0 ; python_version >= "3.10" and python_version < "4.0" -django==4.2.11 ; python_version >= "3.10" and python_version < "4.0" -djangorestframework==3.15.0 ; python_version >= "3.10" and python_version < "4.0" -elastic-apm==6.2.2 ; python_version >= "3.10" and python_version < "4" -et-xmlfile==1.0.1 ; python_version >= "3.10" and python_version < "4.0" -gevent==23.9.1 ; python_version >= "3.10" and python_version < "4.0" -greenlet==3.0.3 ; platform_python_implementation == "CPython" and python_version < "4.0" and python_version >= "3.10" -gunicorn==19.9.0 ; python_version >= "3.10" and python_version < "4.0" -idna==2.7 ; python_version >= "3.10" and python_version < "4.0" -jdcal==1.3 ; python_version >= "3.10" and python_version < "4.0" -jmespath==0.9.3 ; python_version >= "3.10" and python_version < "4.0" -kombu==5.3.5 ; python_version >= "3.10" and python_version < "4.0" -kubi-ecs-logger==0.0.6 ; python_version >= "3.10" and python_version < "4" -markuppy==1.14 ; python_version >= "3.10" and python_version < "4.0" -marshmallow==2.19.2 ; python_version >= "3.10" and python_version < "4" -mohawk==1.1.0 ; python_version >= "3.10" and python_version < "4.0" -oauthlib==2.1.0 ; python_version >= "3.10" and python_version < "4.0" -odfpy==1.3.6 ; python_version >= "3.10" and python_version < "4.0" -openpyxl==3.0.5 ; python_version >= "3.10" and python_version < "4.0" -prompt-toolkit==1.0.15 ; python_version >= "3.10" and python_version < "4.0" -psycogreen==1.0.2 ; python_version >= "3.10" and python_version < "4.0" -psycopg2==2.8.6 ; python_version >= "3.10" and python_version < "4.0" -pycparser==2.21 ; python_version >= "3.10" and platform_python_implementation == "CPython" and sys_platform == "win32" and python_version < "4.0" -python-dateutil==2.9.0.post0 ; python_version >= "3.10" and python_version < "4.0" -pyyaml==6.0.1 ; python_version >= "3.10" and python_version < "4.0" -redis==3.5.3 ; python_version >= "3.10" and python_version < "4.0" -requests-oauthlib==1.0.0 ; python_version >= "3.10" and python_version < "4.0" -requests==2.31.0 ; python_version >= "3.10" and python_version < "4.0" -s3transfer==0.4.2 ; python_version >= "3.10" and python_version < "4.0" -sentry-sdk==1.25.1 ; python_version >= "3.10" and python_version < "4.0" -setuptools==69.2.0 ; python_version >= "3.10" and python_version < "4.0" -six==1.15.0 ; python_version >= "3.10" and python_version < "4.0" -sqlparse==0.4.4 ; python_version >= "3.10" and python_version < "4.0" -tablib[html,ods,xls,xlsx,yaml]==2.0.0 ; python_version >= "3.10" and python_version < "4.0" -typing-extensions==4.10.0 ; python_version >= "3.10" and python_version < "3.11" -tzdata==2024.1 ; python_version >= "3.10" and python_version < "4.0" -urllib3==1.26.18 ; python_version >= "3.10" and python_version < "4" -vine==5.1.0 ; python_version >= "3.10" and python_version < "4.0" -wcwidth==0.1.7 ; python_version >= "3.10" and python_version < "4.0" -whitenoise==6.6.0 ; python_version >= "3.10" and python_version < "4.0" -xlrd==1.1.0 ; python_version >= "3.10" and python_version < "4.0" -xlwt==1.3.0 ; python_version >= "3.10" and python_version < "4.0" -zope-event==4.4 ; python_version >= "3.10" and python_version < "4.0" -zope-interface==5.1.0 ; python_version >= "3.10" and python_version < "4.0" +amqp==5.2.0 ; python_version >= "3.12" and python_version < "4.0" +asgiref==3.8.1 ; python_version >= "3.12" and python_version < "4.0" +billiard==4.2.0 ; python_version >= "3.12" and python_version < "4.0" +boto3==1.34.72 ; python_version >= "3.12" and python_version < "4.0" +botocore==1.34.72 ; python_version >= "3.12" and python_version < "4.0" +celery==5.3.6 ; python_version >= "3.12" and python_version < "4.0" +certifi==2024.2.2 ; python_version >= "3.12" and python_version < "4" +cffi==1.16.0 ; platform_python_implementation == "CPython" and sys_platform == "win32" and python_version >= "3.12" and python_version < "4.0" +charset-normalizer==3.3.2 ; python_version >= "3.12" and python_version < "4.0" +click-didyoumean==0.3.1 ; python_version >= "3.12" and python_version < "4.0" +click-plugins==1.1.1 ; python_version >= "3.12" and python_version < "4.0" +click-repl==0.3.0 ; python_version >= "3.12" and python_version < "4.0" +click==8.1.7 ; python_version >= "3.12" and python_version < "4.0" +colorama==0.4.6 ; python_version >= "3.12" and python_version < "4.0" and platform_system == "Windows" +defusedxml==0.7.1 ; python_version >= "3.12" and python_version < "4.0" +diff-match-patch==20230430 ; python_version >= "3.12" and python_version < "4.0" +dj-database-url==2.1.0 ; python_version >= "3.12" and python_version < "4.0" +django-admin-list-filter-dropdown==1.0.3 ; python_version >= "3.12" and python_version < "4.0" +django-audit-log-middleware==0.0.5 ; python_version >= "3.12" and python_version < "4.0" +django-autocomplete-light==3.11.0 ; python_version >= "3.12" and python_version < "4.0" +django-axes==6.4.0 ; python_version >= "3.12" and python_version < "4.0" +django-chunk-upload-handlers==0.0.14 ; python_version >= "3.12" and python_version < "4.0" +django-environ==0.11.2 ; python_version >= "3.12" and python_version < "4" +django-extensions==3.2.3 ; python_version >= "3.12" and python_version < "4.0" +django-filter==24.2 ; python_version >= "3.12" and python_version < "4.0" +django-guardian==2.4.0 ; python_version >= "3.12" and python_version < "4.0" +django-import-export==3.3.7 ; python_version >= "3.12" and python_version < "4.0" +django-ipware==3.0.7 ; python_version >= "3.12" and python_version < "4.0" +django-log-formatter-ecs==0.0.5 ; python_version >= "3.12" and python_version < "4.0" +django-pivot==1.10.0 ; python_version >= "3.12" and python_version < "4.0" +django-reversion==5.0.12 ; python_version >= "3.12" and python_version < "4.0" +django-settings-export==1.2.1 ; python_version >= "3.12" and python_version < "4.0" +django-simple-history==3.5.0 ; python_version >= "3.12" and python_version < "4.0" +django-staff-sso-client==4.2.2 ; python_version >= "3.12" and python_version < "4.0" +django-storages==1.14.2 ; python_version >= "3.12" and python_version < "4.0" +django-tables2==2.7.0 ; python_version >= "3.12" and python_version < "4.0" +django==4.2.11 ; python_version >= "3.12" and python_version < "4.0" +djangorestframework==3.15.1 ; python_version >= "3.12" and python_version < "4.0" +ecs-logging==2.1.0 ; python_version >= "3.12" and python_version < "4" +elastic-apm==6.21.4.post8347027212 ; python_version >= "3.12" and python_version < "4" +et-xmlfile==1.1.0 ; python_version >= "3.12" and python_version < "4.0" +gevent==24.2.1 ; python_version >= "3.12" and python_version < "4.0" +greenlet==3.0.3 ; platform_python_implementation == "CPython" and python_version >= "3.12" and python_version < "4.0" +gunicorn==21.2.0 ; python_version >= "3.12" and python_version < "4.0" +idna==3.6 ; python_version >= "3.12" and python_version < "4.0" +jmespath==1.0.1 ; python_version >= "3.12" and python_version < "4.0" +kombu==5.3.6 ; python_version >= "3.12" and python_version < "4.0" +kubi-ecs-logger==0.1.2 ; python_version >= "3.12" and python_version < "4" +markuppy==1.14 ; python_version >= "3.12" and python_version < "4.0" +marshmallow==3.19.0 ; python_version >= "3.12" and python_version < "4" +mohawk==1.1.0 ; python_version >= "3.12" and python_version < "4.0" +oauthlib==3.2.2 ; python_version >= "3.12" and python_version < "4.0" +odfpy==1.4.1 ; python_version >= "3.12" and python_version < "4.0" +openpyxl==3.1.2 ; python_version >= "3.12" and python_version < "4.0" +packaging==24.0 ; python_version >= "3.12" and python_version < "4.0" +prompt-toolkit==3.0.43 ; python_version >= "3.12" and python_version < "4.0" +psycogreen==1.0.2 ; python_version >= "3.12" and python_version < "4.0" +psycopg2==2.9.9 ; python_version >= "3.12" and python_version < "4.0" +pycparser==2.21 ; python_version >= "3.12" and platform_python_implementation == "CPython" and sys_platform == "win32" and python_version < "4.0" +python-dateutil==2.9.0.post0 ; python_version >= "3.12" and python_version < "4.0" +pyyaml==6.0.1 ; python_version >= "3.12" and python_version < "4.0" +redis==5.0.3 ; python_version >= "3.12" and python_version < "4.0" +requests-oauthlib==2.0.0 ; python_version >= "3.12" and python_version < "4.0" +requests==2.31.0 ; python_version >= "3.12" and python_version < "4.0" +s3transfer==0.10.1 ; python_version >= "3.12" and python_version < "4.0" +sentry-sdk==1.43.0 ; python_version >= "3.12" and python_version < "4.0" +setuptools==69.2.0 ; python_version >= "3.12" and python_version < "4.0" +six==1.16.0 ; python_version >= "3.12" and python_version < "4.0" +sqlparse==0.4.4 ; python_version >= "3.12" and python_version < "4.0" +tablib[html,ods,xls,xlsx,yaml]==3.5.0 ; python_version >= "3.12" and python_version < "4.0" +typing-extensions==4.10.0 ; python_version >= "3.12" and python_version < "4.0" +tzdata==2024.1 ; python_version >= "3.12" and python_version < "4.0" +urllib3==2.2.1 ; python_version >= "3.12" and python_version < "4" +vine==5.1.0 ; python_version >= "3.12" and python_version < "4.0" +wcwidth==0.2.13 ; python_version >= "3.12" and python_version < "4.0" +whitenoise==6.6.0 ; python_version >= "3.12" and python_version < "4.0" +wrapt==1.14.1 ; python_version >= "3.12" and python_version < "4" +xlrd==2.0.1 ; python_version >= "3.12" and python_version < "4.0" +xlwt==1.3.0 ; python_version >= "3.12" and python_version < "4.0" +zope-event==5.0 ; python_version >= "3.12" and python_version < "4.0" +zope-interface==6.2 ; python_version >= "3.12" and python_version < "4.0" diff --git a/runtime.txt b/runtime.txt index 02390d9c..36247983 100644 --- a/runtime.txt +++ b/runtime.txt @@ -1,2 +1,2 @@ -python-3.10.x +python-3.12.x diff --git a/setup.cfg b/setup.cfg index 40c10d5f..a17d5d65 100644 --- a/setup.cfg +++ b/setup.cfg @@ -6,22 +6,3 @@ DJANGO_SETTINGS_MODULE = config.settings.dev exclude = */migrations/*,__pycache__,manage.py,config/*, ignore = W503 max-line-length = 99 - - -[flake8] -# D100: Missing docstring in public module -# D104: Missing docstring in public package -# D106: Missing docstring in public nested class -# D200: One-line docstring should fit on one line with quotes -# D203: 1 blank line required before class docstring -# D205: 1 blank line required between summary line and description -# D400: First line should end with a period -# D401: First line should be in imperative mood -# W503: line break occurred before a binary operator (not recommended in PEP 8) -# E203: E203 whitespace before ':' (not recommended in PEP 8) -exclude = */migrations/*,__pycache__,manage.py,config/*,env/*,lib/*,bin/*,include/*,.direnv/*,venv/*,./front_end,./node_modules,./src,./features,./fidovenv -ignore = D100,D104,D106,D200,D203,D205,D400,D401,W503 -max-line-length = 88 -max-complexity = 10 -extend-ignore = E203 -application-import-names = chartofaccountDIT,config,core,costcentre,end_of_month,forecast,gifthospitality,importdata,oscar_return,previous_years,treasuryCOA,treasurySS,upload_file diff --git a/treasuryCOA/import_csv.py b/treasuryCOA/import_csv.py index 648ebb8c..64121b76 100644 --- a/treasuryCOA/import_csv.py +++ b/treasuryCOA/import_csv.py @@ -52,7 +52,6 @@ # 'Cash Indicator Code': 38 # } -# noqa: E501 tells Flake8 to ignore lines that are to long L1_KEY = { IMPORT_CSV_MODEL_KEY: L1Account, IMPORT_CSV_PK_KEY: "Account L1 Code", diff --git a/treasuryCOA/test/factories.py b/treasuryCOA/test/factories.py index 94750706..c73bcc46 100644 --- a/treasuryCOA/test/factories.py +++ b/treasuryCOA/test/factories.py @@ -10,7 +10,7 @@ ) -class L1AccountFactory(factory.DjangoModelFactory): +class L1AccountFactory(factory.django.DjangoModelFactory): """ Define L1Account Factory """ @@ -21,7 +21,7 @@ class Meta: account_l1_code = 1111111 -class L2AccountFactory(factory.DjangoModelFactory): +class L2AccountFactory(factory.django.DjangoModelFactory): """ Define L2Account Factory """ @@ -33,7 +33,7 @@ class Meta: account_l1 = factory.SubFactory(L1AccountFactory) -class L3AccountFactory(factory.DjangoModelFactory): +class L3AccountFactory(factory.django.DjangoModelFactory): """ Define L3Account Factory """ @@ -45,7 +45,7 @@ class Meta: account_l2 = factory.SubFactory(L2AccountFactory) -class L4AccountFactory(factory.DjangoModelFactory): +class L4AccountFactory(factory.django.DjangoModelFactory): """ Define L4Account Factory """ @@ -57,7 +57,7 @@ class Meta: account_l3 = factory.SubFactory(L3AccountFactory) -class L5AccountFactory(factory.DjangoModelFactory): +class L5AccountFactory(factory.django.DjangoModelFactory): """ Define L5Account Factory """ @@ -70,7 +70,7 @@ class Meta: account_l4 = factory.SubFactory(L4AccountFactory) -class HistoricL5AccountFactory(factory.DjangoModelFactory): +class HistoricL5AccountFactory(factory.django.DjangoModelFactory): """ Define HistoricL5Account Factory """ diff --git a/treasurySS/import_csv.py b/treasurySS/import_csv.py index 7815de2b..04a2d232 100644 --- a/treasurySS/import_csv.py +++ b/treasurySS/import_csv.py @@ -48,8 +48,6 @@ # PESA Services Code # PESA Regional Code - -# noqa: E501 tells Flake8 to ignore lines that are to long SEGMENT_GP_KEY = { IMPORT_CSV_MODEL_KEY: SegmentGrandParent, IMPORT_CSV_PK_KEY: "Segment Grand Parent Code", diff --git a/treasurySS/test/factories.py b/treasurySS/test/factories.py index fe590810..f6467ed0 100644 --- a/treasurySS/test/factories.py +++ b/treasurySS/test/factories.py @@ -10,7 +10,7 @@ ) -class SegmentGrandParentFactory(factory.DjangoModelFactory): +class SegmentGrandParentFactory(factory.django.DjangoModelFactory): """ Define SegmentGrandParent Factory """ @@ -20,7 +20,7 @@ class Meta: django_get_or_create = ("segment_grand_parent_code",) -class SegmentParentFactory(factory.DjangoModelFactory): +class SegmentParentFactory(factory.django.DjangoModelFactory): """ Define SegmentParent Factory """ @@ -32,7 +32,7 @@ class Meta: django_get_or_create = ("segment_parent_code",) -class SegmentFactory(factory.DjangoModelFactory): +class SegmentFactory(factory.django.DjangoModelFactory): """ Define Segment Factory """ @@ -44,7 +44,7 @@ class Meta: django_get_or_create = ("segment_code",) -class EstimateRowFactory(factory.DjangoModelFactory): +class EstimateRowFactory(factory.django.DjangoModelFactory): """ Define EstimateRow Factory """ @@ -53,7 +53,7 @@ class Meta: model = EstimateRow -class SubSegmentFactory(factory.DjangoModelFactory): +class SubSegmentFactory(factory.django.DjangoModelFactory): """ Define SubSegment Factory """ diff --git a/upload_file/test/factories.py b/upload_file/test/factories.py index 20e7920a..7115220a 100644 --- a/upload_file/test/factories.py +++ b/upload_file/test/factories.py @@ -3,6 +3,6 @@ from upload_file.models import FileUpload -class FileUploadFactory(factory.DjangoModelFactory): +class FileUploadFactory(factory.django.DjangoModelFactory): class Meta: model = FileUpload diff --git a/upload_split_file/import_project_percentage.py b/upload_split_file/import_project_percentage.py index 1fdbe358..88c79975 100644 --- a/upload_split_file/import_project_percentage.py +++ b/upload_split_file/import_project_percentage.py @@ -139,7 +139,7 @@ def copy_uploaded_percentage(self): def get_valid_percentage_value(self, period_percentage): # We import from Excel, and the user # may have entered spaces in an empty cell. - if type(period_percentage) == str: + if isinstance(period_percentage, str): period_percentage = period_percentage.strip() if period_percentage == "-": # we accept the '-' as it is a recognised value in Finance for 0 @@ -306,7 +306,7 @@ def upload_project_percentage_from_file(worksheet, file_upload, include_archived upload.copy_uploaded_percentage() upload.apply_percentages() - except (UploadFileDataError) as ex: + except UploadFileDataError as ex: set_file_upload_fatal_error( file_upload, str(ex), @@ -326,4 +326,4 @@ def upload_project_percentage(file_upload, include_archived=False): ) return upload_project_percentage_from_file(worksheet, file_upload, include_archived) - workbook.close + workbook.close() diff --git a/upload_split_file/models.py b/upload_split_file/models.py index a2c44ff8..2242c17d 100644 --- a/upload_split_file/models.py +++ b/upload_split_file/models.py @@ -58,7 +58,12 @@ class Meta: class PivotManager(models.Manager): """Managers returning the data in Monthly figures pivoted""" - def pivot_data(self, columns, filter_dict={}, order_list=[]): + def pivot_data(self, columns, filter_dict=None, order_list=None): + if filter_dict is None: + filter_dict = {} + + if order_list is None: + order_list = [] q1 = self.get_queryset().filter(**filter_dict).order_by(*order_list) pivot_data = pivot( diff --git a/upload_split_file/split_actuals.py b/upload_split_file/split_actuals.py index 7a8d99a4..e1542174 100644 --- a/upload_split_file/split_actuals.py +++ b/upload_split_file/split_actuals.py @@ -157,7 +157,7 @@ def handle_split_project_by_directorate( if rounding: # allocate to the last processed row the difference transferred_to_obj.calculated_amount += rounding - transferred_to_obj.save + transferred_to_obj.save() copy_values(financial_period_id, directorate_code, expenditure_code_list)