From 00741edb3ff9355815338fd1a283a36538ad40e8 Mon Sep 17 00:00:00 2001 From: Molly He Date: Fri, 18 Apr 2025 12:58:39 -0700 Subject: [PATCH 1/5] clean up --- .githooks/pre-push | 4 +- .github/workflows/codebuild-ci-health.yml | 2 +- .github/workflows/codebuild-ci.yml | 2 +- .pylintrc | 21 +- .readthedocs.yaml | 4 +- doc/api/inference/model_builder.rst | 12 +- doc/conf.py | 11 +- doc/requirements.txt | 8 +- pyproject.toml | 10 +- requirements/extras/local_requirements.txt | 2 +- requirements/extras/scipy_requirements.txt | 2 +- requirements/extras/test_requirements.txt | 15 +- requirements/tox/doc8_requirements.txt | 4 +- requirements/tox/flake8_requirements.txt | 4 +- requirements/tox/pylint_requirements.txt | 4 +- requirements/tox/spelling_requirements.txt | 2 +- src/sagemaker/config/config_schema.py | 24 +- .../feature_store/dataset_builder.py | 2 +- src/sagemaker/jumpstart/factory/model.py | 2 +- src/sagemaker/local/entities.py | 6 +- .../model_monitor/clarify_model_monitoring.py | 6 +- .../multi_model_server/prepare.py | 3 +- .../serve/utils/conda_in_process.yml | 10 +- .../serve/utils/in_process_requirements.txt | 4 +- .../model_step/pytorch_mnist/requirements.txt | 2 +- tests/data/remote_function/requirements.txt | 2 +- .../serve_resources/mlflow/pytorch/conda.yaml | 2 +- .../mlflow/pytorch/requirements.txt | 6 +- .../mlflow/xgboost/requirements.txt | 4 +- tests/data/workflow/requirements.txt | 2 +- tests/integ/sagemaker/experiments/test_run.py | 4 +- .../jumpstart/private_hub/test_hub_content.py | 2 +- .../serve/test_serve_js_deep_unit_tests.py | 54 +- tests/integ/sagemaker/workflow/helpers.py | 4 +- .../integ/sagemaker/workflow/test_workflow.py | 8 +- tests/integ/test_feature_store.py | 16 +- .../lineage/test_feature_processor_lineage.py | 2116 +++++++++-------- .../sagemaker/huggingface/test_llm_utils.py | 4 +- tests/unit/sagemaker/jumpstart/constants.py | 2 +- .../estimator/test_sagemaker_config.py | 100 +- .../jumpstart/model/test_sagemaker_config.py | 44 +- tests/unit/sagemaker/jumpstart/test_utils.py | 24 +- .../sagemaker/local/test_local_entities.py | 7 +- .../modules/train/test_model_trainer.py | 5 +- .../serve/detector/test_dependency_manager.py | 4 +- .../detector/test_pickle_dependencies.py | 45 +- .../djl_serving/test_djl_prepare.py | 6 +- .../test_multi_model_server_prepare.py | 6 +- .../model_server/tgi/test_tgi_prepare.py | 6 +- .../unit/sagemaker/workflow/test_pipeline.py | 61 +- tests/unit/test_exception_on_bad_status.py | 8 +- tests/unit/test_hyperparameter.py | 2 +- tests/unit/test_predictor_async.py | 4 +- tests/unit/test_tuner.py | 49 +- tox.ini | 30 +- 55 files changed, 1556 insertions(+), 1237 deletions(-) diff --git a/.githooks/pre-push b/.githooks/pre-push index 995ab70108..f73fa492b3 100755 --- a/.githooks/pre-push +++ b/.githooks/pre-push @@ -12,5 +12,5 @@ start_time=`date +%s` tox -e sphinx,doc8 --parallel all ./ci-scripts/displaytime.sh 'sphinx,doc8' $start_time start_time=`date +%s` -tox -e py38,py39,py310 --parallel all -- tests/unit -./ci-scripts/displaytime.sh 'py38,py39,py310 unit' $start_time +tox -e py39,py310,py311,py312 --parallel all -- tests/unit +./ci-scripts/displaytime.sh 'py39,py310,py311,py312 unit' $start_time diff --git a/.github/workflows/codebuild-ci-health.yml b/.github/workflows/codebuild-ci-health.yml index 7ecefd310f..119b9dbe9c 100644 --- a/.github/workflows/codebuild-ci-health.yml +++ b/.github/workflows/codebuild-ci-health.yml @@ -26,7 +26,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["py38", "py39", "py310", "py311"] + python-version: ["py39", "py310", "py311","py312"] steps: - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v4 diff --git a/.github/workflows/codebuild-ci.yml b/.github/workflows/codebuild-ci.yml index 8c6bd6b337..eef53ff06c 100644 --- a/.github/workflows/codebuild-ci.yml +++ b/.github/workflows/codebuild-ci.yml @@ -63,7 +63,7 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["py38","py39","py310","py311"] + python-version: ["py39","py310","py311","py312"] steps: - name: Configure AWS Credentials uses: aws-actions/configure-aws-credentials@v4 diff --git a/.pylintrc b/.pylintrc index 5428b86be0..223580f4d3 100644 --- a/.pylintrc +++ b/.pylintrc @@ -94,7 +94,24 @@ disable= useless-object-inheritance, # TODO: Enable this check and fix code once Python 2 is no longer supported. super-with-arguments, raise-missing-from, - E1136, + C0116, # Missing function or method docstring + C0209, # Use f-string instead of format + E0015, # Unrecognized option found in config + E0702, # Raising a string instead of an exception + E1101, # Module has no member (likely dynamic attr) + E1136, # Value assigned to something inferred as None + R0022, # Useless option value in config + R1710, # Inconsistent return statements + R1714, # Consider using `in` with comparisons + R1729, # Use a generator + R1732, + R1735, # Consider using a dict or list literal + W0237, # Argument renamed in override + W0613, # Unused argument + W0621, # Redefining name from outer scope + W0719 + W1404, # Implicit string concatenation + W1514, # `open()` used without encoding [REPORTS] # Set the output format. Available formats are text, parseable, colorized, msvs @@ -436,4 +453,4 @@ analyse-fallback-blocks=no # Exceptions that will emit a warning when being caught. Defaults to # "Exception" -overgeneral-exceptions=Exception +overgeneral-exceptions=builtins.Exception diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 0a6e3928b5..0dcc70b9c3 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -5,9 +5,9 @@ version: 2 build: - os: ubuntu-20.04 + os: ubuntu-22.04 tools: - python: "3.9" + python: "3.12" python: diff --git a/doc/api/inference/model_builder.rst b/doc/api/inference/model_builder.rst index 3099441850..3cfbcbc2c7 100644 --- a/doc/api/inference/model_builder.rst +++ b/doc/api/inference/model_builder.rst @@ -3,14 +3,14 @@ Model Builder This module contains classes related to Amazon Sagemaker Model Builder -.. autoclass:: sagemaker.serve.builder.model_builder.ModelBuilder +.. autoclass:: sagemaker.serve.ModelBuilder -.. automethod:: sagemaker.serve.builder.model_builder.ModelBuilder.build +.. automethod:: sagemaker.serve.ModelBuilder.build -.. automethod:: sagemaker.serve.builder.model_builder.ModelBuilder.save +.. automethod:: sagemaker.serve.ModelBuilder.save -.. autoclass:: sagemaker.serve.spec.inference_spec.InferenceSpec +.. autoclass:: sagemaker.serve.InferenceSpec -.. autoclass:: sagemaker.serve.builder.schema_builder.SchemaBuilder +.. autoclass:: sagemaker.serve.SchemaBuilder -.. autoclass:: sagemaker.serve.marshalling.custom_payload_translator.CustomPayloadTranslator +.. autoclass:: sagemaker.serve.CustomPayloadTranslator diff --git a/doc/conf.py b/doc/conf.py index 94a5c4d9c6..6c88ddd0e7 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -83,16 +83,11 @@ html_css_files = [ "https://cdn.datatables.net/1.10.23/css/jquery.dataTables.min.css", + "theme_overrides.css", + "pagination.css", + "search_accessories.css", ] -html_context = { - "css_files": [ - "_static/theme_overrides.css", - "_static/pagination.css", - "_static/search_accessories.css", - ] -} - # Example configuration for intersphinx: refer to the Python standard library. intersphinx_mapping = {"python": ("http://docs.python.org/", None)} diff --git a/doc/requirements.txt b/doc/requirements.txt index 71a95f7633..11098e2bc1 100644 --- a/doc/requirements.txt +++ b/doc/requirements.txt @@ -1,7 +1,7 @@ -sphinx==5.1.1 -sphinx-rtd-theme==0.5.0 -docutils==0.15.2 -packaging==20.9 +sphinx==7.2.6 +sphinx-rtd-theme==3.0.0 +docutils>=0.18.1,<0.21 +packaging>=23.0,<25 jinja2==3.1.6 schema==0.7.5 accelerate>=0.24.1,<=0.27.0 diff --git a/pyproject.toml b/pyproject.toml index 0122a6bf3c..c5c9bf9874 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,7 +7,7 @@ name = "sagemaker" dynamic = ["version", "optional-dependencies"] description = "Open source library for training and deploying models on Amazon SageMaker." readme = "README.rst" -requires-python = ">=3.8" +requires-python = ">=3.9" authors = [ { name = "Amazon Web Services" }, ] @@ -25,10 +25,10 @@ classifiers = [ "License :: OSI Approved :: Apache Software License", "Natural Language :: English", "Programming Language :: Python", - "Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", ] dependencies = [ "attrs>=23.1.0,<24", @@ -39,15 +39,15 @@ dependencies = [ "google-pasta", "importlib-metadata>=1.4.0,<7.0", "jsonschema", - "numpy>=1.9.0,<2.0", + "numpy==1.26.4", "omegaconf>=2.2,<=2.3", - "packaging>=20.0", + "packaging>=23.0,<25", "pandas", "pathos", "platformdirs", "protobuf>=3.12,<6.0", "psutil", - "PyYAML~=6.0", + "PyYAML>=6.0.1", "requests", "sagemaker-core>=1.0.17,<2.0.0", "schema", diff --git a/requirements/extras/local_requirements.txt b/requirements/extras/local_requirements.txt index 68b9a1bcb3..ea57b82e9a 100644 --- a/requirements/extras/local_requirements.txt +++ b/requirements/extras/local_requirements.txt @@ -1,3 +1,3 @@ urllib3>=1.26.8,<3.0.0 docker>=5.0.2,<8.0.0 -PyYAML>=5.4.1,<7 +PyYAML>=6.0.1,<7 diff --git a/requirements/extras/scipy_requirements.txt b/requirements/extras/scipy_requirements.txt index 0e99587e6e..44ce1d9331 100644 --- a/requirements/extras/scipy_requirements.txt +++ b/requirements/extras/scipy_requirements.txt @@ -1 +1 @@ -scipy==1.10.1 +scipy==1.11.3 diff --git a/requirements/extras/test_requirements.txt b/requirements/extras/test_requirements.txt index a0087a8e13..3e6200ee3e 100644 --- a/requirements/extras/test_requirements.txt +++ b/requirements/extras/test_requirements.txt @@ -1,7 +1,7 @@ tox==3.24.5 -numpy>=1.24.0 +numpy==1.26.4 build[virtualenv]==1.2.1 -flake8==4.0.1 +flake8==7.1.2 pytest==6.2.5 pytest-cov==3.0.0 pytest-rerunfailures==10.2 @@ -14,10 +14,10 @@ awslogs==0.14.0 black==24.3.0 stopit==1.1.2 # Update tox.ini to have correct version of airflow constraints file -apache-airflow==2.9.3 +apache-airflow==2.10.4 apache-airflow-providers-amazon==7.2.1 attrs>=23.1.0,<24 -fabric==2.6.0 +fabric==3.2.2 requests==2.32.2 sagemaker-experiments==0.1.35 Jinja2==3.1.6 @@ -26,13 +26,13 @@ pandas==1.4.4 scikit-learn==1.3.0 cloudpickle==2.2.1 jsonpickle<4.0.0 -PyYAML==6.0 +PyYAML>=6.0.1 # TODO find workaround xgboost>=1.6.2,<=1.7.6 pillow>=10.0.1,<=11 opentelemetry-proto==1.27.0 protobuf==4.25.5 -tensorboard>=2.9.0,<=2.15.2 +tensorboard>=2.16.2,<=2.18.0 transformers==4.48.0 sentencepiece==0.1.99 # https://github.com/triton-inference-server/server/issues/6246 @@ -42,7 +42,7 @@ onnx==1.17.0 nbformat>=5.9,<6 accelerate>=0.24.1,<=0.27.0 schema==0.7.5 -tensorflow>=2.9.0,<=2.15.1 +tensorflow>=2.16.2,<=2.18.0 mlflow>=2.12.2,<2.13 huggingface_hub==0.26.2 uvicorn>=0.30.1 @@ -51,3 +51,4 @@ nest-asyncio sagemaker-mlflow>=0.1.0 deepdiff>=8.0.0 orderly-set<5.4.0 +lexicon diff --git a/requirements/tox/doc8_requirements.txt b/requirements/tox/doc8_requirements.txt index e4a040dd4d..8707c06621 100644 --- a/requirements/tox/doc8_requirements.txt +++ b/requirements/tox/doc8_requirements.txt @@ -1,2 +1,2 @@ -doc8==0.10.1 -Pygments==2.15.0 +doc8==1.1.2 +Pygments==2.18.0 diff --git a/requirements/tox/flake8_requirements.txt b/requirements/tox/flake8_requirements.txt index b3ccfca84f..63a79da444 100644 --- a/requirements/tox/flake8_requirements.txt +++ b/requirements/tox/flake8_requirements.txt @@ -1,2 +1,2 @@ -flake8==4.0.1 -flake8-future-import==0.4.6 +flake8==7.1.2 +flake8-future-import==0.4.7 diff --git a/requirements/tox/pylint_requirements.txt b/requirements/tox/pylint_requirements.txt index b307f21762..0e5db209fe 100644 --- a/requirements/tox/pylint_requirements.txt +++ b/requirements/tox/pylint_requirements.txt @@ -1,2 +1,2 @@ -pylint==2.6.2 -astroid==2.4.2 +pylint==3.0.3 +astroid==3.0.2 diff --git a/requirements/tox/spelling_requirements.txt b/requirements/tox/spelling_requirements.txt index 769415eb2c..94d6bc314e 100644 --- a/requirements/tox/spelling_requirements.txt +++ b/requirements/tox/spelling_requirements.txt @@ -1,2 +1,2 @@ pyenchant==3.2.2 -pylint==2.6.2 +pylint==3.0.3 diff --git a/src/sagemaker/config/config_schema.py b/src/sagemaker/config/config_schema.py index 34a98c0b8e..61da17e7cf 100644 --- a/src/sagemaker/config/config_schema.py +++ b/src/sagemaker/config/config_schema.py @@ -540,7 +540,8 @@ def _simple_path(*args: str): "minItems": 0, "maxItems": 50, }, - # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html#sagemaker-CreateTrainingJob-request-Environment + # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/ + # API_CreateTrainingJob.html#sagemaker-CreateTrainingJob-request-Environment "environmentVariables": { TYPE: OBJECT, ADDITIONAL_PROPERTIES: False, @@ -553,13 +554,15 @@ def _simple_path(*args: str): }, "maxProperties": 48, }, - # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_S3DataSource.html#sagemaker-Type-S3DataSource-S3Uri + # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/ + # API_S3DataSource.html#sagemaker-Type-S3DataSource-S3Uri "s3Uri": { TYPE: "string", "pattern": "^(https|s3)://([^/]+)/?(.*)$", "maxLength": 1024, }, - # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_AlgorithmSpecification.html#sagemaker-Type-AlgorithmSpecification-ContainerEntrypoint + # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/ + # API_AlgorithmSpecification.html#sagemaker-Type-AlgorithmSpecification-ContainerEntrypoint "preExecutionCommand": {TYPE: "string", "pattern": r".*"}, # Regex based on https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_PipelineDefinitionS3Location.html # except with an additional ^ and $ for the beginning and the end to closer align to @@ -570,7 +573,8 @@ def _simple_path(*args: str): "minLength": 3, "maxLength": 63, }, - # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_MonitoringJobDefinition.html#sagemaker-Type-MonitoringJobDefinition-Environment + # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/ + # API_MonitoringJobDefinition.html#sagemaker-Type-MonitoringJobDefinition-Environment "environment-Length256-Properties50": { TYPE: OBJECT, ADDITIONAL_PROPERTIES: False, @@ -583,7 +587,8 @@ def _simple_path(*args: str): }, "maxProperties": 50, }, - # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTransformJob.html#sagemaker-CreateTransformJob-request-Environment + # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/ + # API_CreateTransformJob.html#sagemaker-CreateTransformJob-request-Environment "environment-Length10240-Properties16": { TYPE: OBJECT, ADDITIONAL_PROPERTIES: False, @@ -596,7 +601,8 @@ def _simple_path(*args: str): }, "maxProperties": 16, }, - # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_ContainerDefinition.html#sagemaker-Type-ContainerDefinition-Environment + # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/ + # API_ContainerDefinition.html#sagemaker-Type-ContainerDefinition-Environment "environment-Length1024-Properties16": { TYPE: OBJECT, ADDITIONAL_PROPERTIES: False, @@ -609,7 +615,8 @@ def _simple_path(*args: str): }, "maxProperties": 16, }, - # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateProcessingJob.html#sagemaker-CreateProcessingJob-request-Environment + # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/ + # API_CreateProcessingJob.html#sagemaker-CreateProcessingJob-request-Environment "environment-Length256-Properties100": { TYPE: OBJECT, ADDITIONAL_PROPERTIES: False, @@ -622,7 +629,8 @@ def _simple_path(*args: str): }, "maxProperties": 100, }, - # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/API_CreateTrainingJob.html#sagemaker-CreateTrainingJob-request-Environment + # Regex is taken from https://docs.aws.amazon.com/sagemaker/latest/APIReference/ + # API_CreateTrainingJob.html#sagemaker-CreateTrainingJob-request-Environment "environment-Length512-Properties48": { TYPE: OBJECT, ADDITIONAL_PROPERTIES: False, diff --git a/src/sagemaker/feature_store/dataset_builder.py b/src/sagemaker/feature_store/dataset_builder.py index 289fa1ee0c..fc9f9372b1 100644 --- a/src/sagemaker/feature_store/dataset_builder.py +++ b/src/sagemaker/feature_store/dataset_builder.py @@ -929,7 +929,7 @@ def _construct_query_string(self, base: FeatureGroupToBeMerged) -> str: selected_features += ", " selected_features += ", ".join( [ - f'fg_{i}."{feature_name}" as "{feature_name}.{(i+1)}"' + f'fg_{i}."{feature_name}" as "{feature_name}.{(i + 1)}"' for feature_name in feature_group.projected_feature_names ] ) diff --git a/src/sagemaker/jumpstart/factory/model.py b/src/sagemaker/jumpstart/factory/model.py index 4245c5ac91..53ded3f275 100644 --- a/src/sagemaker/jumpstart/factory/model.py +++ b/src/sagemaker/jumpstart/factory/model.py @@ -104,7 +104,7 @@ def get_default_predictor( """ # if there's a non-default predictor, do not mutate -- return as is - if type(predictor) != Predictor: # pylint: disable=C0123 + if not isinstance(predictor, Predictor): raise RuntimeError( "Can only get default predictor from base Predictor class. " f"Using Predictor class '{type(predictor).__name__}'." diff --git a/src/sagemaker/local/entities.py b/src/sagemaker/local/entities.py index a21a375f54..0cf6c6d55a 100644 --- a/src/sagemaker/local/entities.py +++ b/src/sagemaker/local/entities.py @@ -845,10 +845,10 @@ def _initialize_and_validate_parameters(self, overridden_parameters): ) raise ClientError(error_msg, "start_pipeline_execution") parameter_type = default_parameters[param_name].parameter_type - if type(param_value) != parameter_type.python_type: # pylint: disable=C0123 + if not isinstance(param_value, parameter_type.python_type): error_msg = self._construct_validation_exception_message( - "Unexpected type for parameter '{}'. Expected {} but found " - "{}.".format(param_name, parameter_type.python_type, type(param_value)) + f"Unexpected type for parameter '{param_name}'. Expected \ + {parameter_type.python_type} but found {type(param_value)}." ) raise ClientError(error_msg, "start_pipeline_execution") if param_value == "": diff --git a/src/sagemaker/model_monitor/clarify_model_monitoring.py b/src/sagemaker/model_monitor/clarify_model_monitoring.py index 3edfabc747..2d9a4a69e4 100644 --- a/src/sagemaker/model_monitor/clarify_model_monitoring.py +++ b/src/sagemaker/model_monitor/clarify_model_monitoring.py @@ -86,11 +86,9 @@ def __init__( object that configures network isolation, encryption of inter-container traffic, security group IDs, and subnets. """ - if type(self) == __class__: # pylint: disable=unidiomatic-typecheck + if self.__class__ is __class__: raise TypeError( - "{} is abstract, please instantiate its subclasses instead.".format( - __class__.__name__ - ) + f"{__class__.__name__} is abstract, please instantiate its subclasses instead." ) session = sagemaker_session or Session() diff --git a/src/sagemaker/serve/model_server/multi_model_server/prepare.py b/src/sagemaker/serve/model_server/multi_model_server/prepare.py index 48cf5c878a..e3abc70dd6 100644 --- a/src/sagemaker/serve/model_server/multi_model_server/prepare.py +++ b/src/sagemaker/serve/model_server/multi_model_server/prepare.py @@ -84,7 +84,8 @@ def prepare_for_mms( image_uri: str, inference_spec: InferenceSpec = None, ) -> str: - """Prepares for InferenceSpec using model_path, writes inference.py, and captures dependencies to generate secret_key. + """Prepares for InferenceSpec using model_path, writes inference.py, \ + and captures dependencies to generate secret_key. Args:to model_path (str) : Argument diff --git a/src/sagemaker/serve/utils/conda_in_process.yml b/src/sagemaker/serve/utils/conda_in_process.yml index 61badaa52f..1f3fe322ef 100644 --- a/src/sagemaker/serve/utils/conda_in_process.yml +++ b/src/sagemaker/serve/utils/conda_in_process.yml @@ -12,15 +12,15 @@ dependencies: - boto3>=1.34.142,<2.0 - cloudpickle==2.2.1 - google-pasta - - numpy>=1.9.0,<2.0 + - numpy==1.26.4 - protobuf>=3.12,<5.0 - smdebug_rulesconfig==1.0.1 - importlib-metadata>=1.4.0,<7.0 - - packaging>=20.0 + - packaging>=23.0,<25 - pandas - pathos - schema - - PyYAML~=6.0 + - PyYAML>=6.0.1 - jsonschema - platformdirs - tblib>=1.7.0,<4 @@ -43,7 +43,7 @@ dependencies: - colorama>=0.4.4 - contextlib2>=21.6.0 - decorator>=5.1.1 - - dill>=0.3.6 + - dill>=0.3.9 - docutils>=0.16 - entrypoints>=0.4 - filelock>=3.11.0 @@ -82,7 +82,7 @@ dependencies: - python-dateutil>=2.8.2 - pytz>=2023.3 - pytz-deprecation-shim>=0.1.0.post0 - - pyyaml>=5.4.1 + - pyyaml>=6.0.1 - regex>=2023.3.23 - requests>=2.28.2 - rich>=13.3.4 diff --git a/src/sagemaker/serve/utils/in_process_requirements.txt b/src/sagemaker/serve/utils/in_process_requirements.txt index e356e1720d..da1fd8e617 100644 --- a/src/sagemaker/serve/utils/in_process_requirements.txt +++ b/src/sagemaker/serve/utils/in_process_requirements.txt @@ -11,7 +11,7 @@ cloudpickle==2.2.1 colorama>=0.4.4 contextlib2>=21.6.0 decorator>=5.1.1 -dill>=0.3.6 +dill>=0.3.9 docutils>=0.16 entrypoints>=0.4 filelock>=3.11.0 @@ -50,7 +50,7 @@ pyrsistent>=0.19.3 python-dateutil>=2.8.2 pytz>=2023.3 pytz-deprecation-shim>=0.1.0.post0 -pyyaml>=5.4.1 +pyyaml>=6.0.1 regex>=2023.3.23 requests>=2.28.2 rich>=13.3.4 diff --git a/tests/data/pipeline/model_step/pytorch_mnist/requirements.txt b/tests/data/pipeline/model_step/pytorch_mnist/requirements.txt index 56d09228be..c25fca7e9f 100644 --- a/tests/data/pipeline/model_step/pytorch_mnist/requirements.txt +++ b/tests/data/pipeline/model_step/pytorch_mnist/requirements.txt @@ -1 +1 @@ -scipy>=1.8.1 +scipy>=1.11.3 diff --git a/tests/data/remote_function/requirements.txt b/tests/data/remote_function/requirements.txt index 0e99587e6e..44ce1d9331 100644 --- a/tests/data/remote_function/requirements.txt +++ b/tests/data/remote_function/requirements.txt @@ -1 +1 @@ -scipy==1.10.1 +scipy==1.11.3 diff --git a/tests/data/serve_resources/mlflow/pytorch/conda.yaml b/tests/data/serve_resources/mlflow/pytorch/conda.yaml index beecdbab08..b740d25b70 100644 --- a/tests/data/serve_resources/mlflow/pytorch/conda.yaml +++ b/tests/data/serve_resources/mlflow/pytorch/conda.yaml @@ -9,7 +9,7 @@ dependencies: - cffi==1.16.0 - cloudpickle==2.2.1 - defusedxml==0.7.1 - - dill==0.3.8 + - dill==0.3.9 - gmpy2==2.1.2 - numpy==1.26.4 - opt-einsum==3.3.0 diff --git a/tests/data/serve_resources/mlflow/pytorch/requirements.txt b/tests/data/serve_resources/mlflow/pytorch/requirements.txt index 450bcbfada..aacc85cb91 100644 --- a/tests/data/serve_resources/mlflow/pytorch/requirements.txt +++ b/tests/data/serve_resources/mlflow/pytorch/requirements.txt @@ -3,11 +3,11 @@ astunparse==1.6.3 cffi==1.16.0 cloudpickle==2.2.1 defusedxml==0.7.1 -dill==0.3.8 +dill==0.3.9 gmpy2==2.1.2 -numpy==1.24.4 +numpy==1.26.4 opt-einsum==3.3.0 -packaging==21.3 +packaging>=23.0,<25 pandas==2.2.1 pyyaml==6.0.1 requests==2.32.2 diff --git a/tests/data/serve_resources/mlflow/xgboost/requirements.txt b/tests/data/serve_resources/mlflow/xgboost/requirements.txt index 1130dcaec5..6f879340a7 100644 --- a/tests/data/serve_resources/mlflow/xgboost/requirements.txt +++ b/tests/data/serve_resources/mlflow/xgboost/requirements.txt @@ -1,8 +1,8 @@ mlflow==2.13.2 lz4==4.3.2 -numpy==1.24.4 +numpy==1.26.4 pandas==2.0.3 psutil==5.9.8 scikit-learn==1.3.2 -scipy==1.10.1 +scipy==1.11.3 xgboost==1.7.1 diff --git a/tests/data/workflow/requirements.txt b/tests/data/workflow/requirements.txt index 0e99587e6e..44ce1d9331 100644 --- a/tests/data/workflow/requirements.txt +++ b/tests/data/workflow/requirements.txt @@ -1 +1 @@ -scipy==1.10.1 +scipy==1.11.3 diff --git a/tests/integ/sagemaker/experiments/test_run.py b/tests/integ/sagemaker/experiments/test_run.py index 4f59d11c54..f00f53a5ad 100644 --- a/tests/integ/sagemaker/experiments/test_run.py +++ b/tests/integ/sagemaker/experiments/test_run.py @@ -720,8 +720,8 @@ def _generate_processor( ) return FrameworkProcessor( estimator_cls=PyTorch, - framework_version="1.10", - py_version="py38", + framework_version="1.13.1", + py_version="py39", instance_count=1, instance_type="ml.m5.xlarge", role=execution_role, diff --git a/tests/integ/sagemaker/jumpstart/private_hub/test_hub_content.py b/tests/integ/sagemaker/jumpstart/private_hub/test_hub_content.py index b25cff2d62..04b945a457 100644 --- a/tests/integ/sagemaker/jumpstart/private_hub/test_hub_content.py +++ b/tests/integ/sagemaker/jumpstart/private_hub/test_hub_content.py @@ -38,7 +38,7 @@ def test_hub_model_reference(setup): describe_model_response = hub_instance.describe_model(model_name=model_id) assert describe_model_response is not None - assert type(describe_model_response) == DescribeHubContentResponse + assert isinstance(describe_model_response, DescribeHubContentResponse) assert describe_model_response.hub_content_name == model_id assert describe_model_response.hub_content_type == "ModelReference" diff --git a/tests/integ/sagemaker/serve/test_serve_js_deep_unit_tests.py b/tests/integ/sagemaker/serve/test_serve_js_deep_unit_tests.py index e13e672bec..ea65f998c8 100644 --- a/tests/integ/sagemaker/serve/test_serve_js_deep_unit_tests.py +++ b/tests/integ/sagemaker/serve/test_serve_js_deep_unit_tests.py @@ -24,11 +24,12 @@ def test_js_model_with_optimize_speculative_decoding_config_gated_requests_are_expected( sagemaker_session, ): - with patch.object( - Session, "create_model", return_value="mock_model" - ) as mock_create_model, patch.object( - Session, "endpoint_from_production_variants" - ) as mock_endpoint_from_production_variants: + with ( + patch.object(Session, "create_model", return_value="mock_model") as mock_create_model, + patch.object( + Session, "endpoint_from_production_variants" + ) as mock_endpoint_from_production_variants, + ): iam_client = sagemaker_session.boto_session.client("iam") role_arn = iam_client.get_role(RoleName=ROLE_NAME)["Role"]["Arn"] @@ -100,17 +101,18 @@ def test_js_model_with_optimize_speculative_decoding_config_gated_requests_are_e def test_js_model_with_optimize_sharding_and_resource_requirements_requests_are_expected( sagemaker_session, ): - with patch.object( - Session, - "wait_for_optimization_job", - return_value={"OptimizationJobName": "mock_optimization_job"}, - ), patch.object( - Session, "create_model", return_value="mock_model" - ) as mock_create_model, patch.object( - Session, "endpoint_from_production_variants", return_value="mock_endpoint_name" - ) as mock_endpoint_from_production_variants, patch.object( - Session, "create_inference_component" - ) as mock_create_inference_component: + with ( + patch.object( + Session, + "wait_for_optimization_job", + return_value={"OptimizationJobName": "mock_optimization_job"}, + ), + patch.object(Session, "create_model", return_value="mock_model") as mock_create_model, + patch.object( + Session, "endpoint_from_production_variants", return_value="mock_endpoint_name" + ) as mock_endpoint_from_production_variants, + patch.object(Session, "create_inference_component") as mock_create_inference_component, + ): iam_client = sagemaker_session.boto_session.client("iam") role_arn = iam_client.get_role(RoleName=ROLE_NAME)["Role"]["Arn"] @@ -185,15 +187,17 @@ def test_js_model_with_optimize_sharding_and_resource_requirements_requests_are_ def test_js_model_with_optimize_quantization_on_pre_optimized_model_requests_are_expected( sagemaker_session, ): - with patch.object( - Session, - "wait_for_optimization_job", - return_value={"OptimizationJobName": "mock_optimization_job"}, - ), patch.object( - Session, "create_model", return_value="mock_model" - ) as mock_create_model, patch.object( - Session, "endpoint_from_production_variants", return_value="mock_endpoint_name" - ) as mock_endpoint_from_production_variants: + with ( + patch.object( + Session, + "wait_for_optimization_job", + return_value={"OptimizationJobName": "mock_optimization_job"}, + ), + patch.object(Session, "create_model", return_value="mock_model") as mock_create_model, + patch.object( + Session, "endpoint_from_production_variants", return_value="mock_endpoint_name" + ) as mock_endpoint_from_production_variants, + ): iam_client = sagemaker_session.boto_session.client("iam") role_arn = iam_client.get_role(RoleName=ROLE_NAME)["Role"]["Arn"] diff --git a/tests/integ/sagemaker/workflow/helpers.py b/tests/integ/sagemaker/workflow/helpers.py index 20365ef169..9f0176c5c2 100644 --- a/tests/integ/sagemaker/workflow/helpers.py +++ b/tests/integ/sagemaker/workflow/helpers.py @@ -70,8 +70,8 @@ def create_and_execute_pipeline( assert execution_steps[0]["StepStatus"] == step_status if step_result_type: result = execution.result(execution_steps[0]["StepName"]) - assert ( - type(result) == step_result_type + assert isinstance( + result, step_result_type ), f"Expected {step_result_type}, instead found {type(result)}" if step_result_value: diff --git a/tests/integ/sagemaker/workflow/test_workflow.py b/tests/integ/sagemaker/workflow/test_workflow.py index 2643a3b88e..9ef0b14a04 100644 --- a/tests/integ/sagemaker/workflow/test_workflow.py +++ b/tests/integ/sagemaker/workflow/test_workflow.py @@ -1122,8 +1122,8 @@ def test_model_registration_with_tuning_model( entry_point=entry_point, source_dir=base_dir, role=role, - framework_version="1.10", - py_version="py38", + framework_version="1.13.1", + py_version="py39", instance_count=instance_count, instance_type=instance_type, sagemaker_session=pipeline_session, @@ -1159,8 +1159,8 @@ def test_model_registration_with_tuning_model( ), entry_point=entry_point, source_dir=base_dir, - framework_version="1.10", - py_version="py38", + framework_version="1.13.1", + py_version="py39", sagemaker_session=pipeline_session, ) step_model_regis_args = model.register( diff --git a/tests/integ/test_feature_store.py b/tests/integ/test_feature_store.py index 43db78527a..75f1807148 100644 --- a/tests/integ/test_feature_store.py +++ b/tests/integ/test_feature_store.py @@ -1645,9 +1645,11 @@ def test_create_dataset_with_feature_group_base( feature_store_session, feature_group, offline_store_s3_uri ) - with timeout(minutes=10) and cleanup_offline_store( - base, feature_store_session - ) and cleanup_offline_store(feature_group, feature_store_session): + with ( + timeout(minutes=10) + and cleanup_offline_store(base, feature_store_session) + and cleanup_offline_store(feature_group, feature_store_session) + ): feature_store = FeatureStore(sagemaker_session=feature_store_session) df, query_string = ( feature_store.create_dataset(base=base, output_path=offline_store_s3_uri) @@ -1832,9 +1834,11 @@ def test_create_dataset_with_feature_group_base_with_additional_params( feature_store_session, feature_group, offline_store_s3_uri ) - with timeout(minutes=10) and cleanup_offline_store( - base, feature_store_session - ) and cleanup_offline_store(feature_group, feature_store_session): + with ( + timeout(minutes=10) + and cleanup_offline_store(base, feature_store_session) + and cleanup_offline_store(feature_group, feature_store_session) + ): feature_store = FeatureStore(sagemaker_session=feature_store_session) df, query_string = ( feature_store.create_dataset(base=base, output_path=offline_store_s3_uri) diff --git a/tests/unit/sagemaker/feature_store/feature_processor/lineage/test_feature_processor_lineage.py b/tests/unit/sagemaker/feature_store/feature_processor/lineage/test_feature_processor_lineage.py index 118800dd0f..f149823b2f 100644 --- a/tests/unit/sagemaker/feature_store/feature_processor/lineage/test_feature_processor_lineage.py +++ b/tests/unit/sagemaker/feature_store/feature_processor/lineage/test_feature_processor_lineage.py @@ -113,69 +113,85 @@ def test_create_lineage_when_no_lineage_exists_with_fg_only(): transformation_code=TRANSFORMATION_CODE_INPUT_1, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - FeatureGroupLineageEntityHandler, - "retrieve_feature_group_context_arns", - side_effect=[ - FEATURE_GROUP_INPUT[0], - FEATURE_GROUP_INPUT[1], - FEATURE_GROUP_INPUT[0], - ], - ) as retrieve_feature_group_context_arns_method, patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[ - RAW_DATA_INPUT_ARTIFACTS[0], - RAW_DATA_INPUT_ARTIFACTS[1], - RAW_DATA_INPUT_ARTIFACTS[2], - RAW_DATA_INPUT_ARTIFACTS[3], - ], - ) as retrieve_raw_data_artifact_method, patch.object( - S3LineageEntityHandler, - "create_transformation_code_artifact", - return_value=TRANSFORMATION_CODE_ARTIFACT_1, - ) as create_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - side_effect=RESOURCE_NOT_FOUND_EXCEPTION, - ) as load_pipeline_context_method, patch.object( - PipelineLineageEntityHandler, - "create_pipeline_context", - return_value=PIPELINE_CONTEXT, - ), patch.object( - PipelineVersionLineageEntityHandler, - "create_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ), patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - [], - generate_pipeline_version_upstream_transformation_code(), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - PipelineLineageEntityHandler, - "update_pipeline_context", - ) as update_pipeline_context_method, patch.object( - LineageAssociationHandler, "add_upstream_feature_group_data_associations" - ) as add_upstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_downstream_feature_group_data_associations" - ) as add_downstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_raw_data_associations" - ) as add_upstream_raw_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_transformation_code_associations" - ) as add_upstream_transformation_code_associations_method, patch.object( - LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" - ) as add_pipeline_and_pipeline_version_association_method: + with ( + patch.object( + FeatureGroupLineageEntityHandler, + "retrieve_feature_group_context_arns", + side_effect=[ + FEATURE_GROUP_INPUT[0], + FEATURE_GROUP_INPUT[1], + FEATURE_GROUP_INPUT[0], + ], + ) as retrieve_feature_group_context_arns_method, + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[ + RAW_DATA_INPUT_ARTIFACTS[0], + RAW_DATA_INPUT_ARTIFACTS[1], + RAW_DATA_INPUT_ARTIFACTS[2], + RAW_DATA_INPUT_ARTIFACTS[3], + ], + ) as retrieve_raw_data_artifact_method, + patch.object( + S3LineageEntityHandler, + "create_transformation_code_artifact", + return_value=TRANSFORMATION_CODE_ARTIFACT_1, + ) as create_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + side_effect=RESOURCE_NOT_FOUND_EXCEPTION, + ) as load_pipeline_context_method, + patch.object( + PipelineLineageEntityHandler, + "create_pipeline_context", + return_value=PIPELINE_CONTEXT, + ), + patch.object( + PipelineVersionLineageEntityHandler, + "create_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ), + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + [], + generate_pipeline_version_upstream_transformation_code(), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + PipelineLineageEntityHandler, + "update_pipeline_context", + ) as update_pipeline_context_method, + patch.object( + LineageAssociationHandler, "add_upstream_feature_group_data_associations" + ) as add_upstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_downstream_feature_group_data_associations" + ) as add_downstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_raw_data_associations" + ) as add_upstream_raw_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_transformation_code_associations" + ) as add_upstream_transformation_code_associations_method, + patch.object( + LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" + ) as add_pipeline_and_pipeline_version_association_method, + ): lineage_handler.create_lineage() retrieve_feature_group_context_arns_method.assert_has_calls( @@ -259,75 +275,92 @@ def test_create_lineage_when_no_lineage_exists_with_raw_data_only(): transformation_code=TRANSFORMATION_CODE_INPUT_1, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - FeatureGroupLineageEntityHandler, - "retrieve_feature_group_context_arns", - side_effect=[ - FEATURE_GROUP_INPUT[0], - FEATURE_GROUP_INPUT[1], - FEATURE_GROUP_INPUT[0], - ], - ) as retrieve_feature_group_context_arns_method, patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[ - RAW_DATA_INPUT_ARTIFACTS[0], - RAW_DATA_INPUT_ARTIFACTS[1], - RAW_DATA_INPUT_ARTIFACTS[2], - RAW_DATA_INPUT_ARTIFACTS[3], - ], - ) as retrieve_raw_data_artifact_method, patch.object( - S3LineageEntityHandler, - "create_transformation_code_artifact", - return_value=TRANSFORMATION_CODE_ARTIFACT_1, - ) as create_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - side_effect=RESOURCE_NOT_FOUND_EXCEPTION, - ) as load_pipeline_context_method, patch.object( - PipelineLineageEntityHandler, - "create_pipeline_context", - return_value=PIPELINE_CONTEXT, - ), patch.object( - PipelineVersionLineageEntityHandler, - "create_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ), patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - [], - generate_pipeline_version_upstream_transformation_code(), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - PipelineLineageEntityHandler, - "update_pipeline_context", - ) as update_pipeline_context_method, patch.object( - LineageAssociationHandler, "add_upstream_feature_group_data_associations" - ) as add_upstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_downstream_feature_group_data_associations" - ) as add_downstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_raw_data_associations" - ) as add_upstream_raw_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_transformation_code_associations" - ) as add_upstream_transformation_code_associations_method, patch.object( - LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" - ) as add_pipeline_and_pipeline_version_association_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + FeatureGroupLineageEntityHandler, + "retrieve_feature_group_context_arns", + side_effect=[ + FEATURE_GROUP_INPUT[0], + FEATURE_GROUP_INPUT[1], + FEATURE_GROUP_INPUT[0], + ], + ) as retrieve_feature_group_context_arns_method, + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[ + RAW_DATA_INPUT_ARTIFACTS[0], + RAW_DATA_INPUT_ARTIFACTS[1], + RAW_DATA_INPUT_ARTIFACTS[2], + RAW_DATA_INPUT_ARTIFACTS[3], + ], + ) as retrieve_raw_data_artifact_method, + patch.object( + S3LineageEntityHandler, + "create_transformation_code_artifact", + return_value=TRANSFORMATION_CODE_ARTIFACT_1, + ) as create_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + side_effect=RESOURCE_NOT_FOUND_EXCEPTION, + ) as load_pipeline_context_method, + patch.object( + PipelineLineageEntityHandler, + "create_pipeline_context", + return_value=PIPELINE_CONTEXT, + ), + patch.object( + PipelineVersionLineageEntityHandler, + "create_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ), + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + [], + generate_pipeline_version_upstream_transformation_code(), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + PipelineLineageEntityHandler, + "update_pipeline_context", + ) as update_pipeline_context_method, + patch.object( + LineageAssociationHandler, "add_upstream_feature_group_data_associations" + ) as add_upstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_downstream_feature_group_data_associations" + ) as add_downstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_raw_data_associations" + ) as add_upstream_raw_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_transformation_code_associations" + ) as add_upstream_transformation_code_associations_method, + patch.object( + LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" + ) as add_pipeline_and_pipeline_version_association_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_lineage(TAGS) retrieve_feature_group_context_arns_method.assert_called_once_with( @@ -408,75 +441,92 @@ def test_create_lineage_when_no_lineage_exists_with_fg_and_raw_data_with_tags(): transformation_code=TRANSFORMATION_CODE_INPUT_1, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - FeatureGroupLineageEntityHandler, - "retrieve_feature_group_context_arns", - side_effect=[ - FEATURE_GROUP_INPUT[0], - FEATURE_GROUP_INPUT[1], - FEATURE_GROUP_INPUT[0], - ], - ) as retrieve_feature_group_context_arns_method, patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[ - RAW_DATA_INPUT_ARTIFACTS[0], - RAW_DATA_INPUT_ARTIFACTS[1], - RAW_DATA_INPUT_ARTIFACTS[2], - RAW_DATA_INPUT_ARTIFACTS[3], - ], - ) as retrieve_raw_data_artifact_method, patch.object( - S3LineageEntityHandler, - "create_transformation_code_artifact", - return_value=TRANSFORMATION_CODE_ARTIFACT_1, - ) as create_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - side_effect=RESOURCE_NOT_FOUND_EXCEPTION, - ) as load_pipeline_context_method, patch.object( - PipelineLineageEntityHandler, - "create_pipeline_context", - return_value=PIPELINE_CONTEXT, - ), patch.object( - PipelineVersionLineageEntityHandler, - "create_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ), patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - [], - generate_pipeline_version_upstream_transformation_code(), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - PipelineLineageEntityHandler, - "update_pipeline_context", - ) as update_pipeline_context_method, patch.object( - LineageAssociationHandler, "add_upstream_feature_group_data_associations" - ) as add_upstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_downstream_feature_group_data_associations" - ) as add_downstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_raw_data_associations" - ) as add_upstream_raw_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_transformation_code_associations" - ) as add_upstream_transformation_code_associations_method, patch.object( - LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" - ) as add_pipeline_and_pipeline_version_association_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + FeatureGroupLineageEntityHandler, + "retrieve_feature_group_context_arns", + side_effect=[ + FEATURE_GROUP_INPUT[0], + FEATURE_GROUP_INPUT[1], + FEATURE_GROUP_INPUT[0], + ], + ) as retrieve_feature_group_context_arns_method, + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[ + RAW_DATA_INPUT_ARTIFACTS[0], + RAW_DATA_INPUT_ARTIFACTS[1], + RAW_DATA_INPUT_ARTIFACTS[2], + RAW_DATA_INPUT_ARTIFACTS[3], + ], + ) as retrieve_raw_data_artifact_method, + patch.object( + S3LineageEntityHandler, + "create_transformation_code_artifact", + return_value=TRANSFORMATION_CODE_ARTIFACT_1, + ) as create_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + side_effect=RESOURCE_NOT_FOUND_EXCEPTION, + ) as load_pipeline_context_method, + patch.object( + PipelineLineageEntityHandler, + "create_pipeline_context", + return_value=PIPELINE_CONTEXT, + ), + patch.object( + PipelineVersionLineageEntityHandler, + "create_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ), + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + [], + generate_pipeline_version_upstream_transformation_code(), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + PipelineLineageEntityHandler, + "update_pipeline_context", + ) as update_pipeline_context_method, + patch.object( + LineageAssociationHandler, "add_upstream_feature_group_data_associations" + ) as add_upstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_downstream_feature_group_data_associations" + ) as add_downstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_raw_data_associations" + ) as add_upstream_raw_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_transformation_code_associations" + ) as add_upstream_transformation_code_associations_method, + patch.object( + LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" + ) as add_pipeline_and_pipeline_version_association_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_lineage(TAGS) retrieve_feature_group_context_arns_method.assert_has_calls( @@ -569,75 +619,92 @@ def test_create_lineage_when_no_lineage_exists_with_no_transformation_code(): output=FEATURE_GROUP_DATA_SOURCE[0].name, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - FeatureGroupLineageEntityHandler, - "retrieve_feature_group_context_arns", - side_effect=[ - FEATURE_GROUP_INPUT[0], - FEATURE_GROUP_INPUT[1], - FEATURE_GROUP_INPUT[0], - ], - ) as retrieve_feature_group_context_arns_method, patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[ - RAW_DATA_INPUT_ARTIFACTS[0], - RAW_DATA_INPUT_ARTIFACTS[1], - RAW_DATA_INPUT_ARTIFACTS[2], - RAW_DATA_INPUT_ARTIFACTS[3], - ], - ) as retrieve_raw_data_artifact_method, patch.object( - S3LineageEntityHandler, - "create_transformation_code_artifact", - return_value=None, - ) as create_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - side_effect=RESOURCE_NOT_FOUND_EXCEPTION, - ) as load_pipeline_context_method, patch.object( - PipelineLineageEntityHandler, - "create_pipeline_context", - return_value=PIPELINE_CONTEXT, - ), patch.object( - PipelineVersionLineageEntityHandler, - "create_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ), patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - [], - generate_pipeline_version_upstream_transformation_code(), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - PipelineLineageEntityHandler, - "update_pipeline_context", - ) as update_pipeline_context_method, patch.object( - LineageAssociationHandler, "add_upstream_feature_group_data_associations" - ) as add_upstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_downstream_feature_group_data_associations" - ) as add_downstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_raw_data_associations" - ) as add_upstream_raw_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_transformation_code_associations" - ) as add_upstream_transformation_code_associations_method, patch.object( - LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" - ) as add_pipeline_and_pipeline_version_association_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + FeatureGroupLineageEntityHandler, + "retrieve_feature_group_context_arns", + side_effect=[ + FEATURE_GROUP_INPUT[0], + FEATURE_GROUP_INPUT[1], + FEATURE_GROUP_INPUT[0], + ], + ) as retrieve_feature_group_context_arns_method, + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[ + RAW_DATA_INPUT_ARTIFACTS[0], + RAW_DATA_INPUT_ARTIFACTS[1], + RAW_DATA_INPUT_ARTIFACTS[2], + RAW_DATA_INPUT_ARTIFACTS[3], + ], + ) as retrieve_raw_data_artifact_method, + patch.object( + S3LineageEntityHandler, + "create_transformation_code_artifact", + return_value=None, + ) as create_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + side_effect=RESOURCE_NOT_FOUND_EXCEPTION, + ) as load_pipeline_context_method, + patch.object( + PipelineLineageEntityHandler, + "create_pipeline_context", + return_value=PIPELINE_CONTEXT, + ), + patch.object( + PipelineVersionLineageEntityHandler, + "create_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ), + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + [], + generate_pipeline_version_upstream_transformation_code(), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + PipelineLineageEntityHandler, + "update_pipeline_context", + ) as update_pipeline_context_method, + patch.object( + LineageAssociationHandler, "add_upstream_feature_group_data_associations" + ) as add_upstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_downstream_feature_group_data_associations" + ) as add_downstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_raw_data_associations" + ) as add_upstream_raw_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_transformation_code_associations" + ) as add_upstream_transformation_code_associations_method, + patch.object( + LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" + ) as add_pipeline_and_pipeline_version_association_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_lineage(TAGS) retrieve_feature_group_context_arns_method.assert_has_calls( @@ -728,78 +795,96 @@ def test_create_lineage_when_already_exist_with_no_version_change(): transformation_code=TRANSFORMATION_CODE_INPUT_1, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - FeatureGroupLineageEntityHandler, - "retrieve_feature_group_context_arns", - side_effect=[ - FEATURE_GROUP_INPUT[0], - FEATURE_GROUP_INPUT[1], - FEATURE_GROUP_INPUT[0], - ], - ) as retrieve_feature_group_context_arns_method, patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[ - RAW_DATA_INPUT_ARTIFACTS[0], - RAW_DATA_INPUT_ARTIFACTS[1], - RAW_DATA_INPUT_ARTIFACTS[2], - RAW_DATA_INPUT_ARTIFACTS[3], - ], - ) as retrieve_raw_data_artifact_method, patch.object( - S3LineageEntityHandler, - "create_transformation_code_artifact", - return_value=TRANSFORMATION_CODE_ARTIFACT_1, - ) as create_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - return_value=PIPELINE_CONTEXT, - ) as load_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - generate_pipeline_version_upstream_raw_data_list(), - generate_pipeline_version_upstream_transformation_code(), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - S3LineageEntityHandler, - "load_artifact_from_arn", - return_value=transformation_code_1, - ) as load_artifact_from_arn_method, patch.object( - S3LineageEntityHandler, - "update_transformation_code_artifact", - ) as update_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "update_pipeline_context", - ) as update_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "create_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as create_pipeline_version_context_method, patch.object( - LineageAssociationHandler, "add_upstream_feature_group_data_associations" - ) as add_upstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_downstream_feature_group_data_associations" - ) as add_downstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_raw_data_associations" - ) as add_upstream_raw_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_transformation_code_associations" - ) as add_upstream_transformation_code_associations_method, patch.object( - LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" - ) as add_pipeline_and_pipeline_version_association_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + FeatureGroupLineageEntityHandler, + "retrieve_feature_group_context_arns", + side_effect=[ + FEATURE_GROUP_INPUT[0], + FEATURE_GROUP_INPUT[1], + FEATURE_GROUP_INPUT[0], + ], + ) as retrieve_feature_group_context_arns_method, + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[ + RAW_DATA_INPUT_ARTIFACTS[0], + RAW_DATA_INPUT_ARTIFACTS[1], + RAW_DATA_INPUT_ARTIFACTS[2], + RAW_DATA_INPUT_ARTIFACTS[3], + ], + ) as retrieve_raw_data_artifact_method, + patch.object( + S3LineageEntityHandler, + "create_transformation_code_artifact", + return_value=TRANSFORMATION_CODE_ARTIFACT_1, + ) as create_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + return_value=PIPELINE_CONTEXT, + ) as load_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + generate_pipeline_version_upstream_raw_data_list(), + generate_pipeline_version_upstream_transformation_code(), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + S3LineageEntityHandler, + "load_artifact_from_arn", + return_value=transformation_code_1, + ) as load_artifact_from_arn_method, + patch.object( + S3LineageEntityHandler, + "update_transformation_code_artifact", + ) as update_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "update_pipeline_context", + ) as update_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "create_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as create_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, "add_upstream_feature_group_data_associations" + ) as add_upstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_downstream_feature_group_data_associations" + ) as add_downstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_raw_data_associations" + ) as add_upstream_raw_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_transformation_code_associations" + ) as add_upstream_transformation_code_associations_method, + patch.object( + LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" + ) as add_pipeline_and_pipeline_version_association_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_lineage(TAGS) retrieve_feature_group_context_arns_method.assert_has_calls( @@ -925,73 +1010,91 @@ def test_create_lineage_when_already_exist_with_changed_raw_data(): transformation_code=TRANSFORMATION_CODE_INPUT_1, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - FeatureGroupLineageEntityHandler, - "retrieve_feature_group_context_arns", - side_effect=[ - FEATURE_GROUP_INPUT[0], - FEATURE_GROUP_INPUT[1], - FEATURE_GROUP_INPUT[0], - ], - ) as retrieve_feature_group_context_arns_method, patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[RAW_DATA_INPUT_ARTIFACTS[0], RAW_DATA_INPUT_ARTIFACTS[1]], - ) as retrieve_raw_data_artifact_method, patch.object( - S3LineageEntityHandler, - "create_transformation_code_artifact", - return_value=TRANSFORMATION_CODE_ARTIFACT_1, - ) as create_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - return_value=pipeline_context, - ) as load_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - generate_pipeline_version_upstream_raw_data_list(), - generate_pipeline_version_upstream_transformation_code(), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - S3LineageEntityHandler, - "load_artifact_from_arn", - return_value=transformation_code_1, - ) as load_artifact_from_arn_method, patch.object( - S3LineageEntityHandler, - "update_transformation_code_artifact", - ) as update_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "update_pipeline_context", - ) as update_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "create_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ), patch.object( - LineageAssociationHandler, "add_upstream_feature_group_data_associations" - ) as add_upstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_downstream_feature_group_data_associations" - ) as add_downstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_raw_data_associations" - ) as add_upstream_raw_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_transformation_code_associations" - ) as add_upstream_transformation_code_associations_method, patch.object( - LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" - ) as add_pipeline_and_pipeline_version_association_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + FeatureGroupLineageEntityHandler, + "retrieve_feature_group_context_arns", + side_effect=[ + FEATURE_GROUP_INPUT[0], + FEATURE_GROUP_INPUT[1], + FEATURE_GROUP_INPUT[0], + ], + ) as retrieve_feature_group_context_arns_method, + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[RAW_DATA_INPUT_ARTIFACTS[0], RAW_DATA_INPUT_ARTIFACTS[1]], + ) as retrieve_raw_data_artifact_method, + patch.object( + S3LineageEntityHandler, + "create_transformation_code_artifact", + return_value=TRANSFORMATION_CODE_ARTIFACT_1, + ) as create_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + return_value=pipeline_context, + ) as load_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + generate_pipeline_version_upstream_raw_data_list(), + generate_pipeline_version_upstream_transformation_code(), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + S3LineageEntityHandler, + "load_artifact_from_arn", + return_value=transformation_code_1, + ) as load_artifact_from_arn_method, + patch.object( + S3LineageEntityHandler, + "update_transformation_code_artifact", + ) as update_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "update_pipeline_context", + ) as update_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "create_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ), + patch.object( + LineageAssociationHandler, "add_upstream_feature_group_data_associations" + ) as add_upstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_downstream_feature_group_data_associations" + ) as add_downstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_raw_data_associations" + ) as add_upstream_raw_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_transformation_code_associations" + ) as add_upstream_transformation_code_associations_method, + patch.object( + LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" + ) as add_pipeline_and_pipeline_version_association_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_lineage(TAGS) retrieve_feature_group_context_arns_method.assert_has_calls( @@ -1140,74 +1243,92 @@ def test_create_lineage_when_already_exist_with_changed_input_fg(): transformation_code=TRANSFORMATION_CODE_INPUT_1, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - FeatureGroupLineageEntityHandler, - "retrieve_feature_group_context_arns", - side_effect=[FEATURE_GROUP_INPUT[0], FEATURE_GROUP_INPUT[0]], - ) as retrieve_feature_group_context_arns_method, patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[ - RAW_DATA_INPUT_ARTIFACTS[0], - RAW_DATA_INPUT_ARTIFACTS[1], - RAW_DATA_INPUT_ARTIFACTS[2], - RAW_DATA_INPUT_ARTIFACTS[3], - ], - ) as retrieve_raw_data_artifact_method, patch.object( - S3LineageEntityHandler, - "create_transformation_code_artifact", - return_value=TRANSFORMATION_CODE_ARTIFACT_1, - ) as create_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - return_value=pipeline_context, - ) as load_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - generate_pipeline_version_upstream_raw_data_list(), - generate_pipeline_version_upstream_transformation_code(), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - S3LineageEntityHandler, - "load_artifact_from_arn", - return_value=transformation_code_1, - ) as load_artifact_from_arn_method, patch.object( - S3LineageEntityHandler, - "update_transformation_code_artifact", - ) as update_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "update_pipeline_context", - ) as update_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "create_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ), patch.object( - LineageAssociationHandler, "add_upstream_feature_group_data_associations" - ) as add_upstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_downstream_feature_group_data_associations" - ) as add_downstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_raw_data_associations" - ) as add_upstream_raw_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_transformation_code_associations" - ) as add_upstream_transformation_code_associations_method, patch.object( - LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" - ) as add_pipeline_and_pipeline_version_association_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + FeatureGroupLineageEntityHandler, + "retrieve_feature_group_context_arns", + side_effect=[FEATURE_GROUP_INPUT[0], FEATURE_GROUP_INPUT[0]], + ) as retrieve_feature_group_context_arns_method, + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[ + RAW_DATA_INPUT_ARTIFACTS[0], + RAW_DATA_INPUT_ARTIFACTS[1], + RAW_DATA_INPUT_ARTIFACTS[2], + RAW_DATA_INPUT_ARTIFACTS[3], + ], + ) as retrieve_raw_data_artifact_method, + patch.object( + S3LineageEntityHandler, + "create_transformation_code_artifact", + return_value=TRANSFORMATION_CODE_ARTIFACT_1, + ) as create_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + return_value=pipeline_context, + ) as load_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + generate_pipeline_version_upstream_raw_data_list(), + generate_pipeline_version_upstream_transformation_code(), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + S3LineageEntityHandler, + "load_artifact_from_arn", + return_value=transformation_code_1, + ) as load_artifact_from_arn_method, + patch.object( + S3LineageEntityHandler, + "update_transformation_code_artifact", + ) as update_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "update_pipeline_context", + ) as update_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "create_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ), + patch.object( + LineageAssociationHandler, "add_upstream_feature_group_data_associations" + ) as add_upstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_downstream_feature_group_data_associations" + ) as add_downstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_raw_data_associations" + ) as add_upstream_raw_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_transformation_code_associations" + ) as add_upstream_transformation_code_associations_method, + patch.object( + LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" + ) as add_pipeline_and_pipeline_version_association_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_lineage(TAGS) retrieve_feature_group_context_arns_method.assert_has_calls( @@ -1354,78 +1475,96 @@ def test_create_lineage_when_already_exist_with_changed_output_fg(): transformation_code=TRANSFORMATION_CODE_INPUT_1, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - FeatureGroupLineageEntityHandler, - "retrieve_feature_group_context_arns", - side_effect=[ - FEATURE_GROUP_INPUT[0], - FEATURE_GROUP_INPUT[1], - FEATURE_GROUP_INPUT[1], - ], - ) as retrieve_feature_group_context_arns_method, patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[ - RAW_DATA_INPUT_ARTIFACTS[0], - RAW_DATA_INPUT_ARTIFACTS[1], - RAW_DATA_INPUT_ARTIFACTS[2], - RAW_DATA_INPUT_ARTIFACTS[3], - ], - ) as retrieve_raw_data_artifact_method, patch.object( - S3LineageEntityHandler, - "create_transformation_code_artifact", - return_value=TRANSFORMATION_CODE_ARTIFACT_1, - ) as create_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - return_value=pipeline_context, - ) as load_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - generate_pipeline_version_upstream_raw_data_list(), - generate_pipeline_version_upstream_transformation_code(), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - S3LineageEntityHandler, - "load_artifact_from_arn", - return_value=transformation_code_1, - ) as load_artifact_from_arn_method, patch.object( - S3LineageEntityHandler, - "update_transformation_code_artifact", - ) as update_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "update_pipeline_context", - ) as update_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "create_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ), patch.object( - LineageAssociationHandler, "add_upstream_feature_group_data_associations" - ) as add_upstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_downstream_feature_group_data_associations" - ) as add_downstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_raw_data_associations" - ) as add_upstream_raw_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_transformation_code_associations" - ) as add_upstream_transformation_code_associations_method, patch.object( - LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" - ) as add_pipeline_and_pipeline_version_association_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + FeatureGroupLineageEntityHandler, + "retrieve_feature_group_context_arns", + side_effect=[ + FEATURE_GROUP_INPUT[0], + FEATURE_GROUP_INPUT[1], + FEATURE_GROUP_INPUT[1], + ], + ) as retrieve_feature_group_context_arns_method, + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[ + RAW_DATA_INPUT_ARTIFACTS[0], + RAW_DATA_INPUT_ARTIFACTS[1], + RAW_DATA_INPUT_ARTIFACTS[2], + RAW_DATA_INPUT_ARTIFACTS[3], + ], + ) as retrieve_raw_data_artifact_method, + patch.object( + S3LineageEntityHandler, + "create_transformation_code_artifact", + return_value=TRANSFORMATION_CODE_ARTIFACT_1, + ) as create_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + return_value=pipeline_context, + ) as load_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + generate_pipeline_version_upstream_raw_data_list(), + generate_pipeline_version_upstream_transformation_code(), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + S3LineageEntityHandler, + "load_artifact_from_arn", + return_value=transformation_code_1, + ) as load_artifact_from_arn_method, + patch.object( + S3LineageEntityHandler, + "update_transformation_code_artifact", + ) as update_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "update_pipeline_context", + ) as update_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "create_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ), + patch.object( + LineageAssociationHandler, "add_upstream_feature_group_data_associations" + ) as add_upstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_downstream_feature_group_data_associations" + ) as add_downstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_raw_data_associations" + ) as add_upstream_raw_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_transformation_code_associations" + ) as add_upstream_transformation_code_associations_method, + patch.object( + LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" + ) as add_pipeline_and_pipeline_version_association_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_lineage(TAGS) retrieve_feature_group_context_arns_method.assert_has_calls( @@ -1576,78 +1715,96 @@ def test_create_lineage_when_already_exist_with_changed_transformation_code(): transformation_code=TRANSFORMATION_CODE_INPUT_2, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - FeatureGroupLineageEntityHandler, - "retrieve_feature_group_context_arns", - side_effect=[ - FEATURE_GROUP_INPUT[0], - FEATURE_GROUP_INPUT[1], - FEATURE_GROUP_INPUT[0], - ], - ) as retrieve_feature_group_context_arns_method, patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[ - RAW_DATA_INPUT_ARTIFACTS[0], - RAW_DATA_INPUT_ARTIFACTS[1], - RAW_DATA_INPUT_ARTIFACTS[2], - RAW_DATA_INPUT_ARTIFACTS[3], - ], - ) as retrieve_raw_data_artifact_method, patch.object( - S3LineageEntityHandler, - "create_transformation_code_artifact", - return_value=TRANSFORMATION_CODE_ARTIFACT_2, - ) as create_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - return_value=pipeline_context, - ) as load_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - generate_pipeline_version_upstream_raw_data_list(), - generate_pipeline_version_upstream_transformation_code(), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - S3LineageEntityHandler, - "load_artifact_from_arn", - return_value=transformation_code_1, - ) as load_artifact_from_arn_method, patch.object( - S3LineageEntityHandler, - "update_transformation_code_artifact", - ) as update_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "update_pipeline_context", - ) as update_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "create_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ), patch.object( - LineageAssociationHandler, "add_upstream_feature_group_data_associations" - ) as add_upstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_downstream_feature_group_data_associations" - ) as add_downstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_raw_data_associations" - ) as add_upstream_raw_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_transformation_code_associations" - ) as add_upstream_transformation_code_associations_method, patch.object( - LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" - ) as add_pipeline_and_pipeline_version_association_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + FeatureGroupLineageEntityHandler, + "retrieve_feature_group_context_arns", + side_effect=[ + FEATURE_GROUP_INPUT[0], + FEATURE_GROUP_INPUT[1], + FEATURE_GROUP_INPUT[0], + ], + ) as retrieve_feature_group_context_arns_method, + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[ + RAW_DATA_INPUT_ARTIFACTS[0], + RAW_DATA_INPUT_ARTIFACTS[1], + RAW_DATA_INPUT_ARTIFACTS[2], + RAW_DATA_INPUT_ARTIFACTS[3], + ], + ) as retrieve_raw_data_artifact_method, + patch.object( + S3LineageEntityHandler, + "create_transformation_code_artifact", + return_value=TRANSFORMATION_CODE_ARTIFACT_2, + ) as create_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + return_value=pipeline_context, + ) as load_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + generate_pipeline_version_upstream_raw_data_list(), + generate_pipeline_version_upstream_transformation_code(), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + S3LineageEntityHandler, + "load_artifact_from_arn", + return_value=transformation_code_1, + ) as load_artifact_from_arn_method, + patch.object( + S3LineageEntityHandler, + "update_transformation_code_artifact", + ) as update_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "update_pipeline_context", + ) as update_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "create_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ), + patch.object( + LineageAssociationHandler, "add_upstream_feature_group_data_associations" + ) as add_upstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_downstream_feature_group_data_associations" + ) as add_downstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_raw_data_associations" + ) as add_upstream_raw_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_transformation_code_associations" + ) as add_upstream_transformation_code_associations_method, + patch.object( + LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" + ) as add_pipeline_and_pipeline_version_association_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_lineage(TAGS) retrieve_feature_group_context_arns_method.assert_has_calls( @@ -1778,78 +1935,96 @@ def test_create_lineage_when_already_exist_with_last_transformation_code_as_none transformation_code=TRANSFORMATION_CODE_INPUT_2, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - FeatureGroupLineageEntityHandler, - "retrieve_feature_group_context_arns", - side_effect=[ - FEATURE_GROUP_INPUT[0], - FEATURE_GROUP_INPUT[1], - FEATURE_GROUP_INPUT[0], - ], - ) as retrieve_feature_group_context_arns_method, patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[ - RAW_DATA_INPUT_ARTIFACTS[0], - RAW_DATA_INPUT_ARTIFACTS[1], - RAW_DATA_INPUT_ARTIFACTS[2], - RAW_DATA_INPUT_ARTIFACTS[3], - ], - ) as retrieve_raw_data_artifact_method, patch.object( - S3LineageEntityHandler, - "create_transformation_code_artifact", - return_value=TRANSFORMATION_CODE_ARTIFACT_2, - ) as create_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - return_value=pipeline_context, - ) as load_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - generate_pipeline_version_upstream_raw_data_list(), - generate_pipeline_version_upstream_transformation_code(), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - S3LineageEntityHandler, - "load_artifact_from_arn", - return_value=transformation_code_1, - ) as load_artifact_from_arn_method, patch.object( - S3LineageEntityHandler, - "update_transformation_code_artifact", - ) as update_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "update_pipeline_context", - ) as update_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "create_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ), patch.object( - LineageAssociationHandler, "add_upstream_feature_group_data_associations" - ) as add_upstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_downstream_feature_group_data_associations" - ) as add_downstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_raw_data_associations" - ) as add_upstream_raw_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_transformation_code_associations" - ) as add_upstream_transformation_code_associations_method, patch.object( - LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" - ) as add_pipeline_and_pipeline_version_association_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + FeatureGroupLineageEntityHandler, + "retrieve_feature_group_context_arns", + side_effect=[ + FEATURE_GROUP_INPUT[0], + FEATURE_GROUP_INPUT[1], + FEATURE_GROUP_INPUT[0], + ], + ) as retrieve_feature_group_context_arns_method, + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[ + RAW_DATA_INPUT_ARTIFACTS[0], + RAW_DATA_INPUT_ARTIFACTS[1], + RAW_DATA_INPUT_ARTIFACTS[2], + RAW_DATA_INPUT_ARTIFACTS[3], + ], + ) as retrieve_raw_data_artifact_method, + patch.object( + S3LineageEntityHandler, + "create_transformation_code_artifact", + return_value=TRANSFORMATION_CODE_ARTIFACT_2, + ) as create_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + return_value=pipeline_context, + ) as load_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + generate_pipeline_version_upstream_raw_data_list(), + generate_pipeline_version_upstream_transformation_code(), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + S3LineageEntityHandler, + "load_artifact_from_arn", + return_value=transformation_code_1, + ) as load_artifact_from_arn_method, + patch.object( + S3LineageEntityHandler, + "update_transformation_code_artifact", + ) as update_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "update_pipeline_context", + ) as update_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "create_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ), + patch.object( + LineageAssociationHandler, "add_upstream_feature_group_data_associations" + ) as add_upstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_downstream_feature_group_data_associations" + ) as add_downstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_raw_data_associations" + ) as add_upstream_raw_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_transformation_code_associations" + ) as add_upstream_transformation_code_associations_method, + patch.object( + LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" + ) as add_pipeline_and_pipeline_version_association_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_lineage(TAGS) retrieve_feature_group_context_arns_method.assert_has_calls( @@ -1968,77 +2143,95 @@ def test_create_lineage_when_already_exist_with_all_previous_transformation_code transformation_code=TRANSFORMATION_CODE_INPUT_2, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - FeatureGroupLineageEntityHandler, - "retrieve_feature_group_context_arns", - side_effect=[ - FEATURE_GROUP_INPUT[0], - FEATURE_GROUP_INPUT[1], - FEATURE_GROUP_INPUT[0], - ], - ) as retrieve_feature_group_context_arns_method, patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[ - RAW_DATA_INPUT_ARTIFACTS[0], - RAW_DATA_INPUT_ARTIFACTS[1], - RAW_DATA_INPUT_ARTIFACTS[2], - RAW_DATA_INPUT_ARTIFACTS[3], - ], - ) as retrieve_raw_data_artifact_method, patch.object( - S3LineageEntityHandler, - "create_transformation_code_artifact", - return_value=TRANSFORMATION_CODE_ARTIFACT_2, - ) as create_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - return_value=pipeline_context, - ) as load_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - generate_pipeline_version_upstream_raw_data_list(), - iter([]), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - S3LineageEntityHandler, - "load_artifact_from_arn", - ) as load_artifact_from_arn_method, patch.object( - S3LineageEntityHandler, - "update_transformation_code_artifact", - ) as update_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "update_pipeline_context", - ) as update_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "create_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ), patch.object( - LineageAssociationHandler, "add_upstream_feature_group_data_associations" - ) as add_upstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_downstream_feature_group_data_associations" - ) as add_downstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_raw_data_associations" - ) as add_upstream_raw_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_transformation_code_associations" - ) as add_upstream_transformation_code_associations_method, patch.object( - LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" - ) as add_pipeline_and_pipeline_version_association_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + FeatureGroupLineageEntityHandler, + "retrieve_feature_group_context_arns", + side_effect=[ + FEATURE_GROUP_INPUT[0], + FEATURE_GROUP_INPUT[1], + FEATURE_GROUP_INPUT[0], + ], + ) as retrieve_feature_group_context_arns_method, + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[ + RAW_DATA_INPUT_ARTIFACTS[0], + RAW_DATA_INPUT_ARTIFACTS[1], + RAW_DATA_INPUT_ARTIFACTS[2], + RAW_DATA_INPUT_ARTIFACTS[3], + ], + ) as retrieve_raw_data_artifact_method, + patch.object( + S3LineageEntityHandler, + "create_transformation_code_artifact", + return_value=TRANSFORMATION_CODE_ARTIFACT_2, + ) as create_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + return_value=pipeline_context, + ) as load_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + generate_pipeline_version_upstream_raw_data_list(), + iter([]), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + S3LineageEntityHandler, + "load_artifact_from_arn", + ) as load_artifact_from_arn_method, + patch.object( + S3LineageEntityHandler, + "update_transformation_code_artifact", + ) as update_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "update_pipeline_context", + ) as update_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "create_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ), + patch.object( + LineageAssociationHandler, "add_upstream_feature_group_data_associations" + ) as add_upstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_downstream_feature_group_data_associations" + ) as add_downstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_raw_data_associations" + ) as add_upstream_raw_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_transformation_code_associations" + ) as add_upstream_transformation_code_associations_method, + patch.object( + LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" + ) as add_pipeline_and_pipeline_version_association_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_lineage(TAGS) retrieve_feature_group_context_arns_method.assert_has_calls( @@ -2154,78 +2347,96 @@ def test_create_lineage_when_already_exist_with_removed_transformation_code(): output=FEATURE_GROUP_DATA_SOURCE[0].name, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - FeatureGroupLineageEntityHandler, - "retrieve_feature_group_context_arns", - side_effect=[ - FEATURE_GROUP_INPUT[0], - FEATURE_GROUP_INPUT[1], - FEATURE_GROUP_INPUT[0], - ], - ) as retrieve_feature_group_context_arns_method, patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[ - RAW_DATA_INPUT_ARTIFACTS[0], - RAW_DATA_INPUT_ARTIFACTS[1], - RAW_DATA_INPUT_ARTIFACTS[2], - RAW_DATA_INPUT_ARTIFACTS[3], - ], - ) as retrieve_raw_data_artifact_method, patch.object( - S3LineageEntityHandler, - "create_transformation_code_artifact", - return_value=None, - ) as create_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - return_value=pipeline_context, - ) as load_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - generate_pipeline_version_upstream_raw_data_list(), - generate_pipeline_version_upstream_transformation_code(), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - S3LineageEntityHandler, - "load_artifact_from_arn", - return_value=transformation_code_1, - ) as load_artifact_from_arn_method, patch.object( - S3LineageEntityHandler, - "update_transformation_code_artifact", - ) as update_transformation_code_artifact_method, patch.object( - PipelineLineageEntityHandler, - "update_pipeline_context", - ) as update_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "create_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ), patch.object( - LineageAssociationHandler, "add_upstream_feature_group_data_associations" - ) as add_upstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_downstream_feature_group_data_associations" - ) as add_downstream_feature_group_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_raw_data_associations" - ) as add_upstream_raw_data_associations_method, patch.object( - LineageAssociationHandler, "add_upstream_transformation_code_associations" - ) as add_upstream_transformation_code_associations_method, patch.object( - LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" - ) as add_pipeline_and_pipeline_version_association_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + FeatureGroupLineageEntityHandler, + "retrieve_feature_group_context_arns", + side_effect=[ + FEATURE_GROUP_INPUT[0], + FEATURE_GROUP_INPUT[1], + FEATURE_GROUP_INPUT[0], + ], + ) as retrieve_feature_group_context_arns_method, + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[ + RAW_DATA_INPUT_ARTIFACTS[0], + RAW_DATA_INPUT_ARTIFACTS[1], + RAW_DATA_INPUT_ARTIFACTS[2], + RAW_DATA_INPUT_ARTIFACTS[3], + ], + ) as retrieve_raw_data_artifact_method, + patch.object( + S3LineageEntityHandler, + "create_transformation_code_artifact", + return_value=None, + ) as create_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + return_value=pipeline_context, + ) as load_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + generate_pipeline_version_upstream_raw_data_list(), + generate_pipeline_version_upstream_transformation_code(), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + S3LineageEntityHandler, + "load_artifact_from_arn", + return_value=transformation_code_1, + ) as load_artifact_from_arn_method, + patch.object( + S3LineageEntityHandler, + "update_transformation_code_artifact", + ) as update_transformation_code_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "update_pipeline_context", + ) as update_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "create_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ), + patch.object( + LineageAssociationHandler, "add_upstream_feature_group_data_associations" + ) as add_upstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_downstream_feature_group_data_associations" + ) as add_downstream_feature_group_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_raw_data_associations" + ) as add_upstream_raw_data_associations_method, + patch.object( + LineageAssociationHandler, "add_upstream_transformation_code_associations" + ) as add_upstream_transformation_code_associations_method, + patch.object( + LineageAssociationHandler, "add_pipeline_and_pipeline_version_association" + ) as add_pipeline_and_pipeline_version_association_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_lineage(TAGS) retrieve_feature_group_context_arns_method.assert_has_calls( @@ -2370,15 +2581,18 @@ def test_get_pipeline_lineage_names_when_lineage_exists(): transformation_code=TRANSFORMATION_CODE_INPUT_1, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - return_value=PIPELINE_CONTEXT, - ) as load_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method: + with ( + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + return_value=PIPELINE_CONTEXT, + ) as load_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + ): return_value = lineage_handler.get_pipeline_lineage_names() assert return_value == dict( @@ -2416,28 +2630,34 @@ def test_create_schedule_lineage(): pipeline=PIPELINE, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - return_value=PIPELINE_CONTEXT, - ) as load_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - S3LineageEntityHandler, - "retrieve_pipeline_schedule_artifact", - return_value=SCHEDULE_ARTIFACT_RESULT, - ) as retrieve_pipeline_schedule_artifact_method, patch.object( - LineageAssociationHandler, - "add_upstream_schedule_associations", - ) as add_upstream_schedule_associations_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + return_value=PIPELINE_CONTEXT, + ) as load_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + S3LineageEntityHandler, + "retrieve_pipeline_schedule_artifact", + return_value=SCHEDULE_ARTIFACT_RESULT, + ) as retrieve_pipeline_schedule_artifact_method, + patch.object( + LineageAssociationHandler, + "add_upstream_schedule_associations", + ) as add_upstream_schedule_associations_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_schedule_lineage( pipeline_name=PIPELINE_NAME, schedule_arn=SCHEDULE_ARN, @@ -2487,28 +2707,34 @@ def test_create_trigger_lineage(): pipeline=PIPELINE, sagemaker_session=SAGEMAKER_SESSION_MOCK, ) - with patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - return_value=PIPELINE_CONTEXT, - ) as load_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - S3LineageEntityHandler, - "retrieve_pipeline_trigger_artifact", - return_value=PIPELINE_TRIGGER_ARTIFACT, - ) as retrieve_pipeline_trigger_artifact_method, patch.object( - LineageAssociationHandler, - "_add_association", - ) as add_association_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags: + with ( + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + return_value=PIPELINE_CONTEXT, + ) as load_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + S3LineageEntityHandler, + "retrieve_pipeline_trigger_artifact", + return_value=PIPELINE_TRIGGER_ARTIFACT, + ) as retrieve_pipeline_trigger_artifact_method, + patch.object( + LineageAssociationHandler, + "_add_association", + ) as add_association_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + ): lineage_handler.create_trigger_lineage( pipeline_name=PIPELINE_NAME, trigger_arn=TRIGGER_ARN, @@ -2564,56 +2790,68 @@ def test_upsert_tags_for_lineage_resources(): ) lineage_handler.sagemaker_session.boto_session = Mock() lineage_handler.sagemaker_session.sagemaker_client = Mock() - with patch.object( - S3LineageEntityHandler, - "retrieve_raw_data_artifact", - side_effect=[ - RAW_DATA_INPUT_ARTIFACTS[0], - RAW_DATA_INPUT_ARTIFACTS[1], - RAW_DATA_INPUT_ARTIFACTS[2], - RAW_DATA_INPUT_ARTIFACTS[3], - ], - ) as retrieve_raw_data_artifact_method, patch.object( - PipelineLineageEntityHandler, - "load_pipeline_context", - return_value=pipeline_context, - ) as load_pipeline_context_method, patch.object( - PipelineVersionLineageEntityHandler, - "load_pipeline_version_context", - return_value=PIPELINE_VERSION_CONTEXT, - ) as load_pipeline_version_context_method, patch.object( - LineageAssociationHandler, - "list_upstream_associations", - side_effect=[ - generate_pipeline_version_upstream_feature_group_list(), - generate_pipeline_version_upstream_raw_data_list(), - iter([]), - ], - ) as list_upstream_associations_method, patch.object( - LineageAssociationHandler, - "list_downstream_associations", - return_value=generate_pipeline_version_downstream_feature_group(), - ) as list_downstream_associations_method, patch.object( - S3LineageEntityHandler, "load_artifact_from_arn", return_value=ARTIFACT_RESULT - ) as load_artifact_from_arn_method, patch.object( - S3LineageEntityHandler, "_load_artifact_from_s3_uri", return_value=ARTIFACT_SUMMARY - ) as load_artifact_from_s3_uri_method, patch.object( - Artifact, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as artifact_set_tags, patch.object( - Context, - "set_tags", - return_value={ - "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] - }, - ) as context_set_tags, patch.object( - EventBridgeSchedulerHelper, "describe_schedule", return_value=dict(Arn="schedule_arn") - ) as get_event_bridge_schedule, patch.object( - EventBridgeRuleHelper, "describe_rule", return_value=dict(Arn="rule_arn") - ) as get_event_bridge_rule: + with ( + patch.object( + S3LineageEntityHandler, + "retrieve_raw_data_artifact", + side_effect=[ + RAW_DATA_INPUT_ARTIFACTS[0], + RAW_DATA_INPUT_ARTIFACTS[1], + RAW_DATA_INPUT_ARTIFACTS[2], + RAW_DATA_INPUT_ARTIFACTS[3], + ], + ) as retrieve_raw_data_artifact_method, + patch.object( + PipelineLineageEntityHandler, + "load_pipeline_context", + return_value=pipeline_context, + ) as load_pipeline_context_method, + patch.object( + PipelineVersionLineageEntityHandler, + "load_pipeline_version_context", + return_value=PIPELINE_VERSION_CONTEXT, + ) as load_pipeline_version_context_method, + patch.object( + LineageAssociationHandler, + "list_upstream_associations", + side_effect=[ + generate_pipeline_version_upstream_feature_group_list(), + generate_pipeline_version_upstream_raw_data_list(), + iter([]), + ], + ) as list_upstream_associations_method, + patch.object( + LineageAssociationHandler, + "list_downstream_associations", + return_value=generate_pipeline_version_downstream_feature_group(), + ) as list_downstream_associations_method, + patch.object( + S3LineageEntityHandler, "load_artifact_from_arn", return_value=ARTIFACT_RESULT + ) as load_artifact_from_arn_method, + patch.object( + S3LineageEntityHandler, "_load_artifact_from_s3_uri", return_value=ARTIFACT_SUMMARY + ) as load_artifact_from_s3_uri_method, + patch.object( + Artifact, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as artifact_set_tags, + patch.object( + Context, + "set_tags", + return_value={ + "Tags": [dict(Key="key_1", Value="value_1"), dict(Key="key_2", Value="value_2")] + }, + ) as context_set_tags, + patch.object( + EventBridgeSchedulerHelper, "describe_schedule", return_value=dict(Arn="schedule_arn") + ) as get_event_bridge_schedule, + patch.object( + EventBridgeRuleHelper, "describe_rule", return_value=dict(Arn="rule_arn") + ) as get_event_bridge_rule, + ): lineage_handler.upsert_tags_for_lineage_resources(TAGS) retrieve_raw_data_artifact_method.assert_has_calls( diff --git a/tests/unit/sagemaker/huggingface/test_llm_utils.py b/tests/unit/sagemaker/huggingface/test_llm_utils.py index 675a6fd885..9bb1b451a1 100644 --- a/tests/unit/sagemaker/huggingface/test_llm_utils.py +++ b/tests/unit/sagemaker/huggingface/test_llm_utils.py @@ -65,7 +65,7 @@ def test_huggingface_model_metadata_unauthorized_exception(self, mock_urllib): "Trying to access a gated/private HuggingFace model without valid credentials. " "Please provide a HUGGING_FACE_HUB_TOKEN in env_vars" ) - self.assertEquals(expected_error_msg, str(context.exception)) + self.assertEqual(expected_error_msg, str(context.exception)) @patch("sagemaker.huggingface.llm_utils.urllib") def test_huggingface_model_metadata_general_exception(self, mock_urllib): @@ -76,7 +76,7 @@ def test_huggingface_model_metadata_general_exception(self, mock_urllib): expected_error_msg = ( f"Did not find model metadata for the following HuggingFace Model ID {MOCK_HF_ID}" ) - self.assertEquals(expected_error_msg, str(context.exception)) + self.assertEqual(expected_error_msg, str(context.exception)) @patch("huggingface_hub.snapshot_download") def test_download_huggingface_model_metadata(self, mock_snapshot_download): diff --git a/tests/unit/sagemaker/jumpstart/constants.py b/tests/unit/sagemaker/jumpstart/constants.py index 2eb7469e21..ae02c597da 100644 --- a/tests/unit/sagemaker/jumpstart/constants.py +++ b/tests/unit/sagemaker/jumpstart/constants.py @@ -14360,7 +14360,7 @@ "jmespath==1.0.1", "jsonschema==4.17.3", "multiprocess==0.70.14", - "numpy==1.24.3", + "numpy==1.26.4", "oscrypto==1.3.0", "packaging==23.1", "pandas==2.0.2", diff --git a/tests/unit/sagemaker/jumpstart/estimator/test_sagemaker_config.py b/tests/unit/sagemaker/jumpstart/estimator/test_sagemaker_config.py index 073921d5ba..39eca166ee 100644 --- a/tests/unit/sagemaker/jumpstart/estimator/test_sagemaker_config.py +++ b/tests/unit/sagemaker/jumpstart/estimator/test_sagemaker_config.py @@ -123,16 +123,16 @@ def test_without_arg_overwrites_without_kwarg_collisions_with_config( mock_retrieve_model_init_kwargs.return_value = {} - self.assertEquals(mock_get_sagemaker_config_value.call_count, 1) - self.assertEquals(mock_estimator_init.call_args[1].get("role"), config_role) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 1) + self.assertEqual(mock_estimator_init.call_args[1].get("role"), config_role) assert "enable_network_isolation" not in mock_estimator_init.call_args[1] assert "encrypt_inter_container_traffic" not in mock_estimator_init.call_args[1] estimator.deploy() - self.assertEquals(mock_get_sagemaker_config_value.call_count, 3) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 3) - self.assertEquals(mock_estimator_deploy.call_args[1].get("role"), config_inference_role) + self.assertEqual(mock_estimator_deploy.call_args[1].get("role"), config_inference_role) assert "enable_network_isolation" not in mock_estimator_deploy.call_args[1] @@ -181,13 +181,13 @@ def test_without_arg_overwrites_with_kwarg_collisions_with_config( model_id=model_id, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 3) - self.assertEquals(mock_estimator_init.call_args[1].get("role"), config_role) - self.assertEquals( + self.assertEqual(mock_get_sagemaker_config_value.call_count, 3) + self.assertEqual(mock_estimator_init.call_args[1].get("role"), config_role) + self.assertEqual( mock_estimator_init.call_args[1].get("enable_network_isolation"), config_enable_network_isolation, ) - self.assertEquals( + self.assertEqual( mock_estimator_init.call_args[1].get("encrypt_inter_container_traffic"), config_intercontainer_encryption, ) @@ -200,11 +200,11 @@ def test_without_arg_overwrites_with_kwarg_collisions_with_config( estimator.deploy() - self.assertEquals(mock_get_sagemaker_config_value.call_count, 6) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 6) - self.assertEquals(mock_estimator_deploy.call_args[1].get("role"), config_inference_role) + self.assertEqual(mock_estimator_deploy.call_args[1].get("role"), config_inference_role) - self.assertEquals( + self.assertEqual( mock_estimator_deploy.call_args[1].get("enable_network_isolation"), config_inference_enable_network_isolation, ) @@ -257,13 +257,13 @@ def test_with_arg_overwrites_with_kwarg_collisions_with_config( encrypt_inter_container_traffic=override_encrypt_inter_container_traffic, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 1) - self.assertEquals(mock_estimator_init.call_args[1].get("role"), override_role) - self.assertEquals( + self.assertEqual(mock_get_sagemaker_config_value.call_count, 1) + self.assertEqual(mock_estimator_init.call_args[1].get("role"), override_role) + self.assertEqual( mock_estimator_init.call_args[1].get("enable_network_isolation"), override_enable_network_isolation, ) - self.assertEquals( + self.assertEqual( mock_estimator_init.call_args[1].get("encrypt_inter_container_traffic"), override_encrypt_inter_container_traffic, ) @@ -280,13 +280,13 @@ def test_with_arg_overwrites_with_kwarg_collisions_with_config( enable_network_isolation=override_inference_enable_network_isolation, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 3) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 3) - self.assertEquals( + self.assertEqual( mock_estimator_deploy.call_args[1].get("role"), mock_inference_override_role ) - self.assertEquals( + self.assertEqual( mock_estimator_deploy.call_args[1].get("enable_network_isolation"), override_inference_enable_network_isolation, ) @@ -336,13 +336,13 @@ def test_with_arg_overwrites_without_kwarg_collisions_with_config( encrypt_inter_container_traffic=override_encrypt_inter_container_traffic, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 1) - self.assertEquals(mock_estimator_init.call_args[1].get("role"), override_role) - self.assertEquals( + self.assertEqual(mock_get_sagemaker_config_value.call_count, 1) + self.assertEqual(mock_estimator_init.call_args[1].get("role"), override_role) + self.assertEqual( mock_estimator_init.call_args[1].get("enable_network_isolation"), override_enable_network_isolation, ) - self.assertEquals( + self.assertEqual( mock_estimator_init.call_args[1].get("encrypt_inter_container_traffic"), override_encrypt_inter_container_traffic, ) @@ -355,13 +355,13 @@ def test_with_arg_overwrites_without_kwarg_collisions_with_config( enable_network_isolation=override_inference_enable_network_isolation, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 3) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 3) - self.assertEquals( + self.assertEqual( mock_estimator_deploy.call_args[1].get("role"), mock_inference_override_role ) - self.assertEquals( + self.assertEqual( mock_estimator_deploy.call_args[1].get("enable_network_isolation"), override_inference_enable_network_isolation, ) @@ -412,8 +412,8 @@ def test_without_arg_overwrites_without_kwarg_collisions_without_config( model_id=model_id, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 1) - self.assertEquals(mock_estimator_init.call_args[1].get("role"), execution_role) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 1) + self.assertEqual(mock_estimator_init.call_args[1].get("role"), execution_role) assert "enable_network_isolation" not in mock_estimator_init.call_args[1] assert "encrypt_inter_container_traffic" not in mock_estimator_init.call_args[1] @@ -421,9 +421,9 @@ def test_without_arg_overwrites_without_kwarg_collisions_without_config( mock_retrieve_model_init_kwargs.return_value = {} - self.assertEquals(mock_get_sagemaker_config_value.call_count, 3) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 3) - self.assertEquals(mock_estimator_deploy.call_args[1].get("role"), execution_role) + self.assertEqual(mock_estimator_deploy.call_args[1].get("role"), execution_role) assert "enable_network_isolation" not in mock_estimator_deploy.call_args[1] @@ -475,13 +475,13 @@ def test_without_arg_overwrites_with_kwarg_collisions_without_config( model_id=model_id, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 3) - self.assertEquals(mock_estimator_init.call_args[1].get("role"), execution_role) - self.assertEquals( + self.assertEqual(mock_get_sagemaker_config_value.call_count, 3) + self.assertEqual(mock_estimator_init.call_args[1].get("role"), execution_role) + self.assertEqual( mock_estimator_init.call_args[1].get("enable_network_isolation"), metadata_enable_network_isolation, ) - self.assertEquals( + self.assertEqual( mock_estimator_init.call_args[1].get("encrypt_inter_container_traffic"), metadata_intercontainer_encryption, ) @@ -492,11 +492,11 @@ def test_without_arg_overwrites_with_kwarg_collisions_without_config( estimator.deploy() - self.assertEquals(mock_get_sagemaker_config_value.call_count, 6) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 6) - self.assertEquals(mock_estimator_deploy.call_args[1].get("role"), execution_role) + self.assertEqual(mock_estimator_deploy.call_args[1].get("role"), execution_role) - self.assertEquals( + self.assertEqual( mock_estimator_deploy.call_args[1].get("enable_network_isolation"), metadata_inference_enable_network_isolation, ) @@ -548,13 +548,13 @@ def test_with_arg_overwrites_with_kwarg_collisions_without_config( encrypt_inter_container_traffic=override_encrypt_inter_container_traffic, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 1) - self.assertEquals(mock_estimator_init.call_args[1].get("role"), override_role) - self.assertEquals( + self.assertEqual(mock_get_sagemaker_config_value.call_count, 1) + self.assertEqual(mock_estimator_init.call_args[1].get("role"), override_role) + self.assertEqual( mock_estimator_init.call_args[1].get("enable_network_isolation"), override_enable_network_isolation, ) - self.assertEquals( + self.assertEqual( mock_estimator_init.call_args[1].get("encrypt_inter_container_traffic"), override_encrypt_inter_container_traffic, ) @@ -568,11 +568,11 @@ def test_with_arg_overwrites_with_kwarg_collisions_without_config( enable_network_isolation=override_inference_enable_network_isolation, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 3) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 3) - self.assertEquals(mock_estimator_deploy.call_args[1].get("role"), override_inference_role) + self.assertEqual(mock_estimator_deploy.call_args[1].get("role"), override_inference_role) - self.assertEquals( + self.assertEqual( mock_estimator_deploy.call_args[1].get("enable_network_isolation"), override_inference_enable_network_isolation, ) @@ -618,13 +618,13 @@ def test_with_arg_overwrites_without_kwarg_collisions_without_config( enable_network_isolation=override_enable_network_isolation, encrypt_inter_container_traffic=override_encrypt_inter_container_traffic, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 1) - self.assertEquals(mock_estimator_init.call_args[1].get("role"), override_role) - self.assertEquals( + self.assertEqual(mock_get_sagemaker_config_value.call_count, 1) + self.assertEqual(mock_estimator_init.call_args[1].get("role"), override_role) + self.assertEqual( mock_estimator_init.call_args[1].get("enable_network_isolation"), override_enable_network_isolation, ) - self.assertEquals( + self.assertEqual( mock_estimator_init.call_args[1].get("encrypt_inter_container_traffic"), override_encrypt_inter_container_traffic, ) @@ -634,11 +634,11 @@ def test_with_arg_overwrites_without_kwarg_collisions_without_config( enable_network_isolation=override_enable_network_isolation, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 3) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 3) - self.assertEquals(mock_estimator_deploy.call_args[1].get("role"), override_inference_role) + self.assertEqual(mock_estimator_deploy.call_args[1].get("role"), override_inference_role) - self.assertEquals( + self.assertEqual( mock_estimator_deploy.call_args[1].get("enable_network_isolation"), override_enable_network_isolation, ) diff --git a/tests/unit/sagemaker/jumpstart/model/test_sagemaker_config.py b/tests/unit/sagemaker/jumpstart/model/test_sagemaker_config.py index 2be4bde7e4..a0299ebb1a 100644 --- a/tests/unit/sagemaker/jumpstart/model/test_sagemaker_config.py +++ b/tests/unit/sagemaker/jumpstart/model/test_sagemaker_config.py @@ -99,9 +99,9 @@ def test_without_arg_overwrites_without_kwarg_collisions_with_config( model_id=model_id, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 1) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 1) - self.assertEquals(mock_model_init.call_args[1].get("role"), config_role) + self.assertEqual(mock_model_init.call_args[1].get("role"), config_role) assert "enable_network_isolation" not in mock_model_init.call_args[1] @@ -147,10 +147,10 @@ def test_all_arg_overwrites_without_kwarg_collisions_with_config( role=override_role, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 1) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 1) - self.assertEquals(mock_model_init.call_args[1].get("role"), override_role) - self.assertEquals( + self.assertEqual(mock_model_init.call_args[1].get("role"), override_role) + self.assertEqual( mock_model_init.call_args[1].get("enable_network_isolation"), override_enable_network_isolation, ) @@ -197,10 +197,10 @@ def test_without_arg_overwrites_all_kwarg_collisions_with_config( model_id=model_id, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 2) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 2) - self.assertEquals(mock_model_init.call_args[1].get("role"), config_role) - self.assertEquals( + self.assertEqual(mock_model_init.call_args[1].get("role"), config_role) + self.assertEqual( mock_model_init.call_args[1].get("enable_network_isolation"), config_enable_network_isolation, ) @@ -249,10 +249,10 @@ def test_with_arg_overwrites_all_kwarg_collisions_with_config( enable_network_isolation=override_enable_network_isolation, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 1) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 1) - self.assertEquals(mock_model_init.call_args[1].get("role"), override_role) - self.assertEquals( + self.assertEqual(mock_model_init.call_args[1].get("role"), override_role) + self.assertEqual( mock_model_init.call_args[1].get("enable_network_isolation"), override_enable_network_isolation, ) @@ -299,10 +299,10 @@ def test_without_arg_overwrites_all_kwarg_collisions_without_config( model_id=model_id, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 2) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 2) - self.assertEquals(mock_model_init.call_args[1].get("role"), execution_role) - self.assertEquals( + self.assertEqual(mock_model_init.call_args[1].get("role"), execution_role) + self.assertEqual( mock_model_init.call_args[1].get("enable_network_isolation"), metadata_enable_network_isolation, ) @@ -350,10 +350,10 @@ def test_with_arg_overwrites_all_kwarg_collisions_without_config( enable_network_isolation=override_enable_network_isolation, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 1) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 1) - self.assertEquals(mock_model_init.call_args[1].get("role"), override_role) - self.assertEquals( + self.assertEqual(mock_model_init.call_args[1].get("role"), override_role) + self.assertEqual( mock_model_init.call_args[1].get("enable_network_isolation"), override_enable_network_isolation, ) @@ -398,9 +398,9 @@ def test_without_arg_overwrites_without_kwarg_collisions_without_config( model_id=model_id, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 1) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 1) - self.assertEquals(mock_model_init.call_args[1].get("role"), execution_role) + self.assertEqual(mock_model_init.call_args[1].get("role"), execution_role) assert "enable_network_isolation" not in mock_model_init.call_args[1] @mock.patch( @@ -445,10 +445,10 @@ def test_with_arg_overwrites_without_kwarg_collisions_without_config( enable_network_isolation=override_enable_network_isolation, ) - self.assertEquals(mock_get_sagemaker_config_value.call_count, 1) + self.assertEqual(mock_get_sagemaker_config_value.call_count, 1) - self.assertEquals(mock_model_init.call_args[1].get("role"), override_role) - self.assertEquals( + self.assertEqual(mock_model_init.call_args[1].get("role"), override_role) + self.assertEqual( mock_model_init.call_args[1].get("enable_network_isolation"), override_enable_network_isolation, ) diff --git a/tests/unit/sagemaker/jumpstart/test_utils.py b/tests/unit/sagemaker/jumpstart/test_utils.py index e3e3110da8..de9be1d51d 100644 --- a/tests/unit/sagemaker/jumpstart/test_utils.py +++ b/tests/unit/sagemaker/jumpstart/test_utils.py @@ -1388,7 +1388,7 @@ def test_no_model_id_no_version_found(self): mock_sagemaker_session.list_tags = mock_list_tags mock_list_tags.return_value = [{"Key": "blah", "Value": "blah1"}] - self.assertEquals( + self.assertEqual( utils.get_jumpstart_model_info_from_resource_arn("some-arn", mock_sagemaker_session), (None, None, None, None), ) @@ -1403,7 +1403,7 @@ def test_model_id_no_version_found(self): {"Key": JumpStartTag.MODEL_ID, "Value": "model_id"}, ] - self.assertEquals( + self.assertEqual( utils.get_jumpstart_model_info_from_resource_arn("some-arn", mock_sagemaker_session), ("model_id", None, None, None), ) @@ -1418,7 +1418,7 @@ def test_no_model_id_version_found(self): {"Key": JumpStartTag.MODEL_VERSION, "Value": "model_version"}, ] - self.assertEquals( + self.assertEqual( utils.get_jumpstart_model_info_from_resource_arn("some-arn", mock_sagemaker_session), (None, "model_version", None, None), ) @@ -1430,7 +1430,7 @@ def test_no_config_name_found(self): mock_sagemaker_session.list_tags = mock_list_tags mock_list_tags.return_value = [{"Key": "blah", "Value": "blah1"}] - self.assertEquals( + self.assertEqual( utils.get_jumpstart_model_info_from_resource_arn("some-arn", mock_sagemaker_session), (None, None, None, None), ) @@ -1445,7 +1445,7 @@ def test_inference_config_name_found(self): {"Key": JumpStartTag.INFERENCE_CONFIG_NAME, "Value": "config_name"}, ] - self.assertEquals( + self.assertEqual( utils.get_jumpstart_model_info_from_resource_arn("some-arn", mock_sagemaker_session), (None, None, "config_name", None), ) @@ -1460,7 +1460,7 @@ def test_training_config_name_found(self): {"Key": JumpStartTag.TRAINING_CONFIG_NAME, "Value": "config_name"}, ] - self.assertEquals( + self.assertEqual( utils.get_jumpstart_model_info_from_resource_arn("some-arn", mock_sagemaker_session), (None, None, None, "config_name"), ) @@ -1476,7 +1476,7 @@ def test_both_config_name_found(self): {"Key": JumpStartTag.TRAINING_CONFIG_NAME, "Value": "training_config_name"}, ] - self.assertEquals( + self.assertEqual( utils.get_jumpstart_model_info_from_resource_arn("some-arn", mock_sagemaker_session), (None, None, "inference_config_name", "training_config_name"), ) @@ -1492,7 +1492,7 @@ def test_model_id_version_found(self): {"Key": JumpStartTag.MODEL_VERSION, "Value": "model_version"}, ] - self.assertEquals( + self.assertEqual( utils.get_jumpstart_model_info_from_resource_arn("some-arn", mock_sagemaker_session), ("model_id", "model_version", None, None), ) @@ -1510,7 +1510,7 @@ def test_multiple_model_id_versions_found(self): {"Key": JumpStartTag.MODEL_VERSION, "Value": "model_version_2"}, ] - self.assertEquals( + self.assertEqual( utils.get_jumpstart_model_info_from_resource_arn("some-arn", mock_sagemaker_session), (None, None, None, None), ) @@ -1528,7 +1528,7 @@ def test_multiple_model_id_versions_found_aliases_consistent(self): {"Key": random.choice(EXTRA_MODEL_VERSION_TAGS), "Value": "model_version_1"}, ] - self.assertEquals( + self.assertEqual( utils.get_jumpstart_model_info_from_resource_arn("some-arn", mock_sagemaker_session), ("model_id_1", "model_version_1", None, None), ) @@ -1546,7 +1546,7 @@ def test_multiple_model_id_versions_found_aliases_inconsistent(self): {"Key": random.choice(EXTRA_MODEL_VERSION_TAGS), "Value": "model_version_2"}, ] - self.assertEquals( + self.assertEqual( utils.get_jumpstart_model_info_from_resource_arn("some-arn", mock_sagemaker_session), (None, None, None, None), ) @@ -1564,7 +1564,7 @@ def test_multiple_config_names_found_aliases_inconsistent(self): {"Key": JumpStartTag.INFERENCE_CONFIG_NAME, "Value": "config_name_2"}, ] - self.assertEquals( + self.assertEqual( utils.get_jumpstart_model_info_from_resource_arn("some-arn", mock_sagemaker_session), ("model_id_1", "model_version_1", None, None), ) diff --git a/tests/unit/sagemaker/local/test_local_entities.py b/tests/unit/sagemaker/local/test_local_entities.py index 6a026c316b..74a361cf73 100644 --- a/tests/unit/sagemaker/local/test_local_entities.py +++ b/tests/unit/sagemaker/local/test_local_entities.py @@ -12,6 +12,7 @@ # language governing permissions and limitations under the License. from __future__ import absolute_import +import re import os import pytest @@ -290,10 +291,10 @@ def test_start_local_pipeline_with_wrong_parameter_type(sagemaker_local_session) local_pipeline = sagemaker.local.entities._LocalPipeline(pipeline) with pytest.raises(ClientError) as error: local_pipeline.start(PipelineParameters={"MyStr": True}) - assert ( - f"Unexpected type for parameter '{parameter.name}'. Expected " - f"{parameter.parameter_type.python_type} but found {type(True)}." in str(error.value) + expected_error_pattern = ( + r"Unexpected type for parameter 'MyStr'\. Expected .* but found \." ) + assert re.search(expected_error_pattern, str(error.value)) def test_start_local_pipeline_with_empty_parameter_string_value( diff --git a/tests/unit/sagemaker/modules/train/test_model_trainer.py b/tests/unit/sagemaker/modules/train/test_model_trainer.py index 770420c354..13530a3983 100644 --- a/tests/unit/sagemaker/modules/train/test_model_trainer.py +++ b/tests/unit/sagemaker/modules/train/test_model_trainer.py @@ -1049,15 +1049,16 @@ def mock_upload_data(path, bucket, key_prefix): model_trainer.train() - assert mock_local_container.train.called_once_with( + mock_local_container.assert_called_once_with( training_job_name=unique_name, instance_type=compute.instance_type, instance_count=compute.instance_count, image=training_image, container_root=local_container_root, sagemaker_session=modules_session, - container_entry_point=DEFAULT_ENTRYPOINT, + container_entrypoint=DEFAULT_ENTRYPOINT, container_arguments=DEFAULT_ARGUMENTS, + input_data_config=ANY, hyper_parameters=hyperparameters, environment=environment, ) diff --git a/tests/unit/sagemaker/serve/detector/test_dependency_manager.py b/tests/unit/sagemaker/serve/detector/test_dependency_manager.py index 491968dd25..52e9822e57 100644 --- a/tests/unit/sagemaker/serve/detector/test_dependency_manager.py +++ b/tests/unit/sagemaker/serve/detector/test_dependency_manager.py @@ -21,7 +21,7 @@ DEPENDENCY_LIST = [ "requests==2.26.0", - "numpy>=1.20.0", + "numpy==1.26.4", "pandas<=1.3.3", "matplotlib<3.5.0", "scikit-learn>0.24.1", @@ -34,7 +34,7 @@ EXPECTED_DEPENDENCY_MAP = { "requests": "==2.26.0", - "numpy": ">=1.20.0", + "numpy": "==1.26.4", "pandas": "<=1.3.3", "matplotlib": "<3.5.0", "scikit-learn": ">0.24.1", diff --git a/tests/unit/sagemaker/serve/detector/test_pickle_dependencies.py b/tests/unit/sagemaker/serve/detector/test_pickle_dependencies.py index 34cab8a526..ced9555fc5 100644 --- a/tests/unit/sagemaker/serve/detector/test_pickle_dependencies.py +++ b/tests/unit/sagemaker/serve/detector/test_pickle_dependencies.py @@ -93,13 +93,14 @@ def create_mock_modules(name, doc, file): # happy case def test_generate_requirements_exact_match(monkeypatch): - with patch("cloudpickle.load"), patch("tqdm.tqdm"), patch( - "sagemaker.serve.detector.pickle_dependencies.subprocess.run" - ) as subprocess_run, patch( - "sagemaker.serve.detector.pickle_dependencies.subprocess.Popen" - ) as subprocess_popen, patch( - "builtins.open" - ) as mocked_open, monkeypatch.context() as m: + with ( + patch("cloudpickle.load"), + patch("tqdm.tqdm"), + patch("sagemaker.serve.detector.pickle_dependencies.subprocess.run") as subprocess_run, + patch("sagemaker.serve.detector.pickle_dependencies.subprocess.Popen") as subprocess_popen, + patch("builtins.open") as mocked_open, + monkeypatch.context() as m, + ): mock_run_stdout = MagicMock() mock_run_stdout.stdout = json.dumps(INSTALLED_PKG_JSON).encode("utf-8") subprocess_run.return_value = mock_run_stdout @@ -147,13 +148,14 @@ def test_generate_requirements_exact_match(monkeypatch): def test_generate_requirements_txt_pruning_unused_packages(monkeypatch): - with patch("cloudpickle.load"), patch("tqdm.tqdm"), patch( - "sagemaker.serve.detector.pickle_dependencies.subprocess.run" - ) as subprocess_run, patch( - "sagemaker.serve.detector.pickle_dependencies.subprocess.Popen" - ) as subprocess_popen, patch( - "builtins.open" - ) as mocked_open, monkeypatch.context() as m: + with ( + patch("cloudpickle.load"), + patch("tqdm.tqdm"), + patch("sagemaker.serve.detector.pickle_dependencies.subprocess.run") as subprocess_run, + patch("sagemaker.serve.detector.pickle_dependencies.subprocess.Popen") as subprocess_popen, + patch("builtins.open") as mocked_open, + monkeypatch.context() as m, + ): mock_run_stdout = MagicMock() mock_run_stdout.stdout = json.dumps(INSTALLED_PKG_JSON_UNUSED).encode("utf-8") subprocess_run.return_value = mock_run_stdout @@ -201,13 +203,14 @@ def test_generate_requirements_txt_pruning_unused_packages(monkeypatch): def test_generate_requirements_txt_no_currently_used_packages(monkeypatch): - with patch("cloudpickle.load"), patch("tqdm.tqdm"), patch( - "sagemaker.serve.detector.pickle_dependencies.subprocess.run" - ) as subprocess_run, patch( - "sagemaker.serve.detector.pickle_dependencies.subprocess.Popen" - ) as subprocess_popen, patch( - "builtins.open" - ) as mocked_open, monkeypatch.context() as m: + with ( + patch("cloudpickle.load"), + patch("tqdm.tqdm"), + patch("sagemaker.serve.detector.pickle_dependencies.subprocess.run") as subprocess_run, + patch("sagemaker.serve.detector.pickle_dependencies.subprocess.Popen") as subprocess_popen, + patch("builtins.open") as mocked_open, + monkeypatch.context() as m, + ): mock_run_stdout = MagicMock() mock_run_stdout.stdout = json.dumps([]).encode("utf-8") subprocess_run.return_value = mock_run_stdout diff --git a/tests/unit/sagemaker/serve/model_server/djl_serving/test_djl_prepare.py b/tests/unit/sagemaker/serve/model_server/djl_serving/test_djl_prepare.py index 183d15d13e..aa99e1971c 100644 --- a/tests/unit/sagemaker/serve/model_server/djl_serving/test_djl_prepare.py +++ b/tests/unit/sagemaker/serve/model_server/djl_serving/test_djl_prepare.py @@ -52,8 +52,8 @@ def test_create_dir_structure_from_new(self, mock_path, mock_disk_usage, mock_di mock_disk_space.assert_called_once_with(mock_model_path) mock_disk_usage.assert_called_once() - self.assertEquals(ret_model_path, mock_model_path) - self.assertEquals(ret_code_dir, mock_code_dir) + self.assertEqual(ret_model_path, mock_model_path) + self.assertEqual(ret_code_dir, mock_code_dir) @patch("sagemaker.serve.model_server.djl_serving.prepare.Path") def test_create_dir_structure_invalid_path(self, mock_path): @@ -65,7 +65,7 @@ def test_create_dir_structure_invalid_path(self, mock_path): with self.assertRaises(ValueError) as context: _create_dir_structure(mock_model_path) - self.assertEquals("model_dir is not a valid directory", str(context.exception)) + self.assertEqual("model_dir is not a valid directory", str(context.exception)) @patch("sagemaker.serve.model_server.djl_serving.prepare.S3Downloader") @patch("builtins.open", new_callable=mock_open, read_data="data") diff --git a/tests/unit/sagemaker/serve/model_server/multi_model_server/test_multi_model_server_prepare.py b/tests/unit/sagemaker/serve/model_server/multi_model_server/test_multi_model_server_prepare.py index e877c1e7e9..567a72182a 100644 --- a/tests/unit/sagemaker/serve/model_server/multi_model_server/test_multi_model_server_prepare.py +++ b/tests/unit/sagemaker/serve/model_server/multi_model_server/test_multi_model_server_prepare.py @@ -91,8 +91,8 @@ def test_create_dir_structure_from_new(self, mock_path, mock_disk_usage, mock_di mock_disk_space.assert_called_once_with(mock_model_path) mock_disk_usage.assert_called_once() - self.assertEquals(ret_model_path, mock_model_path) - self.assertEquals(ret_code_dir, mock_code_dir) + self.assertEqual(ret_model_path, mock_model_path) + self.assertEqual(ret_code_dir, mock_code_dir) @patch("sagemaker.serve.model_server.multi_model_server.prepare.Path") def test_create_dir_structure_invalid_path(self, mock_path): @@ -104,4 +104,4 @@ def test_create_dir_structure_invalid_path(self, mock_path): with self.assertRaises(ValueError) as context: _create_dir_structure(mock_model_path) - self.assertEquals("model_dir is not a valid directory", str(context.exception)) + self.assertEqual("model_dir is not a valid directory", str(context.exception)) diff --git a/tests/unit/sagemaker/serve/model_server/tgi/test_tgi_prepare.py b/tests/unit/sagemaker/serve/model_server/tgi/test_tgi_prepare.py index 88d109831d..ed94f10ce9 100644 --- a/tests/unit/sagemaker/serve/model_server/tgi/test_tgi_prepare.py +++ b/tests/unit/sagemaker/serve/model_server/tgi/test_tgi_prepare.py @@ -50,8 +50,8 @@ def test_create_dir_structure_from_new(self, mock_path, mock_disk_usage, mock_di mock_disk_space.assert_called_once_with(mock_model_path) mock_disk_usage.assert_called_once() - self.assertEquals(ret_model_path, mock_model_path) - self.assertEquals(ret_code_dir, mock_code_dir) + self.assertEqual(ret_model_path, mock_model_path) + self.assertEqual(ret_code_dir, mock_code_dir) @patch("sagemaker.serve.model_server.tgi.prepare.Path") def test_create_dir_structure_invalid_path(self, mock_path): @@ -63,7 +63,7 @@ def test_create_dir_structure_invalid_path(self, mock_path): with self.assertRaises(ValueError) as context: _create_dir_structure(mock_model_path) - self.assertEquals("model_dir is not a valid directory", str(context.exception)) + self.assertEqual("model_dir is not a valid directory", str(context.exception)) @patch("sagemaker.serve.model_server.tgi.prepare.S3Downloader") @patch("builtins.open", read_data="data") diff --git a/tests/unit/sagemaker/workflow/test_pipeline.py b/tests/unit/sagemaker/workflow/test_pipeline.py index 14c2d442eb..523b981736 100644 --- a/tests/unit/sagemaker/workflow/test_pipeline.py +++ b/tests/unit/sagemaker/workflow/test_pipeline.py @@ -99,7 +99,7 @@ def test_pipeline_create_and_update_with_config_injection(sagemaker_session_mock RoleArn=pipeline_role_arn, ) pipeline.upsert() - assert sagemaker_session_mock.sagemaker_client.update_pipeline.called_with( + sagemaker_session_mock.sagemaker_client.update_pipeline.assert_called_with( PipelineName="MyPipeline", PipelineDefinition=pipeline.definition(), RoleArn=pipeline_role_arn, @@ -130,7 +130,7 @@ def test_pipeline_create_with_parallelism_config(sagemaker_session_mock, role_ar role_arn=role_arn, parallelism_config=dict(MaxParallelExecutionSteps=10), ) - assert sagemaker_session_mock.sagemaker_client.create_pipeline.called_with( + sagemaker_session_mock.sagemaker_client.create_pipeline.assert_called_with( PipelineName="MyPipeline", PipelineDefinition=pipeline.definition(), RoleArn=role_arn, @@ -149,7 +149,7 @@ def test_pipeline_create_and_start_with_parallelism_config(sagemaker_session_moc role_arn=role_arn, parallelism_config=dict(MaxParallelExecutionSteps=10), ) - assert sagemaker_session_mock.sagemaker_client.create_pipeline.called_with( + sagemaker_session_mock.sagemaker_client.create_pipeline.assert_called_with( PipelineName="MyPipeline", PipelineDefinition=pipeline.definition(), RoleArn=role_arn, @@ -168,7 +168,7 @@ def test_pipeline_create_and_start_with_parallelism_config(sagemaker_session_moc # Specify ParallelismConfiguration to another value which will be honored in backend pipeline.start(parallelism_config=dict(MaxParallelExecutionSteps=20)) - assert sagemaker_session_mock.sagemaker_client.start_pipeline_execution.called_with( + sagemaker_session_mock.sagemaker_client.start_pipeline_execution.assert_called_with( PipelineName="MyPipeline", ParallelismConfiguration={"MaxParallelExecutionSteps": 20}, ) @@ -209,7 +209,7 @@ def test_pipeline_update(sagemaker_session_mock, role_arn): assert not pipeline.steps pipeline.update(role_arn=role_arn) assert len(json.loads(pipeline.definition())["Steps"]) == 0 - assert sagemaker_session_mock.sagemaker_client.update_pipeline.called_with( + sagemaker_session_mock.sagemaker_client.update_pipeline.assert_called_with( PipelineName="MyPipeline", PipelineDefinition=pipeline.definition(), RoleArn=role_arn ) @@ -253,7 +253,7 @@ def test_pipeline_update(sagemaker_session_mock, role_arn): pipeline.update(role_arn=role_arn) assert len(json.loads(pipeline.definition())["Steps"]) == 3 - assert sagemaker_session_mock.sagemaker_client.update_pipeline.called_with( + sagemaker_session_mock.sagemaker_client.update_pipeline.assert_called_with( PipelineName="MyPipeline", PipelineDefinition=pipeline.definition(), RoleArn=role_arn ) @@ -345,7 +345,11 @@ def test_pipeline_update_with_parallelism_config(sagemaker_session_mock, role_ar role_arn=role_arn, parallelism_config=dict(MaxParallelExecutionSteps=10), ) - assert sagemaker_session_mock.sagemaker_client.update_pipeline.called_with( + pipeline.update( + role_arn=role_arn, + parallelism_config={"MaxParallelExecutionSteps": 10}, + ) + sagemaker_session_mock.sagemaker_client.update_pipeline.assert_called_with( PipelineName="MyPipeline", PipelineDefinition=pipeline.definition(), RoleArn=role_arn, @@ -418,13 +422,11 @@ def _raise_does_already_exists_client_error(**kwargs): sagemaker_session_mock.sagemaker_client.update_pipeline.assert_called_once_with( PipelineName="MyPipeline", PipelineDefinition=pipeline.definition(), RoleArn=role_arn ) - assert sagemaker_session_mock.sagemaker_client.list_tags.called_with( - ResourceArn="mock_pipeline_arn" - ) + sagemaker_session_mock.sagemaker_client.list_tags.assert_called_with(ResourceArn="pipeline-arn") tags.append({"Key": "dummy", "Value": "dummy_tag"}) - assert sagemaker_session_mock.sagemaker_client.add_tags.called_with( - ResourceArn="mock_pipeline_arn", Tags=tags + sagemaker_session_mock.sagemaker_client.add_tags.assert_called_with( + ResourceArn="pipeline-arn", Tags=tags ) @@ -523,7 +525,7 @@ def test_pipeline_delete(sagemaker_session_mock): sagemaker_session=sagemaker_session_mock, ) pipeline.delete() - assert sagemaker_session_mock.sagemaker_client.delete_pipeline.called_with( + sagemaker_session_mock.sagemaker_client.delete_pipeline.assert_called_with( PipelineName="MyPipeline", ) @@ -536,7 +538,7 @@ def test_pipeline_describe(sagemaker_session_mock): sagemaker_session=sagemaker_session_mock, ) pipeline.describe() - assert sagemaker_session_mock.sagemaker_client.describe_pipeline.called_with( + sagemaker_session_mock.sagemaker_client.describe_pipeline.assert_called_with( PipelineName="MyPipeline", ) @@ -552,17 +554,17 @@ def test_pipeline_start(sagemaker_session_mock): sagemaker_session=sagemaker_session_mock, ) pipeline.start() - assert sagemaker_session_mock.start_pipeline_execution.called_with( + sagemaker_session_mock.sagemaker_client.start_pipeline_execution.assert_called_with( PipelineName="MyPipeline", ) pipeline.start(execution_display_name="pipeline-execution") - assert sagemaker_session_mock.start_pipeline_execution.called_with( + sagemaker_session_mock.sagemaker_client.start_pipeline_execution.assert_called_with( PipelineName="MyPipeline", PipelineExecutionDisplayName="pipeline-execution" ) pipeline.start(parameters=dict(alpha="epsilon")) - assert sagemaker_session_mock.start_pipeline_execution.called_with( + sagemaker_session_mock.sagemaker_client.start_pipeline_execution.assert_called_with( PipelineName="MyPipeline", PipelineParameters=[{"Name": "alpha", "Value": "epsilon"}] ) @@ -821,10 +823,8 @@ def test_pipeline_build_parameters_from_execution(sagemaker_session_mock): pipeline_execution_arn=reference_execution_arn, parameter_value_overrides=parameter_value_overrides, ) - assert ( - sagemaker_session_mock.sagemaker_client.list_pipeline_parameters_for_execution.called_with( - PipelineExecutionArn=reference_execution_arn - ) + sagemaker_session_mock.sagemaker_client.list_pipeline_parameters_for_execution.assert_called_with( + PipelineExecutionArn=reference_execution_arn ) assert len(parameters) == 1 assert parameters["TestParameterName"] == "NewParameterValue" @@ -850,10 +850,8 @@ def test_pipeline_build_parameters_from_execution_with_invalid_overrides(sagemak + f"are not present in the pipeline execution: {reference_execution_arn}" in str(error) ) - assert ( - sagemaker_session_mock.sagemaker_client.list_pipeline_parameters_for_execution.called_with( - PipelineExecutionArn=reference_execution_arn - ) + sagemaker_session_mock.sagemaker_client.list_pipeline_parameters_for_execution.assert_called_with( + PipelineExecutionArn=reference_execution_arn ) @@ -908,24 +906,23 @@ def test_pipeline_execution_basics(sagemaker_session_mock): ) execution = pipeline.start() execution.stop() - assert sagemaker_session_mock.sagemaker_client.stop_pipeline_execution.called_with( + sagemaker_session_mock.sagemaker_client.stop_pipeline_execution.assert_called_with( PipelineExecutionArn="my:arn" ) execution.describe() - assert sagemaker_session_mock.sagemaker_client.describe_pipeline_execution.called_with( + sagemaker_session_mock.sagemaker_client.describe_pipeline_execution.assert_called_with( PipelineExecutionArn="my:arn" ) steps = execution.list_steps() - assert sagemaker_session_mock.sagemaker_client.describe_pipeline_execution_steps.called_with( + sagemaker_session_mock.sagemaker_client.list_pipeline_execution_steps.assert_called_with( PipelineExecutionArn="my:arn" ) assert len(steps) == 1 list_parameters_response = execution.list_parameters() - assert ( - sagemaker_session_mock.sagemaker_client.list_pipeline_parameters_for_execution.called_with( - PipelineExecutionArn="my:arn" - ) + sagemaker_session_mock.sagemaker_client.list_pipeline_parameters_for_execution.assert_called_with( + PipelineExecutionArn="my:arn" ) + parameter_list = list_parameters_response["PipelineParameters"] assert len(parameter_list) == 1 assert parameter_list[0]["Name"] == "TestParameterName" diff --git a/tests/unit/test_exception_on_bad_status.py b/tests/unit/test_exception_on_bad_status.py index 2ef017efd3..dc53c97799 100644 --- a/tests/unit/test_exception_on_bad_status.py +++ b/tests/unit/test_exception_on_bad_status.py @@ -52,7 +52,7 @@ def test_raise_when_failed_created_package(): False ), "sagemaker.exceptions.UnexpectedStatusException should have been raised but was not" except Exception as e: - assert type(e) == sagemaker.exceptions.UnexpectedStatusException + assert isinstance(e, sagemaker.exceptions.UnexpectedStatusException) assert e.actual_status == "EnRoute" assert "Completed" in e.allowed_statuses @@ -73,7 +73,7 @@ def test_does_raise_when_incorrect_job_status(): False ), "sagemaker.exceptions.UnexpectedStatusException should have been raised but was not" except Exception as e: - assert type(e) == sagemaker.exceptions.UnexpectedStatusException + assert isinstance(e, sagemaker.exceptions.UnexpectedStatusException) assert e.actual_status == "Failed" assert "Completed" in e.allowed_statuses assert "Stopped" in e.allowed_statuses @@ -92,7 +92,7 @@ def test_does_raise_capacity_error_when_incorrect_job_status(): ) assert False, "sagemaker.exceptions.CapacityError should have been raised but was not" except Exception as e: - assert type(e) == sagemaker.exceptions.CapacityError + assert isinstance(e, sagemaker.exceptions.CapacityError) assert e.actual_status == "Failed" assert "Completed" in e.allowed_statuses assert "Stopped" in e.allowed_statuses @@ -114,6 +114,6 @@ def test_raise_when_failed_to_deploy_endpoint(): False ), "sagemaker.exceptions.UnexpectedStatusException should have been raised but was not" except Exception as e: - assert type(e) == sagemaker.exceptions.UnexpectedStatusException + assert isinstance(e, sagemaker.exceptions.UnexpectedStatusException) assert e.actual_status == "Failed" assert "InService" in e.allowed_statuses diff --git a/tests/unit/test_hyperparameter.py b/tests/unit/test_hyperparameter.py index ba7a363c40..edb2de97ee 100644 --- a/tests/unit/test_hyperparameter.py +++ b/tests/unit/test_hyperparameter.py @@ -62,7 +62,7 @@ def test_validated(): def test_data_type(): x = Test() x.validated = 66 - assert type(x.validated) == Test.__dict__["validated"].data_type + assert isinstance(x.validated, Test.__dict__["validated"].data_type) def test_from_string(): diff --git a/tests/unit/test_predictor_async.py b/tests/unit/test_predictor_async.py index fa2d6da6c7..c9f12ff023 100644 --- a/tests/unit/test_predictor_async.py +++ b/tests/unit/test_predictor_async.py @@ -233,7 +233,7 @@ def test_async_predict_call_verify_exceptions(): with pytest.raises( PollingTimeoutError, match=f"No result at {ASYNC_OUTPUT_LOCATION} after polling for " - f"{DEFAULT_WAITER_CONFIG.delay*DEFAULT_WAITER_CONFIG.max_attempts}" + f"{DEFAULT_WAITER_CONFIG.delay * DEFAULT_WAITER_CONFIG.max_attempts}" f" seconds. Inference could still be running", ): predictor_async.predict(input_path=input_location, waiter_config=DEFAULT_WAITER_CONFIG) @@ -253,7 +253,7 @@ def test_async_predict_call_verify_exceptions_with_null_failure_path(): with pytest.raises( PollingTimeoutError, match=f"No result at {ASYNC_OUTPUT_LOCATION} after polling for " - f"{DEFAULT_WAITER_CONFIG.delay*DEFAULT_WAITER_CONFIG.max_attempts}" + f"{DEFAULT_WAITER_CONFIG.delay * DEFAULT_WAITER_CONFIG.max_attempts}" f" seconds. Inference could still be running", ): predictor_async.predict(input_path=input_location, waiter_config=DEFAULT_WAITER_CONFIG) diff --git a/tests/unit/test_tuner.py b/tests/unit/test_tuner.py index f0325b79e9..b4d21008b5 100644 --- a/tests/unit/test_tuner.py +++ b/tests/unit/test_tuner.py @@ -46,7 +46,54 @@ from sagemaker.workflow.parameters import ParameterString, ParameterInteger from src.sagemaker.tuner import InstanceConfig -from .tuner_test_utils import * # noqa: F403 +from .tuner_test_utils import ( + BASE_JOB_NAME, + BUCKET_NAME, + CategoricalParameter, + ContinuousParameter, + DATA_DIR, + EARLY_STOPPING_TYPE, + Estimator, + ESTIMATOR, + ESTIMATOR_NAME, + ESTIMATOR_NAME_TWO, + ESTIMATOR_TWO, + FRAMEWORK_VERSION, + HYPERPARAMETER_RANGES, + HYPERPARAMETER_RANGES_TWO, + IMAGE_NAME, + INPUTS, + INSTANCE_COUNT, + INSTANCE_TYPE, + IntegerParameter, + JOB_NAME, + LIST_TAGS_RESULT, + MAX_JOBS, + MAX_PARALLEL_JOBS, + METRIC_DEFINITIONS, + MODEL_DATA, + MULTI_ALGO_TUNING_JOB_DETAILS, + NUM_COMPONENTS, + OBJECTIVE_METRIC_NAME, + OBJECTIVE_METRIC_NAME_TWO, + OBJECTIVE_TYPE, + PCA, + PY_VERSION, + REGION, + ROLE, + SAGEMAKER_SESSION, + SCRIPT_NAME, + STRATEGY, + TAGS, + TRAINING_JOB_DESCRIPTION, + TRAINING_JOB_NAME, + TUNING_JOB_DETAILS, + WarmStartConfig, + WarmStartTypes, + WARM_START_CONFIG, + ENDPOINT_DESC, + ENDPOINT_CONFIG_DESC, +) @pytest.fixture() diff --git a/tox.ini b/tox.ini index b16c0d2f0b..c47d206380 100644 --- a/tox.ini +++ b/tox.ini @@ -5,7 +5,7 @@ [tox] isolated_build = true -envlist = black-format,flake8,pylint,docstyle,sphinx,doc8,twine,py38,py39,py310,py311 +envlist = black-format,flake8,pylint,docstyle,sphinx,doc8,twine,py39,py310,py311,py312 skip_missing_interpreters = False @@ -21,13 +21,13 @@ exclude = tests/data/ venv/ env/ - tests/unit/test_tensorboard.py # excluding this file for time being + tests/unit/test_tensorboard.py max-complexity = 10 ignore = C901, - E203, # whitespace before ':': Black disagrees with and explicitly violates this. + E203, FI10, FI12, FI13, @@ -35,7 +35,7 @@ ignore = FI15, FI16, FI17, - FI18, # __future__ import "annotations" missing -> check only Python 3.7 compatible + FI18, FI50, FI51, FI52, @@ -67,7 +67,7 @@ markers = [testenv] setenv = PYTHONHASHSEED=42 -pip_version = pip==21.3 +pip_version = pip==24.3 passenv = AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY @@ -82,15 +82,18 @@ passenv = # Can be used to specify which tests to run, e.g.: tox -- -s commands = python -c "import os; os.system('install-custom-pkgs --install-boto-wheels')" - pip install 'apache-airflow==2.9.3' --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.9.3/constraints-3.8.txt" - pip install 'torch==2.0.1+cpu' -f 'https://download.pytorch.org/whl/torch_stable.html' - pip install 'torchvision==0.15.2+cpu' -f 'https://download.pytorch.org/whl/torch_stable.html' - pip install 'dill>=0.3.8' + pip install 'apache-airflow==2.10.4' --constraint "https://raw.githubusercontent.com/apache/airflow/constraints-2.10.4/constraints-3.9.txt" + pip install 'torch==2.3.1+cpu' -f 'https://download.pytorch.org/whl/torch_stable.html' + pip install 'torchvision==0.18.1+cpu' -f 'https://download.pytorch.org/whl/torch_stable.html' + pip install 'dill>=0.3.9' pytest {posargs} deps = .[test] depends = - {py38,py39,py310,p311}: clean + {py39,py310,py311,py312}: clean + +[testenv:py312] +basepython = python3.12 [testenv:runcoverage] description = run unit tests with coverage @@ -105,6 +108,7 @@ deps = -r requirements/tox/flake8_requirements.txt commands = flake8 +basepython = python3.12 [testenv:pylint] skipdist = true @@ -112,7 +116,7 @@ skip_install = true deps = -r requirements/tox/pylint_requirements.txt commands = - python -m pylint --rcfile=.pylintrc -j 0 src/sagemaker + python -m pylint --rcfile=.pylintrc -j 0 src/sagemaker --fail-under=9.9 [testenv:spelling] skipdist = true @@ -132,14 +136,14 @@ commands = twine check dist/*.tar.gz [testenv:sphinx] -pip_version = pip==21.3 +pip_version = pip==24.3 changedir = doc # pip install requirements.txt is separate as RTD does it in separate steps # having the requirements.txt installed in deps above results in Double Requirement exception # https://github.com/pypa/pip/issues/988 commands = pip install --exists-action=w -r requirements.txt - sphinx-build -T -W -b html -d _build/doctrees-readthedocs -D language=en . _build/html + sphinx-build -T -b html -d _build/doctrees-readthedocs -D language=en . _build/html [testenv:doc8] deps = From d1b44a99ccb2bdb3fe077514fc0e7d12a02e0df6 Mon Sep 17 00:00:00 2001 From: Molly He Date: Fri, 18 Apr 2025 13:05:46 -0700 Subject: [PATCH 2/5] bump maxdepth for doc/api/training to fix readthedocs --- doc/api/training/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/training/index.rst b/doc/api/training/index.rst index 0f61cd1931..f36964ca02 100644 --- a/doc/api/training/index.rst +++ b/doc/api/training/index.rst @@ -3,7 +3,7 @@ Training APIs ############# .. toctree:: - :maxdepth: 4 + :maxdepth: 5 model_trainer algorithm From 470241b09be25e72633037c5257c4e1b254a8545 Mon Sep 17 00:00:00 2001 From: Molly He Date: Fri, 18 Apr 2025 14:31:16 -0700 Subject: [PATCH 3/5] change maxdepth for readthedocs rendering doc/api/training page --- doc/api/training/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/training/index.rst b/doc/api/training/index.rst index f36964ca02..e2533f90c5 100644 --- a/doc/api/training/index.rst +++ b/doc/api/training/index.rst @@ -3,7 +3,7 @@ Training APIs ############# .. toctree:: - :maxdepth: 5 + :maxdepth: 2 model_trainer algorithm From 18a74d9eaf11d13499bbec0a7d615ed9f3648297 Mon Sep 17 00:00:00 2001 From: Molly He Date: Fri, 18 Apr 2025 14:42:06 -0700 Subject: [PATCH 4/5] change maxdepth for readthedocs rendering doc/api/training page --- doc/api/training/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/training/index.rst b/doc/api/training/index.rst index e2533f90c5..79ef4b37d1 100644 --- a/doc/api/training/index.rst +++ b/doc/api/training/index.rst @@ -3,7 +3,7 @@ Training APIs ############# .. toctree:: - :maxdepth: 2 + :maxdepth: 3 model_trainer algorithm From 5b2253bf140a7a87f4c2215bcb0339b258859299 Mon Sep 17 00:00:00 2001 From: Molly He Date: Fri, 18 Apr 2025 14:51:36 -0700 Subject: [PATCH 5/5] change maxdepth for readthedocs rendering doc/api/training page --- doc/api/training/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/api/training/index.rst b/doc/api/training/index.rst index 79ef4b37d1..285d9f266d 100644 --- a/doc/api/training/index.rst +++ b/doc/api/training/index.rst @@ -3,7 +3,7 @@ Training APIs ############# .. toctree:: - :maxdepth: 3 + :maxdepth: 1 model_trainer algorithm