From 36ac89efee4359af1ce1fd9c9d38eaa806c91efc Mon Sep 17 00:00:00 2001 From: "Stephen A. Fuqua" Date: Wed, 22 Feb 2023 12:58:16 -0600 Subject: [PATCH 01/19] Update locust --- src/edfi-performance-test/poetry.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/edfi-performance-test/poetry.lock b/src/edfi-performance-test/poetry.lock index e3d4be37..a8cc3bb6 100644 --- a/src/edfi-performance-test/poetry.lock +++ b/src/edfi-performance-test/poetry.lock @@ -350,7 +350,7 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "locust" -version = "2.13.0" +version = "2.14.2" description = "Developer friendly load testing framework" category = "main" optional = false @@ -1322,8 +1322,8 @@ jsonschema = [ {file = "jsonschema-4.16.0.tar.gz", hash = "sha256:165059f076eff6971bae5b742fc029a7b4ef3f9bcf04c14e4776a7605de14b23"}, ] locust = [ - {file = "locust-2.13.0-py3-none-any.whl", hash = "sha256:d747fb1be59d9e3f19e11fb90b8a50ad92b9615243ead67fc14e1e7421e5794e"}, - {file = "locust-2.13.0.tar.gz", hash = "sha256:f603752ab9d4f7d6034c5896c71e6069be49060a5868d6eb4d6c7d32b1c031ae"}, + {file = "locust-2.14.2-py3-none-any.whl", hash = "sha256:058a184438498787c74accf9cfdb32b8db9ce9a1b96894eb045ba2158ce1a62f"}, + {file = "locust-2.14.2.tar.gz", hash = "sha256:cc555d80c92dfbbfc99ab87cec1b454108aa1d2e6e12c4e37fa755a36ad8b9a0"}, ] markupsafe = [ {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, From 8b012f6e1d240e9a632259dd0045bc211b870e7f Mon Sep 17 00:00:00 2001 From: "Stephen A. Fuqua" Date: Wed, 22 Feb 2023 12:58:36 -0600 Subject: [PATCH 02/19] Remove unused kwargs --- .../edfi_performance_test/api/client/ed_fi_api_client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/ed_fi_api_client.py b/src/edfi-performance-test/edfi_performance_test/api/client/ed_fi_api_client.py index 794dca46..e78b4d57 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/ed_fi_api_client.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/ed_fi_api_client.py @@ -246,7 +246,7 @@ def create_using_dependencies(self, dependency_reference=None, **kwargs): "attributes": resource_attrs, } - def delete_with_dependencies(self, reference, **kwargs): + def delete_with_dependencies(self, reference): """ Atomically delete an instance of this resource along with all dependencies. The `reference` parameter will contain the necessary From 122ce9adcd8b78d199e3238d565b5ccb2e5edfdb Mon Sep 17 00:00:00 2001 From: "Stephen A. Fuqua" Date: Wed, 22 Feb 2023 13:03:50 -0600 Subject: [PATCH 03/19] This has been wrong since at least DS 3.2.0 --- .../factories/resources/community.py | 4 ++-- .../factories/resources/education.py | 8 ++++---- .../edfi_performance_test/factories/resources/school.py | 2 +- .../edfi_performance_test/tasks/volume/school.py | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/community.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/community.py index cb3ed889..88199a46 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/community.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/community.py @@ -28,7 +28,7 @@ class CommunityOrganizationFactory(APIFactory): ] ) categories = ListOfDescriptors("EducationOrganizationCategory", ["School"]) - educationOrganizationCodes = factory.LazyAttribute( + identificationCodes = factory.LazyAttribute( lambda o: build_descriptor_dicts( "EducationOrganizationIdentificationSystem", [("Other", {"identificationCode": o.communityOrganizationId})], @@ -53,7 +53,7 @@ class CommunityProviderFactory(APIFactory): ] ) categories = ListOfDescriptors("EducationOrganizationCategory", ["School"]) - educationOrganizationCodes = factory.LazyAttribute( + identificationCodes = factory.LazyAttribute( lambda o: build_descriptor_dicts( "EducationOrganizationIdentificationSystem", [("Other", {"identificationCode": o.communityProviderId})], diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/education.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/education.py index f2a52813..3dd7fab0 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/education.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/education.py @@ -31,7 +31,7 @@ class EducationServiceCenterFactory(APIFactory): categories = ListOfDescriptors( "EducationOrganizationCategory", ["Education Service Center"] ) - educationOrganizationCodes = factory.LazyAttribute( + identificationCodes = factory.LazyAttribute( lambda o: build_descriptor_dicts( "EducationOrganizationIdentificationSystem", [("SEA", {"identificationCode": o.educationServiceCenterId})], @@ -53,7 +53,7 @@ class LocalEducationAgencyFactory(APIFactory): localEducationAgencyCategoryDescriptor = build_descriptor( "LocalEducationAgencyCategory", "Independent" ) - educationOrganizationCodes = factory.LazyAttribute( + identificationCodes = factory.LazyAttribute( lambda o: build_descriptor_dicts( "EducationOrganizationIdentificationSystem", [("SEA", {"identificationCode": o.localEducationAgencyId})], @@ -95,7 +95,7 @@ class EducationOrganizationNetworkFactory(APIFactory): ] ) categories = ListOfDescriptors("EducationOrganizationCategory", ["School"]) - educationOrganizationCodes = factory.LazyAttribute( + identificationCodes = factory.LazyAttribute( lambda o: build_descriptor_dicts( "EducationOrganizationIdentificationSystem", [("SEA", {"identificationCode": o.educationOrganizationNetworkId})], @@ -142,7 +142,7 @@ class StateEducationAgencyFactory(APIFactory): categories = ListOfDescriptors( "EducationOrganizationCategory", ["Local Education Agency"] ) - educationOrganizationCodes = factory.LazyAttribute( + identificationCodes = factory.LazyAttribute( lambda o: build_descriptor_dicts( "EducationOrganizationIdentificationSystem", [("SEA", {"identificationCode": o.stateEducationAgencyId})], diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/school.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/school.py index 3feb80ea..53f40927 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/school.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/school.py @@ -32,7 +32,7 @@ class SchoolFactory(APIFactory): educationOrganizationCategories = ListOfDescriptors( "EducationOrganizationCategory", ["School"] ) - educationOrganizationCodes = factory.LazyAttribute( + identificationCodes = factory.LazyAttribute( lambda o: build_descriptor_dicts( "EducationOrganizationIdentificationSystem", [("SEA", {"identificationCode": str(o.schoolId)})], diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/volume/school.py b/src/edfi-performance-test/edfi_performance_test/tasks/volume/school.py index 07c60c48..918b2b7b 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/volume/school.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/volume/school.py @@ -28,7 +28,7 @@ def run_school_scenarios(self): "InstitutionTelephoneNumberType", [("Main", {"telephoneNumber": "(950) 325-9465"})], ), - educationOrganizationCodes=build_descriptor_dicts( + identificationCodes=build_descriptor_dicts( "EducationOrganizationIdentificationSystem", [("SEA", {"identificationCode": "255901444"})], ), From 338a68ba3942d2a74a15159ed5fff5c0e085fedc Mon Sep 17 00:00:00 2001 From: "Stephen A. Fuqua" Date: Thu, 23 Feb 2023 12:43:06 -0600 Subject: [PATCH 04/19] Location header handling that works for Meadowlark --- .../api/client/ed_fi_api_client.py | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/ed_fi_api_client.py b/src/edfi-performance-test/edfi_performance_test/api/client/ed_fi_api_client.py index e78b4d57..96609540 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/ed_fi_api_client.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/ed_fi_api_client.py @@ -7,7 +7,7 @@ import json import logging import re -from typing import Any, Dict +from typing import Any, Dict, Optional import urllib3 @@ -118,6 +118,17 @@ def get_item(self, resource_id): self.log_response(response) return json.loads(response.text) + def _get_resource_id_from_location(self, headers: dict) -> Optional[str]: + header = "" + if "Location" in headers: + header = "Location" + elif "location" in headers: + header = "location" + else: + return None + + return headers[header].split("/")[-1].strip() + def create(self, unique_id_field=None, name=None, **factory_kwargs): # Pass in a `unique_id_field` name (e.g. 'schoolId') to have that # attribute returned alongside the resource_id. Useful if you need @@ -146,7 +157,8 @@ def create(self, unique_id_field=None, name=None, **factory_kwargs): return None, None return None self.log_response(response) - resource_id = response.headers["Location"].split("/")[-1].strip() + + resource_id = self._get_resource_id_from_location(response.headers) if unique_id is not None: return resource_id, unique_id return resource_id @@ -164,8 +176,14 @@ def update(self, resource_id, **update_kwargs): if self.is_not_expected_result(response, [200, 204]): return self.log_response(response) - new_id = response.headers["Location"].split("/")[-1].strip() - assert new_id == resource_id + + new_id = self._get_resource_id_from_location(response.headers) + + # The ODS/API returns a Location header on PUT requests, but this is not a required feature + # of an Ed-Fi API. Therefore only apply this test if the location header was found + if new_id is not None: + assert new_id == resource_id + return resource_id def delete_item(self, resource_id): From 4050060f198bf01d41571e1fc8d71928d92333d5 Mon Sep 17 00:00:00 2001 From: "Stephen A. Fuqua" Date: Thu, 23 Feb 2023 16:18:39 -0600 Subject: [PATCH 05/19] Install pytest-describe --- src/edfi-performance-test/poetry.lock | 2 +- src/edfi-performance-test/pyproject.toml | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/edfi-performance-test/poetry.lock b/src/edfi-performance-test/poetry.lock index a8cc3bb6..be8a729f 100644 --- a/src/edfi-performance-test/poetry.lock +++ b/src/edfi-performance-test/poetry.lock @@ -843,7 +843,7 @@ testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] [metadata] lock-version = "1.1" python-versions = "^3.9" -content-hash = "1d26e797355884498120da3c2410acec1d6950113c2217b05e72a75bb46b478e" +content-hash = "b45045c65d920897790ac73eac17c03cb9489917c9a143179868468363ff225c" [metadata.files] attrs = [ diff --git a/src/edfi-performance-test/pyproject.toml b/src/edfi-performance-test/pyproject.toml index 5e79e565..63ae8560 100644 --- a/src/edfi-performance-test/pyproject.toml +++ b/src/edfi-performance-test/pyproject.toml @@ -29,6 +29,9 @@ types-urllib3 = "^1.26.15" types-requests = "^2.28.0" +[tool.poetry.group.dev.dependencies] +pytest-describe = "^2.0.1" + [build-system] requires = ["poetry-core>=1.0.0"] build-backend = "poetry.core.masonry.api" From 4d62277e83533d8dbbddd7441fb1d273ee3f0a0d Mon Sep 17 00:00:00 2001 From: "Stephen A. Fuqua" Date: Thu, 23 Feb 2023 16:19:11 -0600 Subject: [PATCH 06/19] Rewrite using pytest-describe --- .../tests/factories/__init__.py | 5 +++ .../tests/factories/test_utils.py | 32 +++++++++---------- 2 files changed, 21 insertions(+), 16 deletions(-) create mode 100644 src/edfi-performance-test/tests/factories/__init__.py diff --git a/src/edfi-performance-test/tests/factories/__init__.py b/src/edfi-performance-test/tests/factories/__init__.py new file mode 100644 index 00000000..1a175fe6 --- /dev/null +++ b/src/edfi-performance-test/tests/factories/__init__.py @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: Apache-2.0 +# Licensed to the Ed-Fi Alliance under one or more agreements. +# The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +# See the LICENSE and NOTICES files in the project root for more information. + diff --git a/src/edfi-performance-test/tests/factories/test_utils.py b/src/edfi-performance-test/tests/factories/test_utils.py index 8e386ce7..de2b4d32 100644 --- a/src/edfi-performance-test/tests/factories/test_utils.py +++ b/src/edfi-performance-test/tests/factories/test_utils.py @@ -8,24 +8,24 @@ from edfi_performance_test.factories.utils import formatted_date -class Test_utils(object): - def test_given_no_year_when_formatting_date_then_use_current_year(self): +def describe_when_formatting_a_date() -> None: + def describe_given_no_year_provided() -> None: + def it_formats_using_current_year() -> None: + month = 12 + day = 1 + expected = str(date.today().year) + "-12-01" - month = 12 - day = 1 - expected = str(date.today().year) + "-12-01" + actual = formatted_date(month, day) - actual = formatted_date(month, day) + assert actual == expected - assert actual == expected + def describe_given_year_is_provided() -> None: + def it_formats_using_the_given_year() -> None: + year = 1999 + month = 12 + day = 1 + expected = "1999-12-01" - def test_given_year_is_supplied_when_formatting_date_then_use_supplied_year(self): + actual = formatted_date(month, day, year) - year = 1999 - month = 12 - day = 1 - expected = "1999-12-01" - - actual = formatted_date(month, day, year) - - assert actual == expected + assert actual == expected From 94e671a788b13a6dc98241887c638a8bc330b01a Mon Sep 17 00:00:00 2001 From: "Stephen A. Fuqua" Date: Thu, 23 Feb 2023 16:19:44 -0600 Subject: [PATCH 07/19] Test for building descriptors Modify descriptor to be capitalized --- .../factories/descriptors/utils.py | 14 ++--- .../tests/factories/descriptors/__init__.py | 5 ++ .../tests/factories/descriptors/test_utils.py | 58 +++++++++++++++++++ 3 files changed, 70 insertions(+), 7 deletions(-) create mode 100644 src/edfi-performance-test/tests/factories/descriptors/__init__.py create mode 100644 src/edfi-performance-test/tests/factories/descriptors/test_utils.py diff --git a/src/edfi-performance-test/edfi_performance_test/factories/descriptors/utils.py b/src/edfi-performance-test/edfi_performance_test/factories/descriptors/utils.py index 5e0b9c5a..b403c4bb 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/descriptors/utils.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/descriptors/utils.py @@ -3,6 +3,7 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. +from typing import Any, Dict, List, Tuple, Union import factory @@ -24,14 +25,13 @@ def _descriptor_type_to_dict_key(descriptor_type): return "{}{}".format(dt[0].lower(), dt[1:]) -def _descriptor_type_to_endpoint(descriptor_type): - return "{}s".format(_descriptor_type_to_dict_key(descriptor_type)) - - def build_descriptor(descriptor_type, value): - _namespace = "uri://ed-fi.org/" descriptor_type = _normalize_descriptor_type(descriptor_type) - return "{}{}#{}".format(_namespace, descriptor_type, value) + + # force first letter to be capitalized + descriptor_type = descriptor_type[:1].capitalize() + descriptor_type[1:] + + return f"{'uri://ed-fi.org/'}{descriptor_type}#{value}" def _build_descriptor_dicts(descriptor_type, values): @@ -48,7 +48,7 @@ def _build_descriptor_dicts(descriptor_type, values): yield defaults -def build_descriptor_dicts(descriptor_type, values): +def build_descriptor_dicts(descriptor_type: str, values: List[Union[str, Tuple[str, Dict[str, Union[str, Any]]]]]) -> List[Dict[str, str]]: """ A common pattern in Ed-Fi resources is to have a list of dicts of descriptors, something like diff --git a/src/edfi-performance-test/tests/factories/descriptors/__init__.py b/src/edfi-performance-test/tests/factories/descriptors/__init__.py new file mode 100644 index 00000000..1a175fe6 --- /dev/null +++ b/src/edfi-performance-test/tests/factories/descriptors/__init__.py @@ -0,0 +1,5 @@ +# SPDX-License-Identifier: Apache-2.0 +# Licensed to the Ed-Fi Alliance under one or more agreements. +# The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +# See the LICENSE and NOTICES files in the project root for more information. + diff --git a/src/edfi-performance-test/tests/factories/descriptors/test_utils.py b/src/edfi-performance-test/tests/factories/descriptors/test_utils.py new file mode 100644 index 00000000..0dd8c68c --- /dev/null +++ b/src/edfi-performance-test/tests/factories/descriptors/test_utils.py @@ -0,0 +1,58 @@ +# SPDX-License-Identifier: Apache-2.0 +# Licensed to the Ed-Fi Alliance under one or more agreements. +# The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. +# See the LICENSE and NOTICES files in the project root for more information. + +from typing import Dict, List +import pytest + +from edfi_performance_test.factories.descriptors.utils import build_descriptor_dicts, build_descriptor + + +def describe_when_building_a_descriptor() -> None: + @pytest.mark.parametrize("input, expected", [ + ("Title", "uri://ed-fi.org/TitleDescriptor#value"), + ("title", "uri://ed-fi.org/TitleDescriptor#value"), + ("titledescriptor", "uri://ed-fi.org/TitledescriptorDescriptor#value"), + ("title_descriptor", "uri://ed-fi.org/TitleDescriptor#value"), + ]) + def it_formats_the_descriptor_string_correctly(input: str, expected: str) -> None: + actual = build_descriptor(input, "value") + + assert actual == expected + + +def describe_when_building_a_descriptor_dictionary() -> None: + def describe_given_two_grade_levels() -> None: + @pytest.fixture + def result() -> List[str]: + result = build_descriptor_dicts( + "GradeLevel", ["Ninth grade", "Tenth grade"] + ) + + descriptors = [i['gradeLevelDescriptor'] for i in result] + assert len(descriptors) == 2 + + return descriptors + + @pytest.mark.parametrize("expected", [("uri://ed-fi.org/GradeLevelDescriptor#Ninth grade"), ("uri://ed-fi.org/GradeLevelDescriptor#Tenth grade")]) + def it_includes_all_grades(result, expected) -> None: + assert expected in result + + def describe_given_a_telephone_number() -> None: + @pytest.fixture + def result() -> Dict[str, str]: + result = build_descriptor_dicts( + "InstitutionTelephoneNumberType", [("Main", {"telephoneNumber": "(950) 325-9465"})] + ) + + assert len(result) == 1 + + return result[0] + + def it_references_the_descriptor_properly(result) -> None: + assert result["institutionTelephoneNumberTypeDescriptor"] == "uri://ed-fi.org/InstitutionTelephoneNumberTypeDescriptor#Main" + + def it_includes_the_telephone_number(result) -> None: + assert result["telephoneNumber"] == "(950) 325-9465" + From 9821d5ffedb9d68e8a5627bfc61fe7db2ae9c1c4 Mon Sep 17 00:00:00 2001 From: "Stephen A. Fuqua" Date: Fri, 24 Feb 2023 09:22:35 -0600 Subject: [PATCH 08/19] Type ignore in clients --- .../api/client/account.py | 9 ++-- .../api/client/assessment.py | 6 +-- .../api/client/bell_schedule.py | 2 +- .../api/client/calendar_date.py | 2 +- .../api/client/community.py | 4 +- .../api/client/course.py | 2 +- .../api/client/course_offering.py | 2 +- .../api/client/discipline.py | 4 +- .../api/client/education.py | 10 ++-- .../edfi_performance_test/api/client/grade.py | 2 +- .../api/client/gradebook_entries.py | 2 +- .../api/client/graduation_plan.py | 2 +- .../api/client/intervention.py | 4 +- .../api/client/parent.py | 8 ++-- .../api/client/post_secondary.py | 2 +- .../api/client/report_card.py | 2 +- .../api/client/section.py | 16 +++---- .../api/client/session.py | 8 ++-- .../edfi_performance_test/api/client/staff.py | 14 +++--- .../api/client/student.py | 48 +++++++++---------- .../factories/resources/staff.py | 1 - .../factories/resources/student.py | 1 - 22 files changed, 74 insertions(+), 77 deletions(-) diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/account.py b/src/edfi-performance-test/edfi_performance_test/api/client/account.py index 3463d807..43ab865c 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/account.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/account.py @@ -19,9 +19,8 @@ class AccountClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - # TODO: this is the only reference to account_code_client anywhere in - # the code base, so the next line should fail if it is ever called. - account_code_reference = self.account_code_client.create_with_dependencies() + # The constructor for ed_fi_api_client dynamically creates the `xyz_client` property using `setattr` + account_code_reference = self.account_code_client.create_with_dependencies() # type: ignore account_code_attrs = account_code_reference["attributes"] edorg_id = account_code_attrs["educationOrganizationReference"][ @@ -56,10 +55,10 @@ class _AccountDependentMixin(object): } def create_with_dependencies(self, **kwargs): - account_reference = self.account_client.create_with_dependencies() + account_reference = self.account_client.create_with_dependencies() # type: ignore account_identifier = account_reference["attributes"]["accountIdentifier"] - return self.create_using_dependencies( + return self.create_using_dependencies( # type: ignore account_reference, accountReference__accountIdentifier=account_identifier, **kwargs diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/assessment.py b/src/edfi-performance-test/edfi_performance_test/api/client/assessment.py index 53b90510..b5d6e025 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/assessment.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/assessment.py @@ -18,7 +18,7 @@ class AssessmentItemClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): # Create new assessment - assessment_reference = self.assessment_client.create_with_dependencies() + assessment_reference = self.assessment_client.create_with_dependencies() # type: ignore # Create assessment item return self.create_using_dependencies( @@ -45,7 +45,7 @@ class ObjectiveAssessmentClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): # Create new assessment - assessment_reference = self.assessment_client.create_with_dependencies() + assessment_reference = self.assessment_client.create_with_dependencies() # type: ignore # Create objective assessment return self.create_using_dependencies( @@ -64,7 +64,7 @@ class StudentAssessmentClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): # Create new assessment - assessment_reference = self.assessment_client.create_with_dependencies() + assessment_reference = self.assessment_client.create_with_dependencies() # type: ignore # Create student assessment return self.create_using_dependencies( diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/bell_schedule.py b/src/edfi-performance-test/edfi_performance_test/api/client/bell_schedule.py index a30afd93..358d35eb 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/bell_schedule.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/bell_schedule.py @@ -15,7 +15,7 @@ class BellScheduleClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): # Create new class period - class_period_reference = self.class_period_client.create_with_dependencies() + class_period_reference = self.class_period_client.create_with_dependencies() # type: ignore # Create bell schedule return self.create_using_dependencies( diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/calendar_date.py b/src/edfi-performance-test/edfi_performance_test/api/client/calendar_date.py index ef6e4da6..e0c8086d 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/calendar_date.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/calendar_date.py @@ -22,7 +22,7 @@ def create_with_dependencies(self, **kwargs): "calendarCode", RandomSuffixAttribute("107SS111111") ) # Create a calendar - calendar_reference = self.calendar_client.create_with_dependencies( + calendar_reference = self.calendar_client.create_with_dependencies( # type: ignore schoolReference__schoolId=school_id, calendarCode=custom_calendar_code ) diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/community.py b/src/edfi-performance-test/edfi_performance_test/api/client/community.py index 21f81c3f..00316139 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/community.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/community.py @@ -20,7 +20,7 @@ class CommunityProviderClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - org_reference = self.org_client.create_with_dependencies() + org_reference = self.org_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( org_reference, @@ -41,7 +41,7 @@ class CommunityProviderLicenseClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - provider_reference = self.provider_client.create_with_dependencies() + provider_reference = self.provider_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( provider_reference, diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/course.py b/src/edfi-performance-test/edfi_performance_test/api/client/course.py index f1ce16ef..209e6f39 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/course.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/course.py @@ -24,7 +24,7 @@ class CourseTranscriptClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) - record_reference = self.record_client.create_with_dependencies( + record_reference = self.record_client.create_with_dependencies( # type: ignore schoolId=school_id ) diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/course_offering.py b/src/edfi-performance-test/edfi_performance_test/api/client/course_offering.py index 22bcf4bb..2dd172e3 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/course_offering.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/course_offering.py @@ -16,7 +16,7 @@ class CourseOfferingClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) school_year = kwargs.get("schoolYear", 2014) - session_reference = self.session_client.create_with_dependencies( + session_reference = self.session_client.create_with_dependencies( # type: ignore schoolId=school_id, schoolYear=school_year ) diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/discipline.py b/src/edfi-performance-test/edfi_performance_test/api/client/discipline.py index bc0240c0..d1c0ae87 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/discipline.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/discipline.py @@ -21,7 +21,7 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) # Create staff - staff_reference = self.staff_client.create_with_dependencies(schoolId=school_id) + staff_reference = self.staff_client.create_with_dependencies(schoolId=school_id) # type: ignore # Create discipline incident return self.create_using_dependencies( @@ -47,7 +47,7 @@ def create_with_dependencies(self, **kwargs): # Create incident and association first school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) - assoc_reference = self.assoc_client.create_with_dependencies(schoolId=school_id) + assoc_reference = self.assoc_client.create_with_dependencies(schoolId=school_id) # type: ignore # Create discipline action return self.create_using_dependencies( diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/education.py b/src/edfi-performance-test/edfi_performance_test/api/client/education.py index c4cf0ae6..ac7eb8a3 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/education.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/education.py @@ -26,7 +26,7 @@ class EducationOrganizationInterventionPrescriptionAssociationClient(EdFiAPIClie } def create_with_dependencies(self, **kwargs): - rx_reference = self.prescription_client.create_with_dependencies() + rx_reference = self.prescription_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( rx_reference, @@ -52,7 +52,7 @@ class EducationOrganizationNetworkAssociationClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - network_reference = self.network_client.create_with_dependencies() + network_reference = self.network_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( network_reference, @@ -73,7 +73,7 @@ class EducationOrganizationPeerAssociationClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - school_reference = self.school_client.create_with_dependencies() + school_reference = self.school_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( school_reference, @@ -103,7 +103,7 @@ class LocalEducationAgencyClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - service_center_reference = self.service_center_client.create_with_dependencies() + service_center_reference = self.service_center_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( service_center_reference, @@ -136,7 +136,7 @@ class FeederSchoolAssociationClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - feeder_school_reference = self.school_client.create_with_dependencies() + feeder_school_reference = self.school_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( feeder_school_reference, diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/grade.py b/src/edfi-performance-test/edfi_performance_test/api/client/grade.py index 503e50c6..1a477a72 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/grade.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/grade.py @@ -23,7 +23,7 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) course_code = kwargs.pop("courseCode", "ELA-01") - assoc_reference = self.section_assoc_client.create_with_dependencies( + assoc_reference = self.section_assoc_client.create_with_dependencies( # type: ignore schoolId=school_id, courseCode=course_code ) grade_period = assoc_reference["dependency_ids"]["section_client"][ diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/gradebook_entries.py b/src/edfi-performance-test/edfi_performance_test/api/client/gradebook_entries.py index b6d06a66..bcdf8d03 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/gradebook_entries.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/gradebook_entries.py @@ -16,7 +16,7 @@ class GradebookEntryClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - section_reference = self.section_client.create_with_dependencies() + section_reference = self.section_client.create_with_dependencies() # type: ignore section_attrs = section_reference["attributes"] return self.create_using_dependencies( diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/graduation_plan.py b/src/edfi-performance-test/edfi_performance_test/api/client/graduation_plan.py index 32c88991..91cfe013 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/graduation_plan.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/graduation_plan.py @@ -16,7 +16,7 @@ class GraduationPlanClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - school_reference = self.school_client.create_with_dependencies() + school_reference = self.school_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( school_reference, diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/intervention.py b/src/edfi-performance-test/edfi_performance_test/api/client/intervention.py index f0a86f47..225a312f 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/intervention.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/intervention.py @@ -21,7 +21,7 @@ class InterventionClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): # Create intervention prescription - rx_reference = self.prescription_client.create_with_dependencies() + rx_reference = self.prescription_client.create_with_dependencies() # type: ignore # Create intervention return self.create_using_dependencies( @@ -45,7 +45,7 @@ class InterventionStudyClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): # Create intervention prescription - rx_reference = self.prescription_client.create_with_dependencies() + rx_reference = self.prescription_client.create_with_dependencies() # type: ignore # Create intervention return self.create_using_dependencies( diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/parent.py b/src/edfi-performance-test/edfi_performance_test/api/client/parent.py index 01ad8b40..25a9b064 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/parent.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/parent.py @@ -28,12 +28,12 @@ def create_with_dependencies(self, **kwargs): parent_id = self.create(**parent_attrs) # Create enrolled student - student_reference = self.student_client.create_with_dependencies( + student_reference = self.student_client.create_with_dependencies( # type: ignore schoolId=school_id ) # Associate parent with student to allow updates - assoc_id = self.parent_assoc_client.create( + assoc_id = self.parent_assoc_client.create( # type: ignore parentReference__parentUniqueId=parent_unique_id, studentReference__studentUniqueId=student_reference["attributes"][ "studentUniqueId" @@ -50,8 +50,8 @@ def create_with_dependencies(self, **kwargs): } def delete_with_dependencies(self, reference, **kwargs): - self.parent_assoc_client.delete_item(reference["dependency_ids"]["assoc_id"]) - self.student_client.delete_with_dependencies( + self.parent_assoc_client.delete_item(reference["dependency_ids"]["assoc_id"]) # type: ignore + self.student_client.delete_with_dependencies( # type: ignore reference["dependency_ids"]["student_reference"] ) self.delete_item(reference["resource_id"]) diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/post_secondary.py b/src/edfi-performance-test/edfi_performance_test/api/client/post_secondary.py index c6c88188..10004a8c 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/post_secondary.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/post_secondary.py @@ -20,7 +20,7 @@ class PostSecondaryEventClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): # Create new student for association - institution_reference = self.institution_client.create_with_dependencies() + institution_reference = self.institution_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( institution_reference, diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/report_card.py b/src/edfi-performance-test/edfi_performance_test/api/client/report_card.py index 280b7257..d76551ad 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/report_card.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/report_card.py @@ -16,7 +16,7 @@ class ReportCardClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - period_reference = self.grading_period_client.create_with_dependencies() + period_reference = self.grading_period_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( period_reference, diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/section.py b/src/edfi-performance-test/edfi_performance_test/api/client/section.py index 57abbade..42c4661c 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/section.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/section.py @@ -28,7 +28,7 @@ def create_with_dependencies(self, **kwargs): # Create a course offering and its dependencies course_offering_reference = ( - self.course_offering_client.create_with_dependencies( + self.course_offering_client.create_with_dependencies( # type: ignore schoolId=school_id, schoolYear=school_year, courseReference__courseCode=custom_course_code, @@ -39,12 +39,12 @@ def create_with_dependencies(self, **kwargs): course_offering_attrs = course_offering_reference["attributes"] # Create a class period - class_period_reference = self.class_period_client.create_with_dependencies( + class_period_reference = self.class_period_client.create_with_dependencies( # type: ignore schoolReference__schoolId=school_id, ) # Create a location - location_reference = self.location_client.create_with_dependencies( + location_reference = self.location_client.create_with_dependencies( # type: ignore schoolReference__schoolId=school_id, ) @@ -91,11 +91,11 @@ def create_with_dependencies(self, **kwargs): def delete_with_dependencies(self, reference, **kwargs): self.delete_item(reference["resource_id"]) depend = reference["dependency_ids"] - self.location_client.delete_with_dependencies(depend["location_reference"]) - self.class_period_client.delete_with_dependencies( + self.location_client.delete_with_dependencies(depend["location_reference"]) # type: ignore + self.class_period_client.delete_with_dependencies( # type: ignore depend["class_period_reference"] ) - self.course_offering_client.delete_with_dependencies( + self.course_offering_client.delete_with_dependencies( # type: ignore depend["course_offering_reference"] ) @@ -110,13 +110,13 @@ class SectionAttendanceTakenEventClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) - calendar_date_reference = self.calendar_date_client.create_with_dependencies( + calendar_date_reference = self.calendar_date_client.create_with_dependencies( # type: ignore schoolId=school_id, ) calendar_date_attrs = calendar_date_reference["attributes"] calendarSchoolYear = calendar_date_attrs["calendarReference"]["schoolYear"] - section_reference = self.section_client.create_with_dependencies( + section_reference = self.section_client.create_with_dependencies( # type: ignore schoolId=school_id, schoolYear=calendarSchoolYear ) section_attrs = section_reference["attributes"] diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/session.py b/src/edfi-performance-test/edfi_performance_test/api/client/session.py index c78b53a8..42848aac 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/session.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/session.py @@ -19,11 +19,11 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) school_year = kwargs.get("schoolYear", 2014) # Create two grading periods - period_1_reference = self.grading_period_client.create_with_dependencies( + period_1_reference = self.grading_period_client.create_with_dependencies( # type: ignore schoolReference__schoolId=school_id, schoolYearTypeReference__schoolYear=school_year, ) - period_2_reference = self.grading_period_client.create_with_dependencies( + period_2_reference = self.grading_period_client.create_with_dependencies( # type: ignore schoolReference__schoolId=school_id, schoolYearTypeReference__schoolYear=school_year, beginDate="2014-10-06", @@ -57,9 +57,9 @@ def create_with_dependencies(self, **kwargs): def delete_with_dependencies(self, reference, **kwargs): self.delete_item(reference["resource_id"]) - self.grading_period_client.delete_with_dependencies( + self.grading_period_client.delete_with_dependencies( # type: ignore reference["dependency_ids"]["period_1_reference"] ) - self.grading_period_client.delete_with_dependencies( + self.grading_period_client.delete_with_dependencies( # type: ignore reference["dependency_ids"]["period_2_reference"] ) diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/staff.py b/src/edfi-performance-test/edfi_performance_test/api/client/staff.py index d004e6c6..774037f4 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/staff.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/staff.py @@ -35,7 +35,7 @@ def create_with_dependencies(self, **kwargs): staff_id = self.create(**staff_attrs) # Associate staff with existing school to allow updates - assoc_id = self.assoc_client.create( + assoc_id = self.assoc_client.create( # type: ignore staffReference__staffUniqueId=staff_unique_id, educationOrganizationReference__educationOrganizationId=school_id, staffUniqueId=staff_unique_id, @@ -50,7 +50,7 @@ def create_with_dependencies(self, **kwargs): } def delete_with_dependencies(self, reference, **kwargs): - self.assoc_client.delete_item(reference["dependency_ids"]["assoc_id"]) + self.assoc_client.delete_item(reference["dependency_ids"]["assoc_id"]) # type: ignore self.delete_item(reference["resource_id"]) @classmethod @@ -93,12 +93,12 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) # Create cohort - cohort_reference = self.cohort_client.create_with_dependencies( + cohort_reference = self.cohort_client.create_with_dependencies( # type: ignore educationOrganizationReference__educationOrganizationId=school_id, ) # Create staff - staff_reference = self.staff_client.create_with_dependencies(schoolId=school_id) + staff_reference = self.staff_client.create_with_dependencies(schoolId=school_id) # type: ignore # Create association between new staff and new cohort return self.create_using_dependencies( @@ -139,7 +139,7 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) # Create staff record - staff_reference = self.staff_client.create_with_dependencies(schoolId=school_id) + staff_reference = self.staff_client.create_with_dependencies(schoolId=school_id) # type: ignore return self.create_using_dependencies( staff_reference, @@ -164,12 +164,12 @@ def create_with_dependencies(self, **kwargs): course_code = kwargs.pop("courseCode", "ELA-01") # Create section and staff - section_reference = self.section_client.create_with_dependencies( + section_reference = self.section_client.create_with_dependencies( # type: ignore schoolId=school_id, courseCode=course_code, sectionIdentifier=RandomSuffixAttribute(course_code + "2017RM555"), ) - staff_reference = self.staff_client.create_with_dependencies(schoolId=school_id) + staff_reference = self.staff_client.create_with_dependencies(schoolId=school_id) # type: ignore # Create association between staff and section sec_attrs = section_reference["attributes"] diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/student.py b/src/edfi-performance-test/edfi_performance_test/api/client/student.py index 7ec2771e..19588872 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/student.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/student.py @@ -24,7 +24,7 @@ class StudentParentAssociationClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): # Create enrolled student - student_reference = self.student_client.create_with_dependencies() + student_reference = self.student_client.create_with_dependencies() # type: ignore # Create parent parent_unique_id = kwargs.pop("parentUniqueId", ParentClient.shared_parent_id()) @@ -60,7 +60,7 @@ def create_with_dependencies(self, **kwargs): student_id = self.create(**student_attrs) # Associate student with existing school to allow updates - assoc_id = self.assoc_client.create( + assoc_id = self.assoc_client.create( # type: ignore studentReference__studentUniqueId=student_unique_id, schoolReference__schoolId=school_id, studentUniqueId=student_unique_id, @@ -75,7 +75,7 @@ def create_with_dependencies(self, **kwargs): } def delete_with_dependencies(self, reference, **kwargs): - self.assoc_client.delete_item(reference["dependency_ids"]["assoc_id"]) + self.assoc_client.delete_item(reference["dependency_ids"]["assoc_id"]) # type: ignore self.delete_item(reference["resource_id"]) @classmethod @@ -116,7 +116,7 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) # Create enrolled student - student_reference = self.student_client.create_with_dependencies( + student_reference = self.student_client.create_with_dependencies( # type: ignore schoolId=school_id ) @@ -142,12 +142,12 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) # Create enrolled student - student_reference = self.student_client.create_with_dependencies( + student_reference = self.student_client.create_with_dependencies( # type: ignore schoolId=school_id ) # Create a cohort - cohort_reference = self.cohort_client.create_with_dependencies( + cohort_reference = self.cohort_client.create_with_dependencies( # type: ignore educationOrganizationReference__educationOrganizationId=school_id ) @@ -179,7 +179,7 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) # Create enrolled student - student_reference = self.student_client.create_with_dependencies( + student_reference = self.student_client.create_with_dependencies( # type: ignore schoolId=school_id ) @@ -204,7 +204,7 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) # Create enrolled student - student_reference = self.student_client.create_with_dependencies( + student_reference = self.student_client.create_with_dependencies( # type: ignore schoolId=school_id ) @@ -227,7 +227,7 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) # Create enrolled student - student_reference = self.student_client.create_with_dependencies( + student_reference = self.student_client.create_with_dependencies( # type: ignore schoolId=school_id ) @@ -255,12 +255,12 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) # Create enrolled student - student_reference = self.student_client.create_with_dependencies( + student_reference = self.student_client.create_with_dependencies( # type: ignore schoolId=school_id ) # Create discipline incident - incident_reference = self.incident_client.create_with_dependencies( + incident_reference = self.incident_client.create_with_dependencies( # type: ignore schoolId=school_id ) @@ -293,12 +293,12 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.get("schoolId", SchoolClient.shared_elementary_school_id()) course_code = kwargs.pop("courseCode", "ELA-01") # Create section and student - section_reference = self.section_client.create_with_dependencies( + section_reference = self.section_client.create_with_dependencies( # type: ignore schoolId=school_id, courseCode=course_code, sectionIdentifier=RandomSuffixAttribute(course_code + "2017RM555"), ) - student_reference = self.student_client.create_with_dependencies( + student_reference = self.student_client.create_with_dependencies( # type: ignore schoolId=school_id ) student_unique_id = student_reference["attributes"]["studentUniqueId"] @@ -340,12 +340,12 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) # Create enrolled student - student_reference = self.student_client.create_with_dependencies( + student_reference = self.student_client.create_with_dependencies( # type: ignore schoolId=school_id ) # Create session - session_reference = self.session_client.create_with_dependencies( + session_reference = self.session_client.create_with_dependencies( # type: ignore schoolId=school_id ) @@ -380,12 +380,12 @@ def create_with_dependencies(self, **kwargs): course_code = kwargs.pop("courseCode", "ELA-01") # Create enrolled student - student_reference = self.student_client.create_with_dependencies( + student_reference = self.student_client.create_with_dependencies( # type: ignore schoolId=school_id ) # Create section - section_reference = self.section_client.create_with_dependencies( + section_reference = self.section_client.create_with_dependencies( # type: ignore schoolId=school_id, courseCode=course_code, sectionIdentifier=RandomSuffixAttribute(course_code + "2017RM555"), @@ -429,7 +429,7 @@ def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) # Create enrolled student - student_reference = self.student_client.create_with_dependencies( + student_reference = self.student_client.create_with_dependencies( # type: ignore schoolId=school_id ) @@ -454,11 +454,11 @@ class StudentCompetencyObjectiveClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): # Create grading period - period_reference = self.grading_period_client.create_with_dependencies() + period_reference = self.grading_period_client.create_with_dependencies() # type: ignore # Create competency objective objective_reference = ( - self.competency_objective_client.create_with_dependencies() + self.competency_objective_client.create_with_dependencies() # type: ignore ) # Create student competency objective @@ -560,7 +560,7 @@ class StudentInterventionAssociationClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - intervention_reference = self.intervention_client.create_with_dependencies() + intervention_reference = self.intervention_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( intervention_reference, @@ -581,7 +581,7 @@ class StudentInterventionAttendanceEventClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - intervention_reference = self.intervention_client.create_with_dependencies() + intervention_reference = self.intervention_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( intervention_reference, @@ -607,9 +607,9 @@ class StudentLearningObjectiveClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - objective_reference = self.objective_client.create_with_dependencies() + objective_reference = self.objective_client.create_with_dependencies() # type: ignore - period_reference = self.grading_period_client.create_with_dependencies() + period_reference = self.grading_period_client.create_with_dependencies() # type: ignore return self.create_using_dependencies( [ diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/staff.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/staff.py index 530012a5..44833912 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/staff.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/staff.py @@ -50,7 +50,6 @@ class StaffEducationOrganizationAssignmentAssociationFactory(APIFactory): class StaffFactory(APIFactory): staffUniqueId = UniqueIdAttribute() firstName = "John" - middleName = "" lastSurname = "Loyo" hispanicLatinoEthnicity = True birthDate = "1959-04-30" diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py index ede136b4..4655fcd8 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py @@ -307,7 +307,6 @@ class StudentSectionAttendanceEventFactory(APIFactory): "AttendanceEventCategory", "Tardy" ) eventDate = formatted_date(9, 16) - attendanceEventReason = "" class StudentAcademicRecordFactory(APIFactory): From d57fa1c90190fc15cd428e722758fb57a9bd1091 Mon Sep 17 00:00:00 2001 From: "Stephen A. Fuqua" Date: Mon, 27 Feb 2023 09:27:06 -0600 Subject: [PATCH 09/19] this descriptor is part of the natural key and shouldn't be changeable --- .../edfi_performance_test/tasks/pipeclean/account.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/account.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/account.py index d5e4bf8a..4c79f136 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/account.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/account.py @@ -16,8 +16,8 @@ class AccountPipecleanTest(EdFiPipecleanTestBase): class AccountCodePipecleanTest(EdFiPipecleanTestBase): - update_attribute_name = "accountClassificationDescriptor" - update_attribute_value = build_descriptor("AccountClassification", "Fund") + update_attribute_name = "accountCodeDescription" + update_attribute_value = "another description" class ActualPipecleanTest(EdFiPipecleanTestBase): From b004ef7db35cd709e5ab1290c28cf4d61d8cab9f Mon Sep 17 00:00:00 2001 From: "Stephen A. Fuqua" Date: Mon, 27 Feb 2023 09:27:58 -0600 Subject: [PATCH 10/19] Fixing modeling mistakes that the ODS/API would forgive, but meadowlark won't --- .gitattributes | 2 + .../api/client/composite.py | 4 + .../api/client/course_offering.py | 3 +- .../api/client/section.py | 5 +- .../api/client/session.py | 5 +- .../edfi_performance_test/api/client/staff.py | 16 +- .../api/client/student.py | 23 ++- .../factories/resources/assessment.py | 13 +- .../factories/resources/bell_schedule.py | 2 +- .../factories/resources/course.py | 1 + .../factories/resources/discipline.py | 2 +- .../factories/resources/education.py | 4 +- .../factories/resources/grading_period.py | 3 +- .../factories/resources/session.py | 4 + .../factories/resources/student.py | 163 ++++++++---------- .../edfi_performance_test/factories/utils.py | 9 + .../tasks/pipeclean/assessment.py | 2 +- .../tasks/pipeclean/class_period.py | 1 + .../tasks/pipeclean/competency_objective.py | 4 +- .../tasks/pipeclean/descriptors.py | 2 +- .../tasks/pipeclean/education.py | 7 +- .../tasks/pipeclean/gradebook_entries.py | 1 + .../tasks/pipeclean/parent.py | 2 +- .../tasks/pipeclean/post_secondary.py | 8 +- .../tasks/pipeclean/program.py | 4 +- .../tasks/pipeclean/student.py | 7 +- 26 files changed, 153 insertions(+), 144 deletions(-) diff --git a/.gitattributes b/.gitattributes index 4a2dfcc8..41bf0cce 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1,5 @@ +* text eol=lf + *.md text *.txt text *.py text diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/composite.py b/src/edfi-performance-test/edfi_performance_test/api/client/composite.py index f8a99e67..16757a30 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/composite.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/composite.py @@ -44,5 +44,9 @@ def _get_all(self, resource): response = self._get_response( "get", list_endpoint, headers=self.get_headers(), name=list_endpoint ) + + if not response.ok: + raise RuntimeError(f"Composite resource '{resource}' does not exist (404)") + self.log_response(response) return json.loads(response.text) diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/course_offering.py b/src/edfi-performance-test/edfi_performance_test/api/client/course_offering.py index 2dd172e3..5282598e 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/course_offering.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/course_offering.py @@ -15,7 +15,8 @@ class CourseOfferingClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) - school_year = kwargs.get("schoolYear", 2014) + school_year = kwargs.pop("schoolYear", 2014) + session_reference = self.session_client.create_with_dependencies( # type: ignore schoolId=school_id, schoolYear=school_year ) diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/section.py b/src/edfi-performance-test/edfi_performance_test/api/client/section.py index 42c4661c..7ad59bf3 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/section.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/section.py @@ -22,8 +22,8 @@ class SectionClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - school_id = kwargs.get("schoolId", SchoolClient.shared_elementary_school_id()) - school_year = kwargs.get("schoolYear", 2014) + school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) + school_year = kwargs.pop("schoolYear", 2014) custom_course_code = kwargs.pop("courseCode", "ELA-01") # Create a course offering and its dependencies @@ -55,6 +55,7 @@ def create_with_dependencies(self, **kwargs): ][ "classPeriodName" ], + classPeriods__0__classPeriodReference__schoolId=school_id, courseOfferingReference__localCourseCode=course_offering_attrs[ "localCourseCode" ], diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/session.py b/src/edfi-performance-test/edfi_performance_test/api/client/session.py index 42848aac..e1663585 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/session.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/session.py @@ -16,8 +16,11 @@ class SessionClient(EdFiAPIClient): dependencies: Dict = {GradingPeriodClient: {}} def create_with_dependencies(self, **kwargs): + # is schoolyear a kwarg? + school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) - school_year = kwargs.get("schoolYear", 2014) + school_year = kwargs.pop("schoolYear", 2014) + # Create two grading periods period_1_reference = self.grading_period_client.create_with_dependencies( # type: ignore schoolReference__schoolId=school_id, diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/staff.py b/src/edfi-performance-test/edfi_performance_test/api/client/staff.py index 774037f4..41d0aa1a 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/staff.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/staff.py @@ -38,7 +38,6 @@ def create_with_dependencies(self, **kwargs): assoc_id = self.assoc_client.create( # type: ignore staffReference__staffUniqueId=staff_unique_id, educationOrganizationReference__educationOrganizationId=school_id, - staffUniqueId=staff_unique_id, ) return { @@ -65,16 +64,13 @@ class StaffEducationOrganizationAssignmentAssociationClient(EdFiAPIClient): endpoint = "staffEducationOrganizationAssignmentAssociations" def create_with_dependencies(self, **kwargs): - # Create new staff for association - staff_unique_id = kwargs.pop("staffUniqueId", StaffClient.shared_staff_id()) - - # Create association from staff to ed org - edorg_id = kwargs.pop( - "educationOrganizationId", SchoolClient.shared_elementary_school_id() - ) assoc_overrides = dict( - staffReference__staffUniqueId=staff_unique_id, - educationOrganizationReference__educationOrganizationId=edorg_id, + staffReference__staffUniqueId=kwargs.pop( + "staffUniqueId", StaffClient.shared_staff_id() + ), + educationOrganizationReference__educationOrganizationId=kwargs.pop( + "educationOrganizationId", SchoolClient.shared_elementary_school_id() + ), ) assoc_overrides.update(kwargs) return self.create_using_dependencies(**assoc_overrides) diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/student.py b/src/edfi-performance-test/edfi_performance_test/api/client/student.py index 19588872..025facde 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/student.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/student.py @@ -62,8 +62,7 @@ def create_with_dependencies(self, **kwargs): # Associate student with existing school to allow updates assoc_id = self.assoc_client.create( # type: ignore studentReference__studentUniqueId=student_unique_id, - schoolReference__schoolId=school_id, - studentUniqueId=student_unique_id, + schoolReference__schoolId=school_id ) return { @@ -90,13 +89,11 @@ class StudentSchoolAssociationClient(EdFiAPIClient): endpoint = "studentSchoolAssociations" def create_with_dependencies(self, **kwargs): - # Create new student for association - student_unique_id = kwargs.pop( - "studentUniqueId", StudentClient.shared_student_id() - ) - # Create association from student to school school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) + # This is coming back with a function, and we need to call that function + student_unique_id = kwargs.pop("student_unique_id", StudentClient.shared_student_id()) + assoc_overrides = dict( studentReference__studentUniqueId=student_unique_id, schoolReference__schoolId=school_id, @@ -290,7 +287,7 @@ class StudentSectionAssociationClient(EdFiAPIClient): } def create_with_dependencies(self, **kwargs): - school_id = kwargs.get("schoolId", SchoolClient.shared_elementary_school_id()) + school_id = kwargs.pop("schoolId", SchoolClient.shared_elementary_school_id()) course_code = kwargs.pop("courseCode", "ELA-01") # Create section and student section_reference = self.section_client.create_with_dependencies( # type: ignore @@ -470,7 +467,7 @@ def create_with_dependencies(self, **kwargs): gradingPeriodReference__periodSequence=period_reference["attributes"][ "periodSequence" ], - objectiveCompetencyObjectiveReference__objective=objective_reference[ + competencyObjectiveReference__objective=objective_reference[ "attributes" ]["objective"], ) @@ -496,7 +493,7 @@ class StudentGradebookEntryClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): # Create a student and section - student_section_reference = self.assoc_client.create_with_dependencies() + student_section_reference = self.assoc_client.create_with_dependencies() # type: ignore section_kwargs = { "sectionIdentifier": student_section_reference["attributes"][ "sectionReference" @@ -516,7 +513,7 @@ def create_with_dependencies(self, **kwargs): } # Create gradebook entry - entry_id, gradebook_entry_title = self.entry_client.create( + entry_id, gradebook_entry_title = self.entry_client.create( # type: ignore unique_id_field="gradebookEntryTitle", sectionReference=section_kwargs ) @@ -544,8 +541,8 @@ def create_with_dependencies(self, **kwargs): def delete_with_dependencies(self, reference, **kwargs): self.delete_item(reference["resource_id"]) dependencies = reference["dependency_ids"] - self.entry_client.delete_item(dependencies["entry_client"]) - self.assoc_client.delete_with_dependencies(dependencies["assoc_client"]) + self.entry_client.delete_item(dependencies["entry_client"]) # type: ignore + self.assoc_client.delete_with_dependencies(dependencies["assoc_client"]) # type: ignore class StudentHomelessProgramAssociationClient(EdFiAPIClient): diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/assessment.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/assessment.py index 81552807..e4131f4e 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/assessment.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/assessment.py @@ -12,6 +12,7 @@ RandomDateAttribute, RandomSuffixAttribute, UniqueIdAttribute, + random_date_time, ) @@ -88,7 +89,9 @@ class AssessmentFactory(APIFactory): assessmentReportingMethodDescriptor=build_descriptor( "AssessmentReportingMethod", "Scale score" ), - resultDatatypeType="Integer", + resultDatatypeTypeDescriptor=build_descriptor( + "ResultDatatypeType", "Integer" + ), maximumScore="25", minimumScore="0", ) @@ -119,8 +122,7 @@ class LearningObjectiveFactory(APIFactory): dict( academicSubjectDescriptor=build_descriptor( "AcademicSubject", "Mathematics" - ), - namespace="uri://ed-fi.org/", + ) ) ) ] @@ -164,6 +166,7 @@ class LearningStandardFactory(APIFactory): ), ] ) + contentStandard = factory.Dict(dict(title="State Standard")) class ObjectiveAssessmentFactory(APIFactory): @@ -188,9 +191,7 @@ class StudentAssessmentFactory(APIFactory): namespace="uri://ed-fi.org/Assessment/Assessment.xml", ) ) - administrationDate = ( - RandomDateAttribute() - ) # Along with studentReference and assessmentReference, this is the PK + administrationDate = random_date_time() # Along with studentReference and assessmentReference, this is the PK administrationEnvironmentDescriptor = build_descriptor( "AdministrationEnvironment", "Testing Center" ) diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/bell_schedule.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/bell_schedule.py index 3d78bd6f..1a742a54 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/bell_schedule.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/bell_schedule.py @@ -19,7 +19,7 @@ class BellScheduleFactory(APIFactory): [ factory.Dict( dict( - classPeriodReference=factory.Dict(dict(classPeriodName=None)), + classPeriodReference=factory.Dict(dict(classPeriodName=None, schoolId=SchoolClient.shared_elementary_school_id())), ) ), ] diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/course.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/course.py index 616a8cac..92717988 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/course.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/course.py @@ -62,3 +62,4 @@ class CourseTranscriptFactory(APIFactory): courseAttemptResultDescriptor = build_descriptor("CourseAttemptResult", "Pass") finalLetterGradeEarned = "B" finalNumericGradeEarned = 83 + earnedCredits = 3 diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/discipline.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/discipline.py index a2e0f462..12c8d3fd 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/discipline.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/discipline.py @@ -67,6 +67,6 @@ class DisciplineIncidentFactory(APIFactory): ) ] ) - incidentLocationDescriptor = build_descriptor("IncidentLocation", "School Bus") + incidentLocationDescriptor = build_descriptor("IncidentLocation", "School bus") reporterDescriptionDescriptor = build_descriptor("ReporterDescription", "Staff") reporterName = "Villa, Mike" diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/education.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/education.py index 3dd7fab0..e336739b 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/education.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/education.py @@ -66,8 +66,10 @@ class LocalEducationAgencyFactory(APIFactory): class EducationContentFactory(APIFactory): contentIdentifier = UniqueIdAttribute(num_chars=60) - description = "A learning resource for all grade levels" + shortDescription = "A learning resource for all grade levels" namespace = "uri://ed-fi.org" + learningResourceMetadataURI = "uri://ed-fi.org/whatever" + contentClassDescriptor = "uri://ed-fi.org/ContentClassDescriptor#Presentation" class EducationOrganizationInterventionPrescriptionAssociationFactory(APIFactory): diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/grading_period.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/grading_period.py index b012c13d..ec3b74bd 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/grading_period.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/grading_period.py @@ -8,11 +8,10 @@ from edfi_performance_test.api.client.school import SchoolClient from edfi_performance_test.factories.resources.api_factory import APIFactory from edfi_performance_test.factories.descriptors.utils import build_descriptor -from edfi_performance_test.factories.utils import UniquePrimaryKeyAttribute class GradingPeriodFactory(APIFactory): - periodSequence = UniquePrimaryKeyAttribute() + periodSequence = 1 beginDate = "2014-08-23" endDate = "2014-10-04" totalInstructionalDays = 29 diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/session.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/session.py index 0beab5bc..652196ba 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/session.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/session.py @@ -27,6 +27,8 @@ class SessionFactory(APIFactory): "GradingPeriod", "First Six Weeks" ), periodSequence=None, # Must be entered by client + schoolYear=2014, + schoolId=SchoolClient.shared_elementary_school_id(), ) ), ), @@ -39,6 +41,8 @@ class SessionFactory(APIFactory): "GradingPeriod", "Second Six Weeks" ), periodSequence=None, # Must be entered by client + schoolYear=2014, + schoolId=SchoolClient.shared_elementary_school_id(), ) ), ), diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py index 4655fcd8..421cfcb4 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py @@ -19,6 +19,8 @@ RandomDateAttribute, ) +SESSION_NAME = "2016-2017 Fall Semester" + class StudentFactory(APIFactory): studentUniqueId = UniqueIdAttribute() @@ -28,73 +30,9 @@ class StudentFactory(APIFactory): lastSurname = "Jones" generationCodeSuffix = "JR" personalTitlePrefix = "Mr" - hispanicLatinoEthnicity = False birthCity = "Grand Bend" birthCountryDescriptor = build_descriptor("Country", "AG") birthStateAbbreviationDescriptor = build_descriptor("StateAbbreviation", "TX") - addresses = factory.List( - [ - factory.SubFactory( - AddressFactory, - addressTypeDescriptor=build_descriptor("AddressType", "Temporary"), - city="Grand Bend", - postalCode="78834", - streetNumberName="654 Mission Hills", - apartmentRoomSuiteNumber="100", - nameOfCounty="Williston", - ) - ] - ) - electronicMails = factory.List( - [ - dict( - electronicMailAddress="Austin@edficert.org", - electronicMailTypeDescriptor=build_descriptor( - "ElectronicMailType", "Other" - ), - ), - ] - ) - identificationCodes = factory.List( - [ - dict( - identificationCode=704, - assigningOrganizationIdentificationCode="State", - studentIdentificationSystemDescriptor=build_descriptor( - "StudentIdentificationSystem", "State" - ), - ), - ] - ) - studentLanguages = factory.List( - [ - dict( - languageDescriptor=build_descriptor("Language", "Spanish"), - ), - ] - ) - studentLanguageUses = factory.List( - [ - dict( - languageUseDescriptor=build_descriptor("LanguageUse", "Home language"), - ), - ] - ) - studentRaces = factory.List( - [ - dict(raceDescriptor=build_descriptor("Race", "Black - African American")), - ] - ) - telephones = factory.List( - [ - dict( - telephoneNumber="111-222-3333", - telephoneNumberTypeDescriptor=build_descriptor( - "TelephoneNumberType", "Home" - ), - ), - ] - ) class StudentCohortAssociationFactory(APIFactory): @@ -155,6 +93,63 @@ class StudentEducationOrganizationAssociationFactory(APIFactory): ] ) sexDescriptor = build_descriptor("Sex", "Male") + hispanicLatinoEthnicity = True + addresses = factory.List( + [ + factory.SubFactory( + AddressFactory, + addressTypeDescriptor=build_descriptor("AddressType", "Temporary"), + city="Grand Bend", + postalCode="78834", + streetNumberName="654 Mission Hills", + apartmentRoomSuiteNumber="100", + nameOfCounty="Williston", + ) + ] + ) + electronicMails = factory.List( + [ + dict( + electronicMailAddress="Austin@edficert.org", + electronicMailTypeDescriptor=build_descriptor( + "ElectronicMailType", "Other" + ), + ), + ] + ) + studentIdentificationCodes = factory.List( + [ + dict( + identificationCode=704, + assigningOrganizationIdentificationCode="State", + studentIdentificationSystemDescriptor=build_descriptor( + "StudentIdentificationSystem", "State" + ), + ), + ] + ) + languages = factory.List( + [ + dict( + languageDescriptor=build_descriptor("Language", "Spanish"), + ), + ] + ) + races = factory.List( + [ + dict(raceDescriptor=build_descriptor("Race", "Black - African American")), + ] + ) + telephones = factory.List( + [ + dict( + telephoneNumber="111-222-3333", + telephoneNumberTypeDescriptor=build_descriptor( + "TelephoneNumberType", "Home" + ), + ), + ] + ) class StudentParentAssociationFactory(APIFactory): @@ -178,10 +173,8 @@ class StudentProgramAssociationFactory(APIFactory): ) # Prepopulated ed organization programReference = factory.Dict( dict( - programTypeDescriptor=build_descriptor( - "ProgramType", "Gifted and Talented" - ), - programName="Gifted and Talented", + programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name), + programName=ProgramClient.shared_program_name, educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), # Prepopulated ed organization ) ) @@ -198,7 +191,7 @@ class StudentSchoolAssociationFactory(APIFactory): entryDate = RandomDateAttribute() entryGradeLevelDescriptor = build_descriptor("GradeLevel", "First Grade") classOfSchoolYearTypeReference = factory.Dict(dict(schoolYear=2027)) - schoolYear = current_year() + schoolYearTypeReference = factory.Dict(dict(schoolYear=current_year())) entryTypeDescriptor = build_descriptor("EntryType", "Next year school") repeatGradeIndicator = False residencyStatusDescriptor = build_descriptor( @@ -218,8 +211,8 @@ class StudentTitleIPartAProgramAssociationFactory(APIFactory): ) # Prepopulated ed organization programReference = factory.Dict( dict( - programTypeDescriptor=build_descriptor("ProgramType", "Title I Part A"), - programName="Title I Part A", + programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name), + programName=ProgramClient.shared_program_name, educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), # Prepopulated ed organization ) ) @@ -240,8 +233,8 @@ class StudentSpecialEducationProgramAssociationFactory(APIFactory): ) # Prepopulated ed organization programReference = factory.Dict( dict( - programTypeDescriptor=build_descriptor("ProgramType", "Special Education"), - programName="Special Education", + programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name), + programName=ProgramClient.shared_program_name, educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), # Prepopulated ed organization ) ) @@ -259,7 +252,7 @@ class StudentSectionAssociationFactory(APIFactory): schoolId=SchoolClient.shared_elementary_school_id(), schoolYear=current_year(), sectionIdentifier="ELA012017RM555", - sessionName="2016-2017 Fall Semester", + sessionName=SESSION_NAME, ) ) studentReference = factory.Dict( @@ -278,7 +271,7 @@ class StudentSchoolAttendanceEventFactory(APIFactory): dict( schoolId=SchoolClient.shared_elementary_school_id(), # Prepopulated school schoolYear=2014, # Prepopulated schoolYear - sessionName="2016-2017 Fall Semester", # Default value for scenarios, but not in the DB + sessionName=SESSION_NAME, # Default value for scenarios, but not in the DB ) ) studentReference = factory.Dict( @@ -297,7 +290,7 @@ class StudentSectionAttendanceEventFactory(APIFactory): schoolId=SchoolClient.shared_elementary_school_id(), schoolYear=current_year(), sectionIdentifier="ELA012017RM555", - sessionName="2016-2017 Fall Semester", + sessionName=SESSION_NAME, ) ) studentReference = factory.Dict( @@ -336,7 +329,7 @@ class StudentCompetencyObjectiveFactory(APIFactory): ), ) ) - objectiveCompetencyObjectiveReference = factory.Dict( + competencyObjectiveReference = factory.Dict( dict( educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), # Prepopulated ed org objective=None, # Must be entered by the user @@ -357,11 +350,9 @@ class StudentCTEProgramAssociationFactory(APIFactory): ) # Prepopulated student programReference = factory.Dict( dict( + programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name), + programName=ProgramClient.shared_program_name, educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), - programTypeDescriptor=build_descriptor( - "ProgramType", ProgramClient.shared_program_name() - ), - programName=ProgramClient.shared_program_name(), ) ) # Prepopulated program beginDate = RandomDateAttribute() @@ -388,7 +379,7 @@ class StudentGradebookEntryFactory(APIFactory): schoolId=SchoolClient.shared_elementary_school_id(), schoolYear=current_year(), sectionIdentifier="ELA012017RM555", - sessionName="2016-2017 Fall Semester", + sessionName=SESSION_NAME, gradebookEntryTitle="ALG-1 - First Six Weeks - Homework - 20170821", dateAssigned=formatted_date(2, 2), ) @@ -399,7 +390,7 @@ class StudentGradebookEntryFactory(APIFactory): schoolId=SchoolClient.shared_elementary_school_id(), schoolYear=current_year(), sectionIdentifier="ELA012017RM555", - sessionName="2016-2017 Fall Semester", + sessionName=SESSION_NAME, studentUniqueId=111111, beginDate=formatted_date(5, 5), ) @@ -415,11 +406,9 @@ class StudentHomelessProgramAssociationFactory(APIFactory): ) # Prepopulated ed org programReference = factory.Dict( dict( + programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name), + programName=ProgramClient.shared_program_name, educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), - programTypeDescriptor=build_descriptor( - "ProgramType", ProgramClient.shared_program_name() - ), - programName=ProgramClient.shared_program_name(), ) ) # Prepopulated program studentReference = factory.Dict( diff --git a/src/edfi-performance-test/edfi_performance_test/factories/utils.py b/src/edfi-performance-test/edfi_performance_test/factories/utils.py index e21c768e..5ec9317a 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/utils.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/utils.py @@ -82,6 +82,15 @@ def evaluate(self, instance, step, extra): ) +def random_date_time() -> str: + """ + Returns a random date time between 1/1/1901 and 12/28/2050. Ignores days + of the month past the 28th. + """ + + return f"{random.randint(1901, 2050)}-{str(random.randint(1, 12)).zfill(2)}-{str(random.randint(1, 28)).zfill(2)}T15:00:00Z" + + class RandomSchoolYearAttribute(declarations.BaseDeclaration): """ Returns a random date between 1991 & 2050. diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/assessment.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/assessment.py index 533436ba..69b712c7 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/assessment.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/assessment.py @@ -9,7 +9,7 @@ class AssessmentPipecleanTest(EdFiPipecleanTestBase): - update_attribute_name = "title" + update_attribute_name = "assessmentTitle" update_attribute_value = "AP English 3" diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/class_period.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/class_period.py index 541fc91a..7a1af4fe 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/class_period.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/class_period.py @@ -10,5 +10,6 @@ class ClassPeriodPipecleanTest(EdFiPipecleanTestBase): + # This is an allowed natural key update, which should automatically cascade through the API without error update_attribute_name = "classPeriodName" update_attribute_value = RandomSuffixAttribute("Class Period 01", suffix_length=10) diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/competency_objective.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/competency_objective.py index 8f30867b..bebb840a 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/competency_objective.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/competency_objective.py @@ -9,5 +9,5 @@ class CompetencyObjectivePipecleanTest(EdFiPipecleanTestBase): - update_attribute_name = "objectiveGradeLevelDescriptor" - update_attribute_value = "Twelfth grade" + update_attribute_name = "successCriteria" + update_attribute_value = "ABCxyz" diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/descriptors.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/descriptors.py index 4538a5ce..0aab430d 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/descriptors.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/descriptors.py @@ -16,7 +16,7 @@ class DescriptorPipecleanTestBase(EdFiPipecleanTestBase): def __init__(self, descriptor: str, parent, *args, **kwargs): super(DescriptorPipecleanTestBase, self).__init__(parent, *args, **kwargs) - self.update_attribute_name = "codeValue" + self.update_attribute_name = "description" self.update_attribute_value = random_chars(15) self.namespace = f"{descriptor[0].upper()}{descriptor[1:]}" diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/education.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/education.py index 095adc57..c47e668f 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/education.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/education.py @@ -37,10 +37,7 @@ class EducationOrganizationNetworkAssociationPipecleanTest(EdFiPipecleanTestBase class EducationOrganizationPeerAssociationPipecleanTest(EdFiPipecleanTestBase): def _touch_put_endpoint(self, resource_id, default_attributes): - # This resource has no non-FK data attributes, so we'll update one of those - default_attributes["educationOrganizationReference"][ - "educationOrganizationId" - ] = SchoolClient.shared_elementary_school_id() + # This resource has no non-key attributes, so there is nothing to update self.update(resource_id, **default_attributes) @@ -50,7 +47,7 @@ class EducationServiceCenterPipecleanTest(EdFiPipecleanTestBase): class FeederSchoolAssociationPipecleanTest(EdFiPipecleanTestBase): - update_attribute_name = "beginDate" + update_attribute_name = "endDate" update_attribute_value = formatted_date(7, 4) diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/gradebook_entries.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/gradebook_entries.py index 1e572829..74e7dc76 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/gradebook_entries.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/gradebook_entries.py @@ -10,5 +10,6 @@ class GradebookEntryPipecleanTest(EdFiPipecleanTestBase): + # This is an allowed natural key update update_attribute_name = "dateAssigned" update_attribute_value = formatted_date(3, 3) diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/parent.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/parent.py index 000f26c0..e1001861 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/parent.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/parent.py @@ -10,7 +10,7 @@ class ParentPipecleanTest(EdFiPipecleanTestBase): - update_attribute_name = "parentOtherNames" + update_attribute_name = "otherNames" update_attribute_value = [ { "firstName": "Lexi", diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/post_secondary.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/post_secondary.py index 21b93fe2..2ab85765 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/post_secondary.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/post_secondary.py @@ -3,10 +3,10 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -from edfi_performance_test.factories.descriptors.utils import build_descriptor from edfi_performance_test.tasks.pipeclean.ed_fi_pipeclean_test_base import ( EdFiPipecleanTestBase, ) +import factory class PostSecondaryInstitutionPipecleanTest(EdFiPipecleanTestBase): @@ -15,7 +15,7 @@ class PostSecondaryInstitutionPipecleanTest(EdFiPipecleanTestBase): class PostSecondaryEventPipecleanTest(EdFiPipecleanTestBase): - update_attribute_name = "postSecondaryEventCategoryDescriptor" - update_attribute_value = build_descriptor( - "PostSecondaryEventCategory", "College Degree Received" + update_attribute_name = "postSecondaryInstitutionReference" + update_attribute_value = factory.Dict( + dict(postSecondaryInstitutionId=6000203) ) diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/program.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/program.py index 7bcb3d85..b44c6856 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/program.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/program.py @@ -10,5 +10,5 @@ class ProgramPipecleanTest(EdFiPipecleanTestBase): - update_attribute_name = "programTypeDescriptor" - update_attribute_value = build_descriptor("ProgramType", "Special Education") + update_attribute_name = "programId" + update_attribute_value = "xyz" diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/student.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/student.py index 2ac67171..28298ae7 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/student.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/student.py @@ -23,7 +23,8 @@ class StudentSchoolAssociationPipecleanTest(EdFiPipecleanTestBase): class StudentPipecleanTest(EdFiPipecleanTestBase): def _touch_put_endpoint(self, resource_id, attrs): - attrs["telephones"][0]["telephoneNumber"] = "111-222-4444" + if "telepphones" in attrs and len(attrs["telephones"]) > 0: + attrs["telephones"][0]["telephoneNumber"] = "111-222-4444" self.update(resource_id, **attrs) @@ -78,8 +79,8 @@ class StudentSectionAttendanceEventPipecleanTest(EdFiPipecleanTestBase): class StudentAcademicRecordPipecleanTest(EdFiPipecleanTestBase): - update_attribute_name = "termDescriptor" - update_attribute_value = build_descriptor("Term", "Spring Semester") + update_attribute_name = "cumulativeAttemptedCredits" + update_attribute_value = 7 class StudentCompetencyObjectivePipecleanTest(EdFiPipecleanTestBase): From ee8a40487f1e0e08db90a71c22b1e228d4c31437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andony=20Nu=C3=B1ez?= Date: Wed, 7 Jun 2023 08:23:51 -0600 Subject: [PATCH 11/19] [RND-533] Skipping total count request when there was a failure to avoid double error --- .../edfi_paging_test/performance_tester.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/edfi-paging-test/edfi_paging_test/performance_tester.py b/src/edfi-paging-test/edfi_paging_test/performance_tester.py index e894bb2d..c1965002 100644 --- a/src/edfi-paging-test/edfi_paging_test/performance_tester.py +++ b/src/edfi-paging-test/edfi_paging_test/performance_tester.py @@ -48,12 +48,14 @@ def _generate_output_reports(args: MainArguments) -> None: def fetch_resource(request_client: RequestClient, target_resource: str) -> None: resources = request_client.get_all(target_resource) - total_count = request_client.get_total(target_resource) - if len(resources) != total_count: - logger.warn( - f"{target_resource}: expected {total_count} results, got: {len(resources)}" - ) + if('error' not in resources): + total_count = request_client.get_total(target_resource) + + if len(resources) != total_count: + logger.warn( + f"{target_resource}: expected {total_count} results, got: {len(resources)}" + ) def invalid_resources( From 8794e5d06b8ccfd286e4e39a93616fee5030e0f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andony=20Nu=C3=B1ez?= Date: Fri, 9 Jun 2023 16:39:36 -0600 Subject: [PATCH 12/19] Fixing poetry lock after merge --- src/edfi-performance-test/poetry.lock | 1717 ++++++++++++------------- 1 file changed, 823 insertions(+), 894 deletions(-) diff --git a/src/edfi-performance-test/poetry.lock b/src/edfi-performance-test/poetry.lock index 191aa460..b0d589ef 100644 --- a/src/edfi-performance-test/poetry.lock +++ b/src/edfi-performance-test/poetry.lock @@ -1,840 +1,30 @@ +# This file is automatically @generated by Poetry 1.5.1 and should not be changed by hand. + [[package]] name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] - -[[package]] -name = "black" -version = "22.12.0" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -click = ">=8.0.0" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.9.0" -platformdirs = ">=2" -tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} -typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.7.4)"] -jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "blinker" -version = "1.6.2" -description = "Fast, simple object-to-object and broadcast signaling" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "brotli" -version = "1.0.9" -description = "Python bindings for the Brotli compression library" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "certifi" -version = "2023.5.7" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = ">=3.6" - -[[package]] -name = "cffi" -version = "1.15.1" -description = "Foreign Function Interface for Python calling C code." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "3.1.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" -optional = false -python-versions = ">=3.7.0" - -[[package]] -name = "click" -version = "8.1.3" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" - -[[package]] -name = "configargparse" -version = "1.5.3" -description = "A drop-in replacement for argparse that allows options to also be set via config files and/or environment variables." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[package.extras] -test = ["PyYAML", "mock", "pytest"] -yaml = ["PyYAML"] - -[[package]] -name = "coverage" -version = "6.5.0" -description = "Code coverage measurement for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -toml = ["tomli"] - -[[package]] -name = "errorhandler" -version = "2.0.1" -description = "A logging framework handler that tracks when messages above a certain level have been logged." -category = "main" -optional = false -python-versions = "*" - -[package.extras] -build = ["pkginfo", "setuptools-git", "sphinx", "twine", "wheel"] -test = ["coveralls", "nose", "nose-cov", "nose-fixes"] - -[[package]] -name = "exceptiongroup" -version = "1.1.1" -description = "Backport of PEP 654 (exception groups)" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "factory-boy" -version = "3.2.1" -description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -Faker = ">=0.7.0" - -[package.extras] -dev = ["Django", "Pillow", "SQLAlchemy", "coverage", "flake8", "isort", "mongoengine", "tox", "wheel (>=0.32.0)", "zest.releaser[recommended]"] -doc = ["Sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] - -[[package]] -name = "faker" -version = "18.9.0" -description = "Faker is a Python package that generates fake data for you." -category = "main" optional = false python-versions = ">=3.7" - -[package.dependencies] -python-dateutil = ">=2.4" - -[[package]] -name = "flake8" -version = "4.0.1" -description = "the modular source code checker: pep8 pyflakes and co" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -mccabe = ">=0.6.0,<0.7.0" -pycodestyle = ">=2.8.0,<2.9.0" -pyflakes = ">=2.4.0,<2.5.0" - -[[package]] -name = "flask" -version = "2.3.2" -description = "A simple framework for building complex web applications." -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -blinker = ">=1.6.2" -click = ">=8.1.3" -importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} -itsdangerous = ">=2.1.2" -Jinja2 = ">=3.1.2" -Werkzeug = ">=2.3.3" - -[package.extras] -async = ["asgiref (>=3.2)"] -dotenv = ["python-dotenv"] - -[[package]] -name = "flask-basicauth" -version = "0.2.0" -description = "HTTP basic access authentication for Flask." -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -Flask = "*" - -[[package]] -name = "flask-cors" -version = "3.0.10" -description = "A Flask extension adding a decorator for CORS support" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -Flask = ">=0.9" -Six = "*" - -[[package]] -name = "furl" -version = "2.1.3" -description = "URL manipulation made simple." -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -orderedmultidict = ">=1.0.1" -six = ">=1.8.0" - -[[package]] -name = "gevent" -version = "22.10.2" -description = "Coroutine-based network library" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5" - -[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\""} -setuptools = "*" -"zope.event" = "*" -"zope.interface" = "*" - -[package.extras] -dnspython = ["dnspython (>=1.16.0,<2.0)", "idna"] -docs = ["repoze.sphinx.autointerface", "sphinxcontrib-programoutput", "zope.schema"] -monitor = ["psutil (>=5.7.0)"] -recommended = ["backports.socketpair", "cffi (>=1.12.2)", "dnspython (>=1.16.0,<2.0)", "idna", "psutil (>=5.7.0)", "selectors2"] -test = ["backports.socketpair", "cffi (>=1.12.2)", "contextvars (==2.4)", "coverage (>=5.0)", "coveralls (>=1.7.0)", "dnspython (>=1.16.0,<2.0)", "futures", "idna", "mock", "objgraph", "psutil (>=5.7.0)", "requests", "selectors2"] - -[[package]] -name = "geventhttpclient" -version = "2.0.9" -description = "http client library for gevent" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -brotli = "*" -certifi = "*" -gevent = ">=0.13" -six = "*" - -[[package]] -name = "greenlet" -version = "2.0.2" -description = "Lightweight in-process concurrent programming" -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" - -[package.extras] -docs = ["Sphinx", "docutils (<0.18)"] -test = ["objgraph", "psutil"] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "importlib-metadata" -version = "6.6.0" -description = "Read metadata from Python packages" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -zipp = ">=0.5" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -perf = ["ipython"] -testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "itsdangerous" -version = "2.1.2" -description = "Safely pass data to untrusted environments and back." -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "jinja2" -version = "3.1.2" -description = "A very fast and expressive template engine." -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -MarkupSafe = ">=2.0" - -[package.extras] -i18n = ["Babel (>=2.7)"] - -[[package]] -name = "jsonschema" -version = "4.17.3" -description = "An implementation of JSON Schema validation for Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -attrs = ">=17.4.0" -pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" - -[package.extras] -format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] -format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] - -[[package]] -name = "locust" -version = "2.15.1" -description = "Developer friendly load testing framework" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -ConfigArgParse = ">=1.0" -flask = ">=2.0.0" -Flask-BasicAuth = ">=0.2.0" -Flask-Cors = ">=3.0.10" -gevent = ">=20.12.1" -geventhttpclient = ">=2.0.2" -msgpack = ">=0.6.2" -psutil = ">=5.6.7" -pywin32 = {version = "*", markers = "platform_system == \"Windows\""} -pyzmq = ">=22.2.1,<23.0.0 || >23.0.0" -requests = ">=2.23.0" -roundrobin = ">=0.0.2" -typing-extensions = ">=3.7.4.3" -Werkzeug = ">=2.0.0" - -[[package]] -name = "markupsafe" -version = "2.1.2" -description = "Safely add untrusted strings to HTML/XML markup." -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "mccabe" -version = "0.6.1" -description = "McCabe checker, plugin for flake8" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "msgpack" -version = "1.0.5" -description = "MessagePack serializer" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "mypy" -version = "0.931" -description = "Optional static typing for Python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -mypy-extensions = ">=0.4.3" -tomli = ">=1.1.0" -typing-extensions = ">=3.10" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -python2 = ["typed-ast (>=1.4.0,<2)"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "numpy" -version = "1.24.3" -description = "Fundamental package for array computing in Python" -category = "main" -optional = false -python-versions = ">=3.8" - -[[package]] -name = "orderedmultidict" -version = "1.0.1" -description = "Ordered Multivalue Dictionary" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -six = ">=1.8.0" - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "pandas" -version = "1.5.3" -description = "Powerful data structures for data analysis, time series, and statistics" -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -numpy = [ - {version = ">=1.20.3", markers = "python_version < \"3.10\""}, - {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, - {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, -] -python-dateutil = ">=2.8.1" -pytz = ">=2020.1" - -[package.extras] -test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] - -[[package]] -name = "pathspec" -version = "0.11.1" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "platformdirs" -version = "3.5.1" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] - -[[package]] -name = "pluggy" -version = "1.0.0" -description = "plugin and hook calling mechanisms for python" -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "pook" -version = "1.1.1" -description = "HTTP traffic mocking and expectations made easy" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -furl = ">=0.5.6" -jsonschema = ">=2.5.1" -xmltodict = ">=0.11.0" - -[[package]] -name = "psutil" -version = "5.9.5" -description = "Cross-platform lib for process and system monitoring in Python." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[package.extras] -test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] - -[[package]] -name = "pycodestyle" -version = "2.8.0" -description = "Python style guide checker" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pyfakefs" -version = "4.7.0" -description = "pyfakefs implements a fake file system that mocks the Python file system modules." -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "pyflakes" -version = "2.4.0" -description = "passive checker of Python programs" -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "pyrsistent" -version = "0.19.3" -description = "Persistent/Functional/Immutable data structures" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "pytest" -version = "7.3.1" -description = "pytest: simple powerful testing with Python" -category = "dev" -optional = false -python-versions = ">=3.7" - -[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", "xmlschema"] - -[[package]] -name = "pytest-describe" -version = "2.1.0" -description = "Describe-style plugin for pytest" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -pytest = ">=4.6,<8" - -[[package]] -name = "pytest-mock" -version = "3.10.0" -description = "Thin-wrapper around the mock package for easier use with pytest" -category = "dev" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -pytest = ">=5.0" - -[package.extras] -dev = ["pre-commit", "pytest-asyncio", "tox"] - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-dotenv" -version = "0.20.0" -description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" -optional = false -python-versions = ">=3.5" - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "pytz" -version = "2023.3" -description = "World timezone definitions, modern and historical" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pywin32" -version = "306" -description = "Python for Window Extensions" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "pyzmq" -version = "25.0.2" -description = "Python bindings for 0MQ" -category = "main" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -cffi = {version = "*", markers = "implementation_name == \"pypy\""} - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "roundrobin" -version = "0.0.4" -description = "Collection of roundrobin utilities" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "setuptools" -version = "67.8.0" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "dev" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "types-requests" -version = "2.31.0.0" -description = "Typing stubs for requests" -category = "dev" -optional = false -python-versions = "*" - -[package.dependencies] -types-urllib3 = "*" - -[[package]] -name = "types-urllib3" -version = "1.26.25.13" -description = "Typing stubs for urllib3" -category = "dev" -optional = false -python-versions = "*" - -[[package]] -name = "typing-extensions" -version = "4.6.2" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "urllib3" -version = "1.26.16" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[package.extras] -brotli = ["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)"] - -[[package]] -name = "werkzeug" -version = "2.3.4" -description = "The comprehensive WSGI web application library." -category = "main" -optional = false -python-versions = ">=3.8" - -[package.dependencies] -MarkupSafe = ">=2.1.1" - -[package.extras] -watchdog = ["watchdog (>=2.3)"] - -[[package]] -name = "xmltodict" -version = "0.13.0" -description = "Makes working with XML feel like you are working with JSON" -category = "dev" -optional = false -python-versions = ">=3.4" - -[[package]] -name = "zipp" -version = "3.15.0" -description = "Backport of pathlib-compatible object wrapper for zip files" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] -testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] - -[[package]] -name = "zope-event" -version = "4.6" -description = "Very basic event publishing system" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -setuptools = "*" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] [package.extras] -docs = ["Sphinx"] -test = ["zope.testrunner"] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] [[package]] -name = "zope-interface" -version = "6.0" -description = "Interfaces for Python" -category = "main" +name = "black" +version = "22.12.0" +description = "The uncompromising code formatter." optional = false python-versions = ">=3.7" - -[package.dependencies] -setuptools = "*" - -[package.extras] -docs = ["Sphinx", "repoze.sphinx.autointerface"] -test = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] -testing = ["coverage (>=5.0.3)", "zope.event", "zope.testing"] - -[metadata] -lock-version = "1.1" -python-versions = "^3.9" -content-hash = "385cb07d3e8611f2df27b2c2b2e735c2244b54b3798dcf5af66a6521bb2a3cac" - -[metadata.files] -attrs = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] -black = [ +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"}, @@ -848,11 +38,39 @@ black = [ {file = "black-22.12.0-py3-none-any.whl", hash = "sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf"}, {file = "black-22.12.0.tar.gz", hash = "sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f"}, ] -blinker = [ + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_full_version < \"3.11.0a7\""} +typing-extensions = {version = ">=3.10.0.0", markers = "python_version < \"3.10\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "blinker" +version = "1.6.2" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = ">=3.7" +files = [ {file = "blinker-1.6.2-py3-none-any.whl", hash = "sha256:c3d739772abb7bc2860abf5f2ec284223d9ad5c76da018234f6f50d6f31ab1f0"}, {file = "blinker-1.6.2.tar.gz", hash = "sha256:4afd3de66ef3a9f8067559fb7a1cbe555c17dcbe15971b05d1b625c3e7abe213"}, ] -brotli = [ + +[[package]] +name = "brotli" +version = "1.0.9" +description = "Python bindings for the Brotli compression library" +optional = false +python-versions = "*" +files = [ {file = "Brotli-1.0.9-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:268fe94547ba25b58ebc724680609c8ee3e5a843202e9a381f6f9c5e8bdb5c70"}, {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:c2415d9d082152460f2bd4e382a1e85aed233abc92db5a3880da2257dc7daf7b"}, {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5913a1177fc36e30fcf6dc868ce23b0453952c78c04c266d3149b3d39e1410d6"}, @@ -936,11 +154,25 @@ brotli = [ {file = "Brotli-1.0.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c8e521a0ce7cf690ca84b8cc2272ddaf9d8a50294fd086da67e517439614c755"}, {file = "Brotli-1.0.9.zip", hash = "sha256:4d1b810aa0ed773f81dceda2cc7b403d01057458730e309856356d4ef4188438"}, ] -certifi = [ + +[[package]] +name = "certifi" +version = "2023.5.7" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ {file = "certifi-2023.5.7-py3-none-any.whl", hash = "sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"}, {file = "certifi-2023.5.7.tar.gz", hash = "sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7"}, ] -cffi = [ + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, @@ -1006,7 +238,17 @@ cffi = [ {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, ] -charset-normalizer = [ + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.1.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ {file = "charset-normalizer-3.1.0.tar.gz", hash = "sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5"}, {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b"}, {file = "charset_normalizer-3.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60"}, @@ -1083,19 +325,54 @@ charset-normalizer = [ {file = "charset_normalizer-3.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b"}, {file = "charset_normalizer-3.1.0-py3-none-any.whl", hash = "sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d"}, ] -click = [ + +[[package]] +name = "click" +version = "8.1.3" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, ] -colorama = [ + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] -configargparse = [ + +[[package]] +name = "configargparse" +version = "1.5.3" +description = "A drop-in replacement for argparse that allows options to also be set via config files and/or environment variables." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ {file = "ConfigArgParse-1.5.3-py3-none-any.whl", hash = "sha256:18f6535a2db9f6e02bd5626cc7455eac3e96b9ab3d969d366f9aafd5c5c00fe7"}, {file = "ConfigArgParse-1.5.3.tar.gz", hash = "sha256:1b0b3cbf664ab59dada57123c81eff3d9737e0d11d8cf79e3d6eb10823f1739f"}, ] -coverage = [ + +[package.extras] +test = ["PyYAML", "mock", "pytest"] +yaml = ["PyYAML"] + +[[package]] +name = "coverage" +version = "6.5.0" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.7" +files = [ {file = "coverage-6.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef8674b0ee8cc11e2d574e3e2998aea5df5ab242e012286824ea3c6970580e53"}, {file = "coverage-6.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:784f53ebc9f3fd0e2a3f6a78b2be1bd1f5575d7863e10c6e12504f240fd06660"}, {file = "coverage-6.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b4a5be1748d538a710f87542f22c2cad22f80545a847ad91ce45e77417293eb4"}, @@ -1147,42 +424,160 @@ coverage = [ {file = "coverage-6.5.0-pp36.pp37.pp38-none-any.whl", hash = "sha256:1431986dac3923c5945271f169f59c45b8802a114c8f548d611f2015133df77a"}, {file = "coverage-6.5.0.tar.gz", hash = "sha256:f642e90754ee3e06b0e7e51bce3379590e76b7f76b708e1a71ff043f87025c84"}, ] -errorhandler = [ + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "errorhandler" +version = "2.0.1" +description = "A logging framework handler that tracks when messages above a certain level have been logged." +optional = false +python-versions = "*" +files = [ {file = "errorhandler-2.0.1-py2.py3-none-any.whl", hash = "sha256:dc6c54f5d9a4599e744b57aac2f925cce873188e9b02cae7c0eb120ee08a893f"}, {file = "errorhandler-2.0.1.tar.gz", hash = "sha256:7e578ad67af40845bfd044f71627a29f1fc436d53ccb058bbf1792ef31ab6163"}, ] -exceptiongroup = [ + +[package.extras] +build = ["pkginfo", "setuptools-git", "sphinx", "twine", "wheel"] +test = ["coveralls", "nose", "nose-cov", "nose-fixes"] + +[[package]] +name = "exceptiongroup" +version = "1.1.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ {file = "exceptiongroup-1.1.1-py3-none-any.whl", hash = "sha256:232c37c63e4f682982c8b6459f33a8981039e5fb8756b2074364e5055c498c9e"}, {file = "exceptiongroup-1.1.1.tar.gz", hash = "sha256:d484c3090ba2889ae2928419117447a14daf3c1231d5e30d0aae34f354f01785"}, ] -factory-boy = [ + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "factory-boy" +version = "3.2.1" +description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." +optional = false +python-versions = ">=3.6" +files = [ {file = "factory_boy-3.2.1-py2.py3-none-any.whl", hash = "sha256:eb02a7dd1b577ef606b75a253b9818e6f9eaf996d94449c9d5ebb124f90dc795"}, {file = "factory_boy-3.2.1.tar.gz", hash = "sha256:a98d277b0c047c75eb6e4ab8508a7f81fb03d2cb21986f627913546ef7a2a55e"}, ] -faker = [ + +[package.dependencies] +Faker = ">=0.7.0" + +[package.extras] +dev = ["Django", "Pillow", "SQLAlchemy", "coverage", "flake8", "isort", "mongoengine", "tox", "wheel (>=0.32.0)", "zest.releaser[recommended]"] +doc = ["Sphinx", "sphinx-rtd-theme", "sphinxcontrib-spelling"] + +[[package]] +name = "faker" +version = "18.9.0" +description = "Faker is a Python package that generates fake data for you." +optional = false +python-versions = ">=3.7" +files = [ {file = "Faker-18.9.0-py3-none-any.whl", hash = "sha256:defe9ed618a67ebf0f3eb1895e198c2355a7128a09087a6dce342ef2253263ea"}, {file = "Faker-18.9.0.tar.gz", hash = "sha256:80a5ea1464556c06b98bf47ea3adc7f33811a1182518d847860b1874080bd3c9"}, ] -flake8 = [ + +[package.dependencies] +python-dateutil = ">=2.4" + +[[package]] +name = "flake8" +version = "4.0.1" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.6" +files = [ {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, ] -flask = [ + +[package.dependencies] +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" + +[[package]] +name = "flask" +version = "2.3.2" +description = "A simple framework for building complex web applications." +optional = false +python-versions = ">=3.8" +files = [ {file = "Flask-2.3.2-py3-none-any.whl", hash = "sha256:77fd4e1249d8c9923de34907236b747ced06e5467ecac1a7bb7115ae0e9670b0"}, {file = "Flask-2.3.2.tar.gz", hash = "sha256:8c2f9abd47a9e8df7f0c3f091ce9497d011dc3b31effcf4c85a6e2b50f4114ef"}, ] -flask-basicauth = [ + +[package.dependencies] +blinker = ">=1.6.2" +click = ">=8.1.3" +importlib-metadata = {version = ">=3.6.0", markers = "python_version < \"3.10\""} +itsdangerous = ">=2.1.2" +Jinja2 = ">=3.1.2" +Werkzeug = ">=2.3.3" + +[package.extras] +async = ["asgiref (>=3.2)"] +dotenv = ["python-dotenv"] + +[[package]] +name = "flask-basicauth" +version = "0.2.0" +description = "HTTP basic access authentication for Flask." +optional = false +python-versions = "*" +files = [ {file = "Flask-BasicAuth-0.2.0.tar.gz", hash = "sha256:df5ebd489dc0914c224419da059d991eb72988a01cdd4b956d52932ce7d501ff"}, ] -flask-cors = [ + +[package.dependencies] +Flask = "*" + +[[package]] +name = "flask-cors" +version = "3.0.10" +description = "A Flask extension adding a decorator for CORS support" +optional = false +python-versions = "*" +files = [ {file = "Flask-Cors-3.0.10.tar.gz", hash = "sha256:b60839393f3b84a0f3746f6cdca56c1ad7426aa738b70d6c61375857823181de"}, {file = "Flask_Cors-3.0.10-py2.py3-none-any.whl", hash = "sha256:74efc975af1194fc7891ff5cd85b0f7478be4f7f59fe158102e91abb72bb4438"}, ] -furl = [ + +[package.dependencies] +Flask = ">=0.9" +Six = "*" + +[[package]] +name = "furl" +version = "2.1.3" +description = "URL manipulation made simple." +optional = false +python-versions = "*" +files = [ {file = "furl-2.1.3-py2.py3-none-any.whl", hash = "sha256:9ab425062c4217f9802508e45feb4a83e54324273ac4b202f1850363309666c0"}, {file = "furl-2.1.3.tar.gz", hash = "sha256:5a6188fe2666c484a12159c18be97a1977a71d632ef5bb867ef15f54af39cc4e"}, ] -gevent = [ + +[package.dependencies] +orderedmultidict = ">=1.0.1" +six = ">=1.8.0" + +[[package]] +name = "gevent" +version = "22.10.2" +description = "Coroutine-based network library" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5" +files = [ {file = "gevent-22.10.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:97cd42382421779f5d82ec5007199e8a84aa288114975429e4fd0a98f2290f10"}, {file = "gevent-22.10.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:1e1286a76f15b5e15f1e898731d50529e249529095a032453f2c101af3fde71c"}, {file = "gevent-22.10.2-cp27-cp27m-win32.whl", hash = "sha256:59b47e81b399d49a5622f0f503c59f1ce57b7705306ea0196818951dfc2f36c8"}, @@ -1236,7 +631,28 @@ gevent = [ {file = "gevent-22.10.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a47a4e77e2bc668856aad92a0b8de7ee10768258d93cd03968e6c7ba2e832f76"}, {file = "gevent-22.10.2.tar.gz", hash = "sha256:1ca01da176ee37b3527a2702f7d40dbc9ffb8cfc7be5a03bfa4f9eec45e55c46"}, ] -geventhttpclient = [ + +[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\""} +setuptools = "*" +"zope.event" = "*" +"zope.interface" = "*" + +[package.extras] +dnspython = ["dnspython (>=1.16.0,<2.0)", "idna"] +docs = ["repoze.sphinx.autointerface", "sphinxcontrib-programoutput", "zope.schema"] +monitor = ["psutil (>=5.7.0)"] +recommended = ["backports.socketpair", "cffi (>=1.12.2)", "dnspython (>=1.16.0,<2.0)", "idna", "psutil (>=5.7.0)", "selectors2"] +test = ["backports.socketpair", "cffi (>=1.12.2)", "contextvars (==2.4)", "coverage (>=5.0)", "coveralls (>=1.7.0)", "dnspython (>=1.16.0,<2.0)", "futures", "idna", "mock", "objgraph", "psutil (>=5.7.0)", "requests", "selectors2"] + +[[package]] +name = "geventhttpclient" +version = "2.0.9" +description = "http client library for gevent" +optional = false +python-versions = "*" +files = [ {file = "geventhttpclient-2.0.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f4dcd420c74f68ffc493abdc0964583f762e0f03c9ccd62b8dcfa589f8cabe49"}, {file = "geventhttpclient-2.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe8766994434ed6dc807d2e5726e9cec536b5593885b50598fe763908242054"}, {file = "geventhttpclient-2.0.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c23aacbe40f767d4bfb4215b51302d68f9611f2e730521e65c7239854177c30f"}, @@ -1328,7 +744,20 @@ geventhttpclient = [ {file = "geventhttpclient-2.0.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:dc75486b0847c185856f981b728a2bbfe09e8a754676e57a8549660157918d2f"}, {file = "geventhttpclient-2.0.9.tar.gz", hash = "sha256:8abc39d346e923bd6a7b405d38dd01e19146594b6304032f382eda8b0f631513"}, ] -greenlet = [ + +[package.dependencies] +brotli = "*" +certifi = "*" +gevent = ">=0.13" +six = "*" + +[[package]] +name = "greenlet" +version = "2.0.2" +description = "Lightweight in-process concurrent programming" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ {file = "greenlet-2.0.2-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:bdfea8c661e80d3c1c99ad7c3ff74e6e87184895bbaca6ee8cc61209f8b9b85d"}, {file = "greenlet-2.0.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9d14b83fab60d5e8abe587d51c75b252bcc21683f24699ada8fb275d7712f5a9"}, {file = "greenlet-2.0.2-cp27-cp27m-win32.whl", hash = "sha256:6c3acb79b0bfd4fe733dff8bc62695283b57949ebcca05ae5c129eb606ff2d74"}, @@ -1390,35 +819,133 @@ greenlet = [ {file = "greenlet-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:db1a39669102a1d8d12b57de2bb7e2ec9066a6f2b3da35ae511ff93b01b5d564"}, {file = "greenlet-2.0.2.tar.gz", hash = "sha256:e7c8dc13af7db097bed64a051d2dd49e9f0af495c26995c00a9ee842690d34c0"}, ] -idna = [ + +[package.extras] +docs = ["Sphinx", "docutils (<0.18)"] +test = ["objgraph", "psutil"] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, ] -importlib-metadata = [ + +[[package]] +name = "importlib-metadata" +version = "6.6.0" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.7" +files = [ {file = "importlib_metadata-6.6.0-py3-none-any.whl", hash = "sha256:43dd286a2cd8995d5eaef7fee2066340423b818ed3fd70adf0bad5f1fac53fed"}, {file = "importlib_metadata-6.6.0.tar.gz", hash = "sha256:92501cdf9cc66ebd3e612f1b4f0c0765dfa42f0fa38ffb319b6bd84dd675d705"}, ] -iniconfig = [ + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, ] -itsdangerous = [ + +[[package]] +name = "itsdangerous" +version = "2.1.2" +description = "Safely pass data to untrusted environments and back." +optional = false +python-versions = ">=3.7" +files = [ {file = "itsdangerous-2.1.2-py3-none-any.whl", hash = "sha256:2c2349112351b88699d8d4b6b075022c0808887cb7ad10069318a8b0bc88db44"}, {file = "itsdangerous-2.1.2.tar.gz", hash = "sha256:5dbbc68b317e5e42f327f9021763545dc3fc3bfe22e6deb96aaf1fc38874156a"}, ] -jinja2 = [ + +[[package]] +name = "jinja2" +version = "3.1.2" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, ] -jsonschema = [ + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jsonschema" +version = "4.17.3" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.7" +files = [ {file = "jsonschema-4.17.3-py3-none-any.whl", hash = "sha256:a870ad254da1a8ca84b6a2905cac29d265f805acc57af304784962a2aa6508f6"}, {file = "jsonschema-4.17.3.tar.gz", hash = "sha256:0f864437ab8b6076ba6707453ef8f98a6a0d512a80e93f8abdb676f737ecb60d"}, ] -locust = [ + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0,<0.17.0 || >0.17.0,<0.17.1 || >0.17.1,<0.17.2 || >0.17.2" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "locust" +version = "2.15.1" +description = "Developer friendly load testing framework" +optional = false +python-versions = ">=3.7" +files = [ {file = "locust-2.15.1-py3-none-any.whl", hash = "sha256:9e0bb30b4962f9c9611174df0fdea2a4e3f41656b36dc7b0a1a46f618a83d5a9"}, {file = "locust-2.15.1.tar.gz", hash = "sha256:a6307f3bf995c180f66e7caed94360b8c8ed95d64dca508614d803d5b0b39f15"}, ] -markupsafe = [ + +[package.dependencies] +ConfigArgParse = ">=1.0" +flask = ">=2.0.0" +Flask-BasicAuth = ">=0.2.0" +Flask-Cors = ">=3.0.10" +gevent = ">=20.12.1" +geventhttpclient = ">=2.0.2" +msgpack = ">=0.6.2" +psutil = ">=5.6.7" +pywin32 = {version = "*", markers = "platform_system == \"Windows\""} +pyzmq = ">=22.2.1,<23.0.0 || >23.0.0" +requests = ">=2.23.0" +roundrobin = ">=0.0.2" +typing-extensions = ">=3.7.4.3" +Werkzeug = ">=2.0.0" + +[[package]] +name = "markupsafe" +version = "2.1.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:665a36ae6f8f20a4676b53224e33d456a6f5a72657d9c83c2aa00765072f31f7"}, {file = "MarkupSafe-2.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:340bea174e9761308703ae988e982005aedf427de816d1afe98147668cc03036"}, {file = "MarkupSafe-2.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22152d00bf4a9c7c83960521fc558f55a1adbc0631fbb00a9471e097b19d72e1"}, @@ -1470,11 +997,25 @@ markupsafe = [ {file = "MarkupSafe-2.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:0576fe974b40a400449768941d5d0858cc624e3249dfd1e0c33674e5c7ca7aed"}, {file = "MarkupSafe-2.1.2.tar.gz", hash = "sha256:abcabc8c2b26036d62d4c746381a6f7cf60aafcc653198ad678306986b09450d"}, ] -mccabe = [ + +[[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"}, ] -msgpack = [ + +[[package]] +name = "msgpack" +version = "1.0.5" +description = "MessagePack serializer" +optional = false +python-versions = "*" +files = [ {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9"}, {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198"}, {file = "msgpack-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81"}, @@ -1539,7 +1080,14 @@ msgpack = [ {file = "msgpack-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164"}, {file = "msgpack-1.0.5.tar.gz", hash = "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c"}, ] -mypy = [ + +[[package]] +name = "mypy" +version = "0.931" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.6" +files = [ {file = "mypy-0.931-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c5b42d0815e15518b1f0990cff7a705805961613e701db60387e6fb663fe78a"}, {file = "mypy-0.931-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c89702cac5b302f0c5d33b172d2b55b5df2bede3344a2fbed99ff96bddb2cf00"}, {file = "mypy-0.931-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:300717a07ad09525401a508ef5d105e6b56646f7942eb92715a1c8d610149714"}, @@ -1561,11 +1109,34 @@ mypy = [ {file = "mypy-0.931-py3-none-any.whl", hash = "sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d"}, {file = "mypy-0.931.tar.gz", hash = "sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce"}, ] -mypy-extensions = [ + +[package.dependencies] +mypy-extensions = ">=0.4.3" +tomli = ">=1.1.0" +typing-extensions = ">=3.10" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +python2 = ["typed-ast (>=1.4.0,<2)"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, ] -numpy = [ + +[[package]] +name = "numpy" +version = "1.24.3" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.8" +files = [ {file = "numpy-1.24.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c1104d3c036fb81ab923f507536daedc718d0ad5a8707c6061cdfd6d184e570"}, {file = "numpy-1.24.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:202de8f38fc4a45a3eea4b63e2f376e5f2dc64ef0fa692838e31a808520efaf7"}, {file = "numpy-1.24.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8535303847b89aa6b0f00aa1dc62867b5a32923e4d1681a35b5eef2d9591a463"}, @@ -1595,15 +1166,39 @@ numpy = [ {file = "numpy-1.24.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:35400e6a8d102fd07c71ed7dcadd9eb62ee9a6e84ec159bd48c28235bbb0f8e4"}, {file = "numpy-1.24.3.tar.gz", hash = "sha256:ab344f1bf21f140adab8e47fdbc7c35a477dc01408791f8ba00d018dd0bc5155"}, ] -orderedmultidict = [ + +[[package]] +name = "orderedmultidict" +version = "1.0.1" +description = "Ordered Multivalue Dictionary" +optional = false +python-versions = "*" +files = [ {file = "orderedmultidict-1.0.1-py2.py3-none-any.whl", hash = "sha256:43c839a17ee3cdd62234c47deca1a8508a3f2ca1d0678a3bf791c87cf84adbf3"}, {file = "orderedmultidict-1.0.1.tar.gz", hash = "sha256:04070bbb5e87291cc9bfa51df413677faf2141c73c61d2a5f7b26bea3cd882ad"}, ] -packaging = [ + +[package.dependencies] +six = ">=1.8.0" + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, ] -pandas = [ + +[[package]] +name = "pandas" +version = "1.5.3" +description = "Powerful data structures for data analysis, time series, and statistics" +optional = false +python-versions = ">=3.8" +files = [ {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3749077d86e3a2f0ed51367f30bf5b82e131cc0f14260c4d3e499186fccc4406"}, {file = "pandas-1.5.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:972d8a45395f2a2d26733eb8d0f629b2f90bebe8e8eddbb8829b180c09639572"}, {file = "pandas-1.5.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:50869a35cbb0f2e0cd5ec04b191e7b12ed688874bd05dd777c19b28cbea90996"}, @@ -1632,23 +1227,83 @@ pandas = [ {file = "pandas-1.5.3-cp39-cp39-win_amd64.whl", hash = "sha256:dfd681c5dc216037e0b0a2c821f5ed99ba9f03ebcf119c7dac0e9a7b960b9ec9"}, {file = "pandas-1.5.3.tar.gz", hash = "sha256:74a3fd7e5a7ec052f183273dc7b0acd3a863edf7520f5d3a1765c04ffdb3b0b1"}, ] -pathspec = [ + +[package.dependencies] +numpy = [ + {version = ">=1.20.3", markers = "python_version < \"3.10\""}, + {version = ">=1.21.0", markers = "python_version >= \"3.10\""}, + {version = ">=1.23.2", markers = "python_version >= \"3.11\""}, +] +python-dateutil = ">=2.8.1" +pytz = ">=2020.1" + +[package.extras] +test = ["hypothesis (>=5.5.3)", "pytest (>=6.0)", "pytest-xdist (>=1.31)"] + +[[package]] +name = "pathspec" +version = "0.11.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +files = [ {file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, {file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, ] -platformdirs = [ + +[[package]] +name = "platformdirs" +version = "3.5.1" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ {file = "platformdirs-3.5.1-py3-none-any.whl", hash = "sha256:e2378146f1964972c03c085bb5662ae80b2b8c06226c54b2ff4aa9483e8a13a5"}, {file = "platformdirs-3.5.1.tar.gz", hash = "sha256:412dae91f52a6f84830f39a8078cecd0e866cb72294a5c66808e74d5e88d251f"}, ] -pluggy = [ + +[package.extras] +docs = ["furo (>=2023.3.27)", "proselint (>=0.13)", "sphinx (>=6.2.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4)", "pytest-mock (>=3.10)"] + +[[package]] +name = "pluggy" +version = "1.0.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.6" +files = [ {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, ] -pook = [ + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pook" +version = "1.1.1" +description = "HTTP traffic mocking and expectations made easy" +optional = false +python-versions = "*" +files = [ {file = "pook-1.1.1-py3-none-any.whl", hash = "sha256:0bf4f8b53739e165722263c894a27140cf7f3ae6e7a378e4cbf48fdca4abe037"}, {file = "pook-1.1.1.tar.gz", hash = "sha256:53da04930616d94eeede77a39d6b5f0fac1f7bbd160d8f54bc468cd798b93956"}, ] -psutil = [ + +[package.dependencies] +furl = ">=0.5.6" +jsonschema = ">=2.5.1" +xmltodict = ">=0.11.0" + +[[package]] +name = "psutil" +version = "5.9.5" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ {file = "psutil-5.9.5-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:be8929ce4313f9f8146caad4272f6abb8bf99fc6cf59344a3167ecd74f4f203f"}, {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ab8ed1a1d77c95453db1ae00a3f9c50227ebd955437bcf2a574ba8adbf6a74d5"}, {file = "psutil-5.9.5-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4aef137f3345082a3d3232187aeb4ac4ef959ba3d7c10c33dd73763fbc063da4"}, @@ -1664,23 +1319,61 @@ psutil = [ {file = "psutil-5.9.5-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c607bb3b57dc779d55e1554846352b4e358c10fff3abf3514a7a6601beebdb30"}, {file = "psutil-5.9.5.tar.gz", hash = "sha256:5410638e4df39c54d957fc51ce03048acd8e6d60abc0f5107af51e5fb566eb3c"}, ] -pycodestyle = [ + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "pycodestyle" +version = "2.8.0" +description = "Python style guide checker" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, ] -pycparser = [ + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, ] -pyfakefs = [ + +[[package]] +name = "pyfakefs" +version = "4.7.0" +description = "pyfakefs implements a fake file system that mocks the Python file system modules." +optional = false +python-versions = ">=3.7" +files = [ {file = "pyfakefs-4.7.0-py3-none-any.whl", hash = "sha256:29203a7482b25406dd3ea41c8740be2697c6058b0f6577485c3ae9cd4c5e96cd"}, {file = "pyfakefs-4.7.0.tar.gz", hash = "sha256:f22d30d93d2989bf2d2c67b606a14cbab2df0be912c09dcdb590ea4931073ade"}, ] -pyflakes = [ + +[[package]] +name = "pyflakes" +version = "2.4.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.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, ] -pyrsistent = [ + +[[package]] +name = "pyrsistent" +version = "0.19.3" +description = "Persistent/Functional/Immutable data structures" +optional = false +python-versions = ">=3.7" +files = [ {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, @@ -1709,31 +1402,106 @@ pyrsistent = [ {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, ] -pytest = [ + +[[package]] +name = "pytest" +version = "7.3.1" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ {file = "pytest-7.3.1-py3-none-any.whl", hash = "sha256:3799fa815351fea3a5e96ac7e503a96fa51cc9942c3753cda7651b93c1cfa362"}, {file = "pytest-7.3.1.tar.gz", hash = "sha256:434afafd78b1d78ed0addf160ad2b77a30d35d4bdf8af234fe621919d9ed15e3"}, ] -pytest-describe = [ + +[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", "xmlschema"] + +[[package]] +name = "pytest-describe" +version = "2.1.0" +description = "Describe-style plugin for pytest" +optional = false +python-versions = ">=3.7" +files = [ {file = "pytest-describe-2.1.0.tar.gz", hash = "sha256:0630c95ac4942ab8dcd8e766236f86436b4984896db0c059fc234fef66fe9732"}, {file = "pytest_describe-2.1.0-py3-none-any.whl", hash = "sha256:3ea587839363a91ea24e35e442dae46b56bd91d670e63b755e002b0adfc7a7b2"}, ] -pytest-mock = [ + +[package.dependencies] +pytest = ">=4.6,<8" + +[[package]] +name = "pytest-mock" +version = "3.10.0" +description = "Thin-wrapper around the mock package for easier use with pytest" +optional = false +python-versions = ">=3.7" +files = [ {file = "pytest-mock-3.10.0.tar.gz", hash = "sha256:fbbdb085ef7c252a326fd8cdcac0aa3b1333d8811f131bdcc701002e1be7ed4f"}, {file = "pytest_mock-3.10.0-py3-none-any.whl", hash = "sha256:f4c973eeae0282963eb293eb173ce91b091a79c1334455acfac9ddee8a1c784b"}, ] -python-dateutil = [ + +[package.dependencies] +pytest = ">=5.0" + +[package.extras] +dev = ["pre-commit", "pytest-asyncio", "tox"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, ] -python-dotenv = [ + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "0.20.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.5" +files = [ {file = "python-dotenv-0.20.0.tar.gz", hash = "sha256:b7e3b04a59693c42c36f9ab1cc2acc46fa5df8c78e178fc33a8d4cd05c8d498f"}, {file = "python_dotenv-0.20.0-py3-none-any.whl", hash = "sha256:d92a187be61fe482e4fd675b6d52200e7be63a12b724abbf931a40ce4fa92938"}, ] -pytz = [ + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pytz" +version = "2023.3" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ {file = "pytz-2023.3-py2.py3-none-any.whl", hash = "sha256:a151b3abb88eda1d4e34a9814df37de2a80e301e68ba0fd856fb9b46bfbbbffb"}, {file = "pytz-2023.3.tar.gz", hash = "sha256:1d8ce29db189191fb55338ee6d0387d82ab59f3d00eac103412d64e0ebd0c588"}, ] -pywin32 = [ + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, @@ -1749,7 +1517,14 @@ pywin32 = [ {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, ] -pyzmq = [ + +[[package]] +name = "pyzmq" +version = "25.0.2" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.6" +files = [ {file = "pyzmq-25.0.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:ac178e666c097c8d3deb5097b58cd1316092fc43e8ef5b5fdb259b51da7e7315"}, {file = "pyzmq-25.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:659e62e1cbb063151c52f5b01a38e1df6b54feccfa3e2509d44c35ca6d7962ee"}, {file = "pyzmq-25.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8280ada89010735a12b968ec3ea9a468ac2e04fddcc1cede59cb7f5178783b9c"}, @@ -1828,58 +1603,199 @@ pyzmq = [ {file = "pyzmq-25.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:56a94ab1d12af982b55ca96c6853db6ac85505e820d9458ac76364c1998972f4"}, {file = "pyzmq-25.0.2.tar.gz", hash = "sha256:6b8c1bbb70e868dc88801aa532cae6bd4e3b5233784692b786f17ad2962e5149"}, ] -requests = [ + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, ] -roundrobin = [ + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "roundrobin" +version = "0.0.4" +description = "Collection of roundrobin utilities" +optional = false +python-versions = "*" +files = [ {file = "roundrobin-0.0.4.tar.gz", hash = "sha256:7e9d19a5bd6123d99993fb935fa86d25c88bb2096e493885f61737ed0f5e9abd"}, ] -setuptools = [ + +[[package]] +name = "setuptools" +version = "67.8.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ {file = "setuptools-67.8.0-py3-none-any.whl", hash = "sha256:5df61bf30bb10c6f756eb19e7c9f3b473051f48db77fddbe06ff2ca307df9a6f"}, {file = "setuptools-67.8.0.tar.gz", hash = "sha256:62642358adc77ffa87233bc4d2354c4b2682d214048f500964dbe760ccedf102"}, ] -six = [ + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +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.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -tomli = [ + +[[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"}, ] -types-requests = [ + +[[package]] +name = "types-requests" +version = "2.31.0.0" +description = "Typing stubs for requests" +optional = false +python-versions = "*" +files = [ {file = "types-requests-2.31.0.0.tar.gz", hash = "sha256:c1c29d20ab8d84dff468d7febfe8e0cb0b4664543221b386605e14672b44ea25"}, {file = "types_requests-2.31.0.0-py3-none-any.whl", hash = "sha256:7c5cea7940f8e92ec560bbc468f65bf684aa3dcf0554a6f8c4710f5f708dc598"}, ] -types-urllib3 = [ + +[package.dependencies] +types-urllib3 = "*" + +[[package]] +name = "types-urllib3" +version = "1.26.25.13" +description = "Typing stubs for urllib3" +optional = false +python-versions = "*" +files = [ {file = "types-urllib3-1.26.25.13.tar.gz", hash = "sha256:3300538c9dc11dad32eae4827ac313f5d986b8b21494801f1bf97a1ac6c03ae5"}, {file = "types_urllib3-1.26.25.13-py3-none-any.whl", hash = "sha256:5dbd1d2bef14efee43f5318b5d36d805a489f6600252bb53626d4bfafd95e27c"}, ] -typing-extensions = [ + +[[package]] +name = "typing-extensions" +version = "4.6.2" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ {file = "typing_extensions-4.6.2-py3-none-any.whl", hash = "sha256:3a8b36f13dd5fdc5d1b16fe317f5668545de77fa0b8e02006381fd49d731ab98"}, {file = "typing_extensions-4.6.2.tar.gz", hash = "sha256:06006244c70ac8ee83fa8282cb188f697b8db25bc8b4df07be1873c43897060c"}, ] -urllib3 = [ + +[[package]] +name = "urllib3" +version = "1.26.16" +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.*" +files = [ {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, ] -werkzeug = [ + +[package.extras] +brotli = ["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)"] + +[[package]] +name = "werkzeug" +version = "2.3.4" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=3.8" +files = [ {file = "Werkzeug-2.3.4-py3-none-any.whl", hash = "sha256:48e5e61472fee0ddee27ebad085614ebedb7af41e88f687aaf881afb723a162f"}, {file = "Werkzeug-2.3.4.tar.gz", hash = "sha256:1d5a58e0377d1fe39d061a5de4469e414e78ccb1e1e59c0f5ad6fa1c36c52b76"}, ] -xmltodict = [ + +[package.dependencies] +MarkupSafe = ">=2.1.1" + +[package.extras] +watchdog = ["watchdog (>=2.3)"] + +[[package]] +name = "xmltodict" +version = "0.13.0" +description = "Makes working with XML feel like you are working with JSON" +optional = false +python-versions = ">=3.4" +files = [ {file = "xmltodict-0.13.0-py2.py3-none-any.whl", hash = "sha256:aa89e8fd76320154a40d19a0df04a4695fb9dc5ba977cbb68ab3e4eb225e7852"}, {file = "xmltodict-0.13.0.tar.gz", hash = "sha256:341595a488e3e01a85a9d8911d8912fd922ede5fecc4dce437eb4b6c8d037e56"}, ] -zipp = [ + +[[package]] +name = "zipp" +version = "3.15.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.7" +files = [ {file = "zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556"}, {file = "zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b"}, ] -zope-event = [ + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "flake8 (<5)", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)"] + +[[package]] +name = "zope-event" +version = "4.6" +description = "Very basic event publishing system" +optional = false +python-versions = "*" +files = [ {file = "zope.event-4.6-py2.py3-none-any.whl", hash = "sha256:73d9e3ef750cca14816a9c322c7250b0d7c9dbc337df5d1b807ff8d3d0b9e97c"}, {file = "zope.event-4.6.tar.gz", hash = "sha256:81d98813046fc86cc4136e3698fee628a3282f9c320db18658c21749235fce80"}, ] -zope-interface = [ + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx"] +test = ["zope.testrunner"] + +[[package]] +name = "zope-interface" +version = "6.0" +description = "Interfaces for Python" +optional = false +python-versions = ">=3.7" +files = [ {file = "zope.interface-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f299c020c6679cb389814a3b81200fe55d428012c5e76da7e722491f5d205990"}, {file = "zope.interface-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ee4b43f35f5dc15e1fec55ccb53c130adb1d11e8ad8263d68b1284b66a04190d"}, {file = "zope.interface-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a158846d0fca0a908c1afb281ddba88744d403f2550dc34405c3691769cdd85"}, @@ -1911,3 +1827,16 @@ zope-interface = [ {file = "zope.interface-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:5171eb073474a5038321409a630904fd61f12dd1856dd7e9d19cd6fe092cbbc5"}, {file = "zope.interface-6.0.tar.gz", hash = "sha256:aab584725afd10c710b8f1e6e208dbee2d0ad009f57d674cb9d1b3964037275d"}, ] + +[package.dependencies] +setuptools = "*" + +[package.extras] +docs = ["Sphinx", "repoze.sphinx.autointerface"] +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.9" +content-hash = "a89f3bfb6a9815e2953c2849724373971b269b0c3f9ce6071f011ff81495f411" From be503b25078f7f46275de8c8b9a9c30843fbb44c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andony=20Nu=C3=B1ez?= Date: Fri, 9 Jun 2023 16:41:08 -0600 Subject: [PATCH 13/19] Changing performance documentation to match allowed values --- src/edfi-performance-test/README.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/edfi-performance-test/README.md b/src/edfi-performance-test/README.md index ab53299c..34794ca6 100644 --- a/src/edfi-performance-test/README.md +++ b/src/edfi-performance-test/README.md @@ -1,8 +1,8 @@ # Performance Tests -Provides performance metrics for the ODS / API SIS Certification endpoints aimed at analysis of -bottlenecks, and providing recommendations for server sizing for representative -agency simulation sizes. +Provides performance metrics for the ODS / API SIS Certification endpoints +aimed at analysis of bottlenecks, and providing recommendations for server +sizing for representative agency simulation sizes. ## Getting Started @@ -24,8 +24,8 @@ directory: poetry run python edfi_performance_test -b "https://localhost:54746" -k "testkey" -s "testsecret" -t "volume" ``` -Test failure ratio is monitored throughout and run is stopped if more than 50% of the -tests experience failures. +Test failure ratio is monitored throughout and run is stopped if more than 50% +of the tests experience failures. ### Supported arguments @@ -35,7 +35,7 @@ tests experience failures. | `-k` or `--key` | yes (no default) | The web API OAuth key | | `-s` or `--secret` | yes (no default) | The web API OAuth secret | | `-i` or `--ignoreCertificateErrors` | no (default: false) | Ignore certificate errors | -| `-t` or `--testType` | no (default: PIPECLEAN) | Type of the performance tests to run: VOLUME, PIPECLEAN, CHANGE_QUERY | +| `-t` or `--testType` | no (default: pipeclean) | Type of the performance tests to run: volume, pipeclean, CHANGE_QUERY | | `-tl` or `--testList` | no (no default) | (Optional) List of test files to run - if not provided, all tests will be run | | `-d` or `--deleteResources` | no (default: true) | Delete resources during test run | | `-f` or `--failDeliberately` | no (default: true) | Deliberately introduce requests that result in failure | @@ -48,8 +48,8 @@ tests experience failures. | `-e` or `--localEducationOrganizationId` | no (default: 255901) | Override the default LEA education organization ID | Each argument can also be set by environment variable, or by using as `.env` -file. See [.env.example](edfi_performance_test/.env.example). Arguments provided at -the command line override any arguments provided by environment variable. +file. See [.env.example](edfi_performance_test/.env.example). Arguments provided +at the command line override any arguments provided by environment variable. ### Dev Operations From de0ab62059d4b533a095b152556584926cad5fcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andony=20Nu=C3=B1ez?= Date: Mon, 12 Jun 2023 17:27:51 -0600 Subject: [PATCH 14/19] Adjusting env example --- src/edfi-performance-test/README.md | 2 +- src/edfi-performance-test/edfi_performance_test/.env.example | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/edfi-performance-test/README.md b/src/edfi-performance-test/README.md index 34794ca6..3ef0c1fd 100644 --- a/src/edfi-performance-test/README.md +++ b/src/edfi-performance-test/README.md @@ -35,7 +35,7 @@ of the tests experience failures. | `-k` or `--key` | yes (no default) | The web API OAuth key | | `-s` or `--secret` | yes (no default) | The web API OAuth secret | | `-i` or `--ignoreCertificateErrors` | no (default: false) | Ignore certificate errors | -| `-t` or `--testType` | no (default: pipeclean) | Type of the performance tests to run: volume, pipeclean, CHANGE_QUERY | +| `-t` or `--testType` | no (default: pipeclean) | Type of the performance tests to run: volume, pipeclean, change_query | | `-tl` or `--testList` | no (no default) | (Optional) List of test files to run - if not provided, all tests will be run | | `-d` or `--deleteResources` | no (default: true) | Delete resources during test run | | `-f` or `--failDeliberately` | no (default: true) | Deliberately introduce requests that result in failure | diff --git a/src/edfi-performance-test/edfi_performance_test/.env.example b/src/edfi-performance-test/edfi_performance_test/.env.example index f032d7a5..29ad6a07 100644 --- a/src/edfi-performance-test/edfi_performance_test/.env.example +++ b/src/edfi-performance-test/edfi_performance_test/.env.example @@ -17,7 +17,7 @@ PERF_API_OAUTH_ENDPOINT="/oauth/token" # Meadowlark # PERF_API_PREFIX="/local/v3.3b/ed-fi" -# PERF_API_OAUTH_ENDPOINT="/local/api/oauth/token" +# PERF_API_OAUTH_ENDPOINT="/local/oauth/token" # Set to true when using HTTP instead of HTTPS or when using self-signed certificates IGNORE_TLS_CERTIFICATE=true From da7362713286dbacec54fc499b5b5fbd0486202c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andony=20Nu=C3=B1ez?= Date: Fri, 12 Jan 2024 08:41:41 -0600 Subject: [PATCH 15/19] Adding additional parameter to include id in body, required by Meadowlark --- .../edfi_performance_test/.env.example | 5 +++++ .../factories/resources/school.py | 2 +- .../factories/resources/student.py | 11 +++++------ .../edfi_performance_test/helpers/argparser.py | 11 ++++++++++- .../edfi_performance_test/helpers/config.py | 1 + .../edfi_performance_test/helpers/main_arguments.py | 1 + .../tasks/volume/ed_fi_volume_test_base.py | 6 ++++++ src/edfi-performance-test/tests/test_argparser.py | 1 + 8 files changed, 30 insertions(+), 8 deletions(-) diff --git a/src/edfi-performance-test/edfi_performance_test/.env.example b/src/edfi-performance-test/edfi_performance_test/.env.example index 3938cd0b..4d4bd80d 100644 --- a/src/edfi-performance-test/edfi_performance_test/.env.example +++ b/src/edfi-performance-test/edfi_performance_test/.env.example @@ -25,3 +25,8 @@ PERF_API_OAUTH_ENDPOINT="/oauth/token" # Set to true when using HTTP instead of HTTPS or when using self-signed certificates IGNORE_TLS_CERTIFICATE=true + +# PERF_TEST_LIST=[""] + +# Meadowlark requires the ID in the body +INCLUDE_ID_IN_BODY=True diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/school.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/school.py index 53f40927..c988bd9a 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/school.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/school.py @@ -39,7 +39,7 @@ class SchoolFactory(APIFactory): ) ) gradeLevels = ListOfDescriptors( - "GradeLevel", ["Ninth grade", "Tenth grade", "Eleventh grade", "Twelfth grade"] + "GradeLevel", ["Second grade"] ) institutionTelephones = ListOfDescriptors( "InstitutionTelephoneNumberType", diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py index df04cd7a..8677e3d1 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py @@ -7,6 +7,7 @@ from edfi_performance_test.api.client.education import LocalEducationAgencyClient from edfi_performance_test.api.client.school import SchoolClient +from edfi_performance_test.api.client.program import ProgramClient from edfi_performance_test.factories.resources.api_factory import APIFactory from edfi_performance_test.factories.descriptors.utils import build_descriptor from edfi_performance_test.factories.resources.address import AddressFactory @@ -339,6 +340,7 @@ class StudentCompetencyObjectiveFactory(APIFactory): class StudentCTEProgramAssociationFactory(APIFactory): + educationOrganizationReference = factory.Dict( dict( educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id() @@ -348,12 +350,11 @@ class StudentCTEProgramAssociationFactory(APIFactory): dict(studentUniqueId=None) ) programReference = factory.Dict( + dict( + educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name), programName=ProgramClient.shared_program_name, - educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), - programTypeDescriptor=None, - programName=None, ) ) # Prepopulated program beginDate = RandomDateAttribute() @@ -407,11 +408,9 @@ class StudentHomelessProgramAssociationFactory(APIFactory): ) # Prepopulated ed org programReference = factory.Dict( dict( + educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name), programName=ProgramClient.shared_program_name, - educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), - programTypeDescriptor=None, - programName=None, ) ) # Prepopulated program studentReference = factory.Dict( diff --git a/src/edfi-performance-test/edfi_performance_test/helpers/argparser.py b/src/edfi-performance-test/edfi_performance_test/helpers/argparser.py index 8f053605..d52bfe8e 100644 --- a/src/edfi-performance-test/edfi_performance_test/helpers/argparser.py +++ b/src/edfi-performance-test/edfi_performance_test/helpers/argparser.py @@ -172,6 +172,14 @@ def parse_main_arguments() -> MainArguments: env_var="PERF_DISABLE_COMPOSITES", default=False ) + parser.add( # type: ignore + "-id", + "--includeID", + help="Include ID in body of PUT requests", + type=str, + env_var="INCLUDE_ID_IN_BODY", + default=False + ) args_parsed = parser.parse_args() arguments = MainArguments( @@ -192,7 +200,8 @@ def parse_main_arguments() -> MainArguments: args_parsed.oauthEndpoint, args_parsed.localEducationOrganizationId, args_parsed.logLevel, - args_parsed.disableComposites + args_parsed.disableComposites, + args_parsed.includeID ) return arguments diff --git a/src/edfi-performance-test/edfi_performance_test/helpers/config.py b/src/edfi-performance-test/edfi_performance_test/helpers/config.py index d9b80c75..4e544da5 100644 --- a/src/edfi-performance-test/edfi_performance_test/helpers/config.py +++ b/src/edfi-performance-test/edfi_performance_test/helpers/config.py @@ -46,6 +46,7 @@ def set_config_values(args: MainArguments): os.environ["PERF_API_OAUTH_PREFIX"] = args.oauth_endpoint os.environ["PERF_LOCAL_EDUCATION_ORGANIZATION_ID"] = str(args.localEducationOrganizationId) os.environ["PERF_DISABLE_COMPOSITES"] = str(args.disableComposites) + os.environ["INCLUDE_ID_IN_BODY"] = str(args.includeID) def _get_change_version_file_path(): diff --git a/src/edfi-performance-test/edfi_performance_test/helpers/main_arguments.py b/src/edfi-performance-test/edfi_performance_test/helpers/main_arguments.py index 721a426d..36c6be89 100644 --- a/src/edfi-performance-test/edfi_performance_test/helpers/main_arguments.py +++ b/src/edfi-performance-test/edfi_performance_test/helpers/main_arguments.py @@ -34,6 +34,7 @@ class MainArguments: localEducationOrganizationId: int log_level: LogLevel = LogLevel.INFO disableComposites: bool = False + includeID: bool = False def __str__(self) -> str: def _masked(key: str) -> str: diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/volume/ed_fi_volume_test_base.py b/src/edfi-performance-test/edfi_performance_test/tasks/volume/ed_fi_volume_test_base.py index 74f86481..30273eca 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/volume/ed_fi_volume_test_base.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/volume/ed_fi_volume_test_base.py @@ -46,7 +46,13 @@ def _update_attribute( update_attribute_value, **kwargs ): + # print("Before", resource_attrs) + + if get_config_value("INCLUDE_ID_IN_BODY").lower() == "true": + resource_attrs["id"] = resource_id + # print("-----------------------------------------------------") resource_attrs[update_attribute_name] = update_attribute_value + # print("After", resource_attrs) self.update(resource_id, **resource_attrs) @task diff --git a/src/edfi-performance-test/tests/test_argparser.py b/src/edfi-performance-test/tests/test_argparser.py index 9dfc188b..f8571590 100644 --- a/src/edfi-performance-test/tests/test_argparser.py +++ b/src/edfi-performance-test/tests/test_argparser.py @@ -143,6 +143,7 @@ def main_arguments() -> MainArguments: os.environ["PERF_TEST_LIST"] = '["a", "b"]' os.environ["PERF_FAIL_DELIBERATELY"] = "True" os.environ["PERF_DISABLE_COMPOSITES"] = "True" + os.environ["INCLUDE_ID_IN_BODY"] = "False" sys.argv = ["pytest"] return parse_main_arguments() From 4034a4f33a456d795b2b9fc9f3f46cc00179805f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andony=20Nu=C3=B1ez?= Date: Wed, 17 Jan 2024 14:14:20 -0600 Subject: [PATCH 16/19] Adjustments to run against Meadowlark --- .../edfi_performance_test/tasks/volume/course.py | 2 +- .../edfi_performance_test/tasks/volume/school.py | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/volume/course.py b/src/edfi-performance-test/edfi_performance_test/tasks/volume/course.py index 1c7bd4d8..e5320ca6 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/volume/course.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/volume/course.py @@ -42,5 +42,5 @@ def run_transcript_scenarios(self): schoolId=SchoolClient.shared_high_school_id(), courseReference__courseCode="ALG-2", finalLetterGradeEarned="A", - finalNumericGradEarned=98, + finalNumericGradeEarned=98, ) diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/volume/school.py b/src/edfi-performance-test/edfi_performance_test/tasks/volume/school.py index 918b2b7b..640b2120 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/volume/school.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/volume/school.py @@ -8,6 +8,7 @@ from edfi_performance_test.factories.descriptors.utils import build_descriptor_dicts from edfi_performance_test.factories.utils import random_chars from edfi_performance_test.tasks.volume.ed_fi_volume_test_base import EdFiVolumeTestBase +from edfi_performance_test.helpers.config import get_config_value class SchoolVolumeTest(EdFiVolumeTestBase): @@ -42,6 +43,10 @@ def _update_attribute( update_attribute_value, **kwargs ): + + if get_config_value("INCLUDE_ID_IN_BODY").lower() == "true": + resource_attrs["id"] = resource_id + if update_attribute_name == "telephoneNumber": # Update first institutionTelephones record resource_attrs["institutionTelephones"][0][ From 79580dc00ae04f19dcfe104ed8938e9d4fb36f60 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andony=20Nu=C3=B1ez?= Date: Wed, 17 Jan 2024 17:14:49 -0600 Subject: [PATCH 17/19] Adjustments --- .../edfi_performance_test/factories/resources/school.py | 2 +- .../edfi_performance_test/tasks/volume/course.py | 2 +- .../tasks/volume/ed_fi_volume_test_base.py | 4 ---- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/school.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/school.py index c988bd9a..53f40927 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/school.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/school.py @@ -39,7 +39,7 @@ class SchoolFactory(APIFactory): ) ) gradeLevels = ListOfDescriptors( - "GradeLevel", ["Second grade"] + "GradeLevel", ["Ninth grade", "Tenth grade", "Eleventh grade", "Twelfth grade"] ) institutionTelephones = ListOfDescriptors( "InstitutionTelephoneNumberType", diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/volume/course.py b/src/edfi-performance-test/edfi_performance_test/tasks/volume/course.py index e5320ca6..1c7bd4d8 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/volume/course.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/volume/course.py @@ -42,5 +42,5 @@ def run_transcript_scenarios(self): schoolId=SchoolClient.shared_high_school_id(), courseReference__courseCode="ALG-2", finalLetterGradeEarned="A", - finalNumericGradeEarned=98, + finalNumericGradEarned=98, ) diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/volume/ed_fi_volume_test_base.py b/src/edfi-performance-test/edfi_performance_test/tasks/volume/ed_fi_volume_test_base.py index 30273eca..0a8e708c 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/volume/ed_fi_volume_test_base.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/volume/ed_fi_volume_test_base.py @@ -46,13 +46,9 @@ def _update_attribute( update_attribute_value, **kwargs ): - # print("Before", resource_attrs) - if get_config_value("INCLUDE_ID_IN_BODY").lower() == "true": resource_attrs["id"] = resource_id - # print("-----------------------------------------------------") resource_attrs[update_attribute_name] = update_attribute_value - # print("After", resource_attrs) self.update(resource_id, **resource_attrs) @task From ce353d83bb352a07069b198ce04d3d686a6def59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andony=20Nu=C3=B1ez?= Date: Thu, 18 Jan 2024 09:39:46 -0600 Subject: [PATCH 18/19] Linting adjustments --- .../edfi_performance_test/api/client/bell_schedule.py | 2 +- .../edfi_performance_test/factories/resources/assessment.py | 1 - .../edfi_performance_test/tasks/pipeclean/account.py | 1 - .../edfi_performance_test/tasks/pipeclean/post_secondary.py | 1 - src/edfi-performance-test/tests/factories/__init__.py | 1 - .../tests/factories/descriptors/__init__.py | 1 - .../tests/factories/descriptors/test_utils.py | 1 - 7 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/edfi-performance-test/edfi_performance_test/api/client/bell_schedule.py b/src/edfi-performance-test/edfi_performance_test/api/client/bell_schedule.py index 358d35eb..d961ed35 100644 --- a/src/edfi-performance-test/edfi_performance_test/api/client/bell_schedule.py +++ b/src/edfi-performance-test/edfi_performance_test/api/client/bell_schedule.py @@ -15,7 +15,7 @@ class BellScheduleClient(EdFiAPIClient): def create_with_dependencies(self, **kwargs): # Create new class period - class_period_reference = self.class_period_client.create_with_dependencies() # type: ignore + class_period_reference = self.class_period_client.create_with_dependencies() # type: ignore # Create bell schedule return self.create_using_dependencies( diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/assessment.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/assessment.py index 8bd953d8..39fe063d 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/assessment.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/assessment.py @@ -10,7 +10,6 @@ from edfi_performance_test.factories.utils import ( RandomSuffixAttribute, UniqueIdAttribute, - random_date_time, ) diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/account.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/account.py index 4c79f136..4ccf61ba 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/account.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/account.py @@ -3,7 +3,6 @@ # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. -from edfi_performance_test.factories.descriptors.utils import build_descriptor from edfi_performance_test.tasks.pipeclean.ed_fi_pipeclean_test_base import ( EdFiPipecleanTestBase, ) diff --git a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/post_secondary.py b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/post_secondary.py index fd3972fe..631c747e 100644 --- a/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/post_secondary.py +++ b/src/edfi-performance-test/edfi_performance_test/tasks/pipeclean/post_secondary.py @@ -6,7 +6,6 @@ from edfi_performance_test.tasks.pipeclean.ed_fi_pipeclean_test_base import ( EdFiPipecleanTestBase, ) -import factory class PostSecondaryInstitutionPipecleanTest(EdFiPipecleanTestBase): diff --git a/src/edfi-performance-test/tests/factories/__init__.py b/src/edfi-performance-test/tests/factories/__init__.py index 1a175fe6..794c49e6 100644 --- a/src/edfi-performance-test/tests/factories/__init__.py +++ b/src/edfi-performance-test/tests/factories/__init__.py @@ -2,4 +2,3 @@ # Licensed to the Ed-Fi Alliance under one or more agreements. # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. - diff --git a/src/edfi-performance-test/tests/factories/descriptors/__init__.py b/src/edfi-performance-test/tests/factories/descriptors/__init__.py index 1a175fe6..794c49e6 100644 --- a/src/edfi-performance-test/tests/factories/descriptors/__init__.py +++ b/src/edfi-performance-test/tests/factories/descriptors/__init__.py @@ -2,4 +2,3 @@ # Licensed to the Ed-Fi Alliance under one or more agreements. # The Ed-Fi Alliance licenses this file to you under the Apache License, Version 2.0. # See the LICENSE and NOTICES files in the project root for more information. - diff --git a/src/edfi-performance-test/tests/factories/descriptors/test_utils.py b/src/edfi-performance-test/tests/factories/descriptors/test_utils.py index 0dd8c68c..8590cb16 100644 --- a/src/edfi-performance-test/tests/factories/descriptors/test_utils.py +++ b/src/edfi-performance-test/tests/factories/descriptors/test_utils.py @@ -55,4 +55,3 @@ def it_references_the_descriptor_properly(result) -> None: def it_includes_the_telephone_number(result) -> None: assert result["telephoneNumber"] == "(950) 325-9465" - From f59e76fad2732893f9df323539c2c55d93a94baf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andony=20Nu=C3=B1ez?= Date: Fri, 19 Jan 2024 16:57:58 -0600 Subject: [PATCH 19/19] Adjustments when running ODS --- .../factories/resources/student.py | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py b/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py index 8677e3d1..f9e7f7dc 100644 --- a/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py +++ b/src/edfi-performance-test/edfi_performance_test/factories/resources/student.py @@ -172,8 +172,8 @@ class StudentProgramAssociationFactory(APIFactory): ) # Prepopulated ed organization programReference = factory.Dict( dict( - programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name), - programName=ProgramClient.shared_program_name, + programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name()), + programName=ProgramClient.shared_program_name(), educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), # Prepopulated ed organization ) ) @@ -210,8 +210,8 @@ class StudentTitleIPartAProgramAssociationFactory(APIFactory): ) # Prepopulated ed organization programReference = factory.Dict( dict( - programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name), - programName=ProgramClient.shared_program_name, + programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name()), + programName=ProgramClient.shared_program_name(), educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), # Prepopulated ed organization ) ) @@ -232,8 +232,8 @@ class StudentSpecialEducationProgramAssociationFactory(APIFactory): ) # Prepopulated ed organization programReference = factory.Dict( dict( - programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name), - programName=ProgramClient.shared_program_name, + programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name()), + programName=ProgramClient.shared_program_name(), educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), # Prepopulated ed organization ) ) @@ -353,8 +353,8 @@ class StudentCTEProgramAssociationFactory(APIFactory): dict( educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), - programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name), - programName=ProgramClient.shared_program_name, + programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name()), + programName=ProgramClient.shared_program_name(), ) ) # Prepopulated program beginDate = RandomDateAttribute() @@ -409,8 +409,8 @@ class StudentHomelessProgramAssociationFactory(APIFactory): programReference = factory.Dict( dict( educationOrganizationId=LocalEducationAgencyClient.shared_education_organization_id(), - programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name), - programName=ProgramClient.shared_program_name, + programTypeDescriptor=build_descriptor("ProgramType", ProgramClient.shared_program_name()), + programName=ProgramClient.shared_program_name(), ) ) # Prepopulated program studentReference = factory.Dict(