From e7c0dbd6dbfe4a5f15852ad94330fe6075963f88 Mon Sep 17 00:00:00 2001 From: Sam Liu Date: Mon, 30 Jan 2023 17:03:19 -0800 Subject: [PATCH] ci: (experimental) Enable more ruff rules --- Makefile | 3 + bin/add_transform_test.py | 5 +- bin/parse_docs.py | 2 +- bin/sam-translate.py | 5 +- ruff.toml | 6 + .../feature_toggle/feature_toggle.py | 6 +- samtranslator/intrinsics/actions.py | 31 ++++-- samtranslator/intrinsics/resolver.py | 6 +- samtranslator/metrics/method_decorator.py | 5 +- samtranslator/metrics/metrics.py | 2 +- samtranslator/model/__init__.py | 8 +- samtranslator/model/api/api_generator.py | 25 ++--- samtranslator/model/api/http_api_generator.py | 11 +- samtranslator/model/apigateway.py | 2 +- samtranslator/model/apigatewayv2.py | 4 +- samtranslator/model/cloudformation.py | 2 +- samtranslator/model/codedeploy.py | 2 +- samtranslator/model/cognito.py | 2 +- samtranslator/model/connector/connector.py | 5 +- samtranslator/model/dynamodb.py | 2 +- samtranslator/model/eventbridge_utils.py | 2 +- samtranslator/model/events.py | 2 +- .../model/eventsources/cloudwatchlogs.py | 1 + samtranslator/model/eventsources/pull.py | 9 +- samtranslator/model/eventsources/push.py | 30 +++-- samtranslator/model/eventsources/scheduler.py | 9 +- samtranslator/model/iam.py | 4 +- samtranslator/model/intrinsics.py | 18 +-- samtranslator/model/iot.py | 2 +- samtranslator/model/lambda_.py | 7 +- samtranslator/model/log.py | 2 +- .../deployment_preference_collection.py | 14 +-- samtranslator/model/resource_policies.py | 6 +- .../model/role_utils/role_constructor.py | 4 +- samtranslator/model/route53.py | 2 +- samtranslator/model/s3.py | 4 +- samtranslator/model/s3_utils/uri_parser.py | 3 +- samtranslator/model/sam_resources.py | 105 +++++++++--------- samtranslator/model/scheduler.py | 2 +- samtranslator/model/sns.py | 2 +- samtranslator/model/sqs.py | 2 +- samtranslator/model/stepfunctions/__init__.py | 4 +- samtranslator/model/stepfunctions/events.py | 12 +- .../model/stepfunctions/generators.py | 6 +- .../model/stepfunctions/resources.py | 2 +- samtranslator/open_api/open_api.py | 9 +- samtranslator/parser/parser.py | 4 +- samtranslator/plugins/__init__.py | 1 - .../api/default_definition_body_plugin.py | 4 +- .../plugins/api/implicit_api_plugin.py | 8 +- .../plugins/api/implicit_http_api_plugin.py | 2 +- .../plugins/api/implicit_rest_api_plugin.py | 2 +- .../application/serverless_app_plugin.py | 12 +- samtranslator/plugins/globals/globals.py | 4 +- .../plugins/globals/globals_plugin.py | 7 +- .../policies/policy_templates_plugin.py | 6 +- samtranslator/plugins/sam_plugins.py | 5 +- .../policy_template_processor/processor.py | 8 +- .../policy_template_processor/template.py | 3 +- samtranslator/public/exceptions.py | 2 +- samtranslator/public/intrinsics.py | 1 - samtranslator/public/translator.py | 2 +- samtranslator/sdk/parameter.py | 5 +- samtranslator/swagger/swagger.py | 6 +- samtranslator/third_party/py27hash/hash.py | 4 +- samtranslator/translator/arn_generator.py | 3 +- samtranslator/translator/transform.py | 2 +- samtranslator/translator/translator.py | 34 +++--- samtranslator/translator/verify_logical_id.py | 3 +- samtranslator/utils/py27hash_fix.py | 7 +- samtranslator/utils/utils.py | 2 +- samtranslator/validator/value_validator.py | 2 +- schema_source/aws_serverless_api.py | 10 +- schema_source/aws_serverless_application.py | 4 +- schema_source/aws_serverless_connector.py | 4 +- schema_source/aws_serverless_function.py | 11 +- schema_source/aws_serverless_httpapi.py | 10 +- schema_source/aws_serverless_layerversion.py | 2 +- schema_source/aws_serverless_simpletable.py | 4 +- schema_source/aws_serverless_statemachine.py | 10 +- schema_source/common.py | 5 +- schema_source/schema.py | 16 ++- 82 files changed, 313 insertions(+), 299 deletions(-) diff --git a/Makefile b/Makefile index 56243f2e05..7ef21c80d8 100755 --- a/Makefile +++ b/Makefile @@ -45,6 +45,9 @@ lint: # cfn-lint to make sure generated CloudFormation makes sense bin/run_cfn_lint.sh +lint-fix: + ruff --fix samtranslator bin schema_source + prepare-companion-stack: pytest -v --no-cov integration/setup -m setup diff --git a/bin/add_transform_test.py b/bin/add_transform_test.py index 2f77901d9b..fdb31db32f 100755 --- a/bin/add_transform_test.py +++ b/bin/add_transform_test.py @@ -12,15 +12,16 @@ --disable-update-partition Disable updating the partition of arn to aws-cn/aws-us-gov """ import json -import subprocess import os import shutil +import subprocess import sys import tempfile -from docopt import docopt # type: ignore from pathlib import Path from typing import Any, Dict +from docopt import docopt # type: ignore + SCRIPT_DIR = os.path.dirname(os.path.realpath(__file__)) TRANSFORM_TEST_DIR = os.path.join(SCRIPT_DIR, "..", "tests", "translator") CLI_OPTIONS = docopt(__doc__) diff --git a/bin/parse_docs.py b/bin/parse_docs.py index 3d117e19bb..9d329b763c 100755 --- a/bin/parse_docs.py +++ b/bin/parse_docs.py @@ -14,7 +14,7 @@ import json import re from pathlib import Path -from typing import Iterator, Tuple, Dict +from typing import Dict, Iterator, Tuple def parse(s: str, cfn_docs: bool) -> Iterator[Tuple[str, str]]: diff --git a/bin/sam-translate.py b/bin/sam-translate.py index 2b532047aa..4d8b792467 100755 --- a/bin/sam-translate.py +++ b/bin/sam-translate.py @@ -24,19 +24,18 @@ import platform import subprocess import sys +from functools import reduce import boto3 - from docopt import docopt # type: ignore[import] -from functools import reduce my_path = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, my_path + "/..") +from samtranslator.model.exceptions import InvalidDocumentException from samtranslator.public.translator import ManagedPolicyLoader from samtranslator.translator.transform import transform from samtranslator.yaml_helper import yaml_parse -from samtranslator.model.exceptions import InvalidDocumentException LOG = logging.getLogger(__name__) cli_options = docopt(__doc__) diff --git a/ruff.toml b/ruff.toml index cea2c33913..f855338c3d 100644 --- a/ruff.toml +++ b/ruff.toml @@ -1,6 +1,12 @@ # black formatter takes care of the line length line-length = 999 +# Enable Pyflakes `E`, `F` codes, pylint `PL`, isort `I` and pyupgrade (UP). +select = ["E", "F", "PL", "I"] + +# Mininal python version we support is 3.7 +target-version = "py37" + [per-file-ignores] # python scripts in bin/ needs some python path configurations before import "bin/*.py" = ["E402"] # E402: module-import-not-at-top-of-file diff --git a/samtranslator/feature_toggle/feature_toggle.py b/samtranslator/feature_toggle/feature_toggle.py index 2a63ff57b9..abcc115e0a 100644 --- a/samtranslator/feature_toggle/feature_toggle.py +++ b/samtranslator/feature_toggle/feature_toggle.py @@ -1,15 +1,15 @@ import json +import logging from abc import ABC, abstractmethod from typing import Any, Dict, cast import boto3 -import logging - from botocore.config import Config + from samtranslator.feature_toggle.dialup import ( DisabledDialup, - ToggleDialup, SimpleAccountPercentileDialup, + ToggleDialup, ) from samtranslator.metrics.method_decorator import cw_timer from samtranslator.utils.constants import BOTO3_CONNECT_TIMEOUT diff --git a/samtranslator/intrinsics/actions.py b/samtranslator/intrinsics/actions.py index df61ef43e1..a1752b43ca 100644 --- a/samtranslator/intrinsics/actions.py +++ b/samtranslator/intrinsics/actions.py @@ -1,8 +1,8 @@ import re from abc import ABC -from typing import Any, Dict, Optional, Tuple, Callable, List +from typing import Any, Callable, Dict, List, Optional, Tuple -from samtranslator.model.exceptions import InvalidTemplateException, InvalidDocumentException +from samtranslator.model.exceptions import InvalidDocumentException, InvalidTemplateException class Action(ABC): @@ -68,10 +68,15 @@ def _parse_resource_reference(cls, ref_value: Any) -> Tuple[Optional[str], Optio splits = ref_value.split(cls._resource_ref_separator, 1) # Either there is no 'dot' (or) one of the values is empty string (Ex: when you split "LogicalId.") - if len(splits) != 2 or not all(splits): + try: + logical_id, property_name = splits + except ValueError: return no_result - return splits[0], splits[1] + if not logical_id or not property_name: + return no_result + + return logical_id, property_name class RefAction(Action): @@ -233,11 +238,11 @@ def do_replacement(full_ref: str, ref_value: str) -> str: splits = ref_value.split(self._resource_ref_separator) # If we don't find at least two parts, there is nothing to resolve - if len(splits) < 2: + try: + logical_id, property_name = splits[:2] + except ValueError: return full_ref - logical_id = splits[0] - property_name = splits[1] resolved_value = supported_resource_refs.get(logical_id, property_name) if not resolved_value: # This ID/property combination is not in the supported references @@ -400,6 +405,8 @@ def handler_method(full_ref, ref_value): class GetAttAction(Action): intrinsic_name = "Fn::GetAtt" + _MIN_NUM_ARGUMENTS = 2 + def resolve_parameter_refs(self, input_dict: Optional[Any], parameters: Dict[str, Any]) -> Optional[Any]: # Parameters can never be referenced within GetAtt value return input_dict @@ -503,9 +510,9 @@ def resolve_resource_id_refs( return self._get_resolved_dictionary(input_dict, key, resolved_value, remaining) def _check_input_value(self, value: Any) -> bool: - # Value must be an array with *at least* two elements. If not, this is invalid GetAtt syntax. We just pass along + # Value must be an array with enough elements. If not, this is invalid GetAtt syntax. We just pass along # the input to CFN for it to do the "official" validation. - if not isinstance(value, list) or len(value) < 2: + if not isinstance(value, list) or len(value) < self._MIN_NUM_ARGUMENTS: return False # If items in value array is not a string, then following join line will fail. So if any element is not a string @@ -542,6 +549,8 @@ class FindInMapAction(Action): intrinsic_name = "Fn::FindInMap" + _NUM_ARGUMENTS = 3 + def resolve_parameter_refs(self, input_dict: Optional[Any], parameters: Dict[str, Any]) -> Optional[Any]: """ Recursively resolves "Fn::FindInMap"references that are present in the mappings and returns the value. @@ -558,11 +567,11 @@ def resolve_parameter_refs(self, input_dict: Optional[Any], parameters: Dict[str value = input_dict[self.intrinsic_name] # FindInMap expects an array with 3 values - if not isinstance(value, list) or len(value) != 3: + if not isinstance(value, list) or len(value) != self._NUM_ARGUMENTS: raise InvalidDocumentException( [ InvalidTemplateException( - f"Invalid FindInMap value {value}. FindInMap expects an array with 3 values." + f"Invalid FindInMap value {value}. FindInMap expects an array with {self._NUM_ARGUMENTS} values." ) ] ) diff --git a/samtranslator/intrinsics/resolver.py b/samtranslator/intrinsics/resolver.py index 8bd2097cbe..e0f892d078 100644 --- a/samtranslator/intrinsics/resolver.py +++ b/samtranslator/intrinsics/resolver.py @@ -1,9 +1,9 @@ # Help resolve intrinsic functions -from typing import Any, Dict, Optional, Callable, List, Union +from typing import Any, Callable, Dict, List, Optional, Union -from samtranslator.intrinsics.actions import Action, SubAction, RefAction, GetAttAction -from samtranslator.model.exceptions import InvalidTemplateException, InvalidDocumentException +from samtranslator.intrinsics.actions import Action, GetAttAction, RefAction, SubAction from samtranslator.intrinsics.resource_refs import SupportedResourceReferences +from samtranslator.model.exceptions import InvalidDocumentException, InvalidTemplateException # All intrinsics are supported by default DEFAULT_SUPPORTED_INTRINSICS = {action.intrinsic_name: action() for action in [RefAction, SubAction, GetAttAction]} diff --git a/samtranslator/metrics/method_decorator.py b/samtranslator/metrics/method_decorator.py index c92dd442b4..2fbb2f37cf 100644 --- a/samtranslator/metrics/method_decorator.py +++ b/samtranslator/metrics/method_decorator.py @@ -2,11 +2,12 @@ Method decorator for execution latency collection """ import functools +import logging from datetime import datetime +from typing import Any, Callable, Optional, Union + from samtranslator.metrics.metrics import DummyMetricsPublisher, Metrics from samtranslator.model import Resource -import logging -from typing import Any, Callable, Optional, Union LOG = logging.getLogger(__name__) diff --git a/samtranslator/metrics/metrics.py b/samtranslator/metrics/metrics.py index 34c7537d21..bbcfd54941 100644 --- a/samtranslator/metrics/metrics.py +++ b/samtranslator/metrics/metrics.py @@ -2,9 +2,9 @@ Helper classes to publish metrics """ import logging +from abc import ABC, abstractmethod from datetime import datetime from typing import Any, Dict -from abc import ABC, abstractmethod LOG = logging.getLogger(__name__) diff --git a/samtranslator/model/__init__.py b/samtranslator/model/__init__.py index 24c4ddf72d..0c372c4b0c 100644 --- a/samtranslator/model/__init__.py +++ b/samtranslator/model/__init__.py @@ -1,14 +1,14 @@ """ CloudFormation Resource serialization, deserialization, and validation """ -import re import inspect -from abc import ABC +import re +from abc import ABC, ABCMeta from typing import Any, Callable, Dict, List, Optional, Tuple, Union -from abc import ABCMeta + from samtranslator.intrinsics.resolver import IntrinsicsResolver from samtranslator.model.exceptions import ExpectedType, InvalidResourceException, InvalidResourcePropertyTypeException +from samtranslator.model.tags.resource_tagging import get_tag_list from samtranslator.model.types import IS_DICT, IS_STR, Validator, any_type, is_type from samtranslator.plugins import LifeCycleEvents -from samtranslator.model.tags.resource_tagging import get_tag_list class PropertyType: diff --git a/samtranslator/model/api/api_generator.py b/samtranslator/model/api/api_generator.py index fe7b86e5ae..fa84eda794 100644 --- a/samtranslator/model/api/api_generator.py +++ b/samtranslator/model/api/api_generator.py @@ -1,39 +1,38 @@ import logging from collections import namedtuple -from typing import List, Optional, Set, Dict, Any, cast, Union, Tuple +from typing import Any, Dict, List, Optional, Set, Tuple, Union, cast from samtranslator.metrics.method_decorator import cw_timer -from samtranslator.model.intrinsics import ref, fnGetAtt, make_or_condition from samtranslator.model.apigateway import ( + ApiGatewayApiKey, + ApiGatewayAuthorizer, + ApiGatewayBasePathMapping, ApiGatewayDeployment, + ApiGatewayDomainName, + ApiGatewayResponse, ApiGatewayRestApi, ApiGatewayStage, - ApiGatewayAuthorizer, - ApiGatewayResponse, - ApiGatewayDomainName, - ApiGatewayBasePathMapping, ApiGatewayUsagePlan, ApiGatewayUsagePlanKey, - ApiGatewayApiKey, ) -from samtranslator.model.route53 import Route53RecordSetGroup from samtranslator.model.exceptions import ( ExpectedType, InvalidDocumentException, InvalidResourceException, InvalidTemplateException, ) +from samtranslator.model.intrinsics import fnGetAtt, fnSub, is_intrinsic, make_or_condition, ref +from samtranslator.model.lambda_ import LambdaPermission +from samtranslator.model.route53 import Route53RecordSetGroup from samtranslator.model.s3_utils.uri_parser import parse_s3_uri +from samtranslator.model.tags.resource_tagging import get_tag_list from samtranslator.model.types import PassThrough from samtranslator.region_configuration import RegionConfiguration from samtranslator.swagger.swagger import SwaggerEditor -from samtranslator.model.intrinsics import is_intrinsic, fnSub -from samtranslator.model.lambda_ import LambdaPermission -from samtranslator.translator.logical_id_generator import LogicalIdGenerator from samtranslator.translator.arn_generator import ArnGenerator -from samtranslator.utils.types import Intrinsicable -from samtranslator.model.tags.resource_tagging import get_tag_list +from samtranslator.translator.logical_id_generator import LogicalIdGenerator from samtranslator.utils.py27hash_fix import Py27Dict, Py27UniStr +from samtranslator.utils.types import Intrinsicable from samtranslator.utils.utils import InvalidValueType, dict_deep_get from samtranslator.validator.value_validator import sam_expect diff --git a/samtranslator/model/api/http_api_generator.py b/samtranslator/model/api/http_api_generator.py index ff98adb7ce..55fbbc9b69 100644 --- a/samtranslator/model/api/http_api_generator.py +++ b/samtranslator/model/api/http_api_generator.py @@ -3,20 +3,19 @@ from typing import Any, Dict, List, Optional, Tuple, Union, cast from samtranslator.metrics.method_decorator import cw_timer -from samtranslator.model.intrinsics import ref, fnGetAtt from samtranslator.model.apigatewayv2 import ( - ApiGatewayV2HttpApi, - ApiGatewayV2Stage, + ApiGatewayV2ApiMapping, ApiGatewayV2Authorizer, ApiGatewayV2DomainName, - ApiGatewayV2ApiMapping, + ApiGatewayV2HttpApi, + ApiGatewayV2Stage, ) from samtranslator.model.exceptions import InvalidResourceException +from samtranslator.model.intrinsics import fnGetAtt, is_intrinsic, is_intrinsic_no_value, ref +from samtranslator.model.route53 import Route53RecordSetGroup from samtranslator.model.s3_utils.uri_parser import parse_s3_uri from samtranslator.open_api.open_api import OpenApiEditor from samtranslator.translator.logical_id_generator import LogicalIdGenerator -from samtranslator.model.intrinsics import is_intrinsic, is_intrinsic_no_value -from samtranslator.model.route53 import Route53RecordSetGroup from samtranslator.utils.types import Intrinsicable from samtranslator.utils.utils import InvalidValueType, dict_deep_get from samtranslator.validator.value_validator import sam_expect diff --git a/samtranslator/model/apigateway.py b/samtranslator/model/apigateway.py index 0a31e8f7d1..ab41822c39 100644 --- a/samtranslator/model/apigateway.py +++ b/samtranslator/model/apigateway.py @@ -5,7 +5,7 @@ from samtranslator.model import PropertyType, Resource from samtranslator.model.exceptions import InvalidResourceException from samtranslator.model.intrinsics import fnSub, ref -from samtranslator.model.types import IS_DICT, IS_STR, is_type, list_of, one_of, PassThrough +from samtranslator.model.types import IS_DICT, IS_STR, PassThrough, is_type, list_of, one_of from samtranslator.translator import logical_id_generator from samtranslator.translator.arn_generator import ArnGenerator from samtranslator.utils.py27hash_fix import Py27Dict, Py27UniStr diff --git a/samtranslator/model/apigatewayv2.py b/samtranslator/model/apigatewayv2.py index 5b00b2afcd..81af95d5ff 100644 --- a/samtranslator/model/apigatewayv2.py +++ b/samtranslator/model/apigatewayv2.py @@ -1,9 +1,9 @@ from typing import Any, Dict, List, Optional, Union from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import IS_DICT, is_type, one_of, IS_STR, list_of, PassThrough -from samtranslator.model.intrinsics import ref, fnSub from samtranslator.model.exceptions import ExpectedType, InvalidResourceException +from samtranslator.model.intrinsics import fnSub, ref +from samtranslator.model.types import IS_DICT, IS_STR, PassThrough, is_type, list_of, one_of from samtranslator.translator.arn_generator import ArnGenerator from samtranslator.utils.types import Intrinsicable from samtranslator.validator.value_validator import sam_expect diff --git a/samtranslator/model/cloudformation.py b/samtranslator/model/cloudformation.py index 149ce6c618..129345b28e 100644 --- a/samtranslator/model/cloudformation.py +++ b/samtranslator/model/cloudformation.py @@ -1,6 +1,6 @@ from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import IS_DICT, is_type, IS_STR, list_of, one_of from samtranslator.model.intrinsics import ref +from samtranslator.model.types import IS_DICT, IS_STR, is_type, list_of, one_of class NestedStack(Resource): diff --git a/samtranslator/model/codedeploy.py b/samtranslator/model/codedeploy.py index 8bfca87adc..69f281959c 100644 --- a/samtranslator/model/codedeploy.py +++ b/samtranslator/model/codedeploy.py @@ -1,6 +1,6 @@ from samtranslator.model import PropertyType, Resource from samtranslator.model.intrinsics import ref -from samtranslator.model.types import IS_DICT, is_type, one_of, IS_STR +from samtranslator.model.types import IS_DICT, IS_STR, is_type, one_of class CodeDeployApplication(Resource): diff --git a/samtranslator/model/cognito.py b/samtranslator/model/cognito.py index eed9d54347..348d0e358a 100644 --- a/samtranslator/model/cognito.py +++ b/samtranslator/model/cognito.py @@ -1,6 +1,6 @@ from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import IS_DICT, list_of, IS_STR from samtranslator.model.intrinsics import fnGetAtt, ref +from samtranslator.model.types import IS_DICT, IS_STR, list_of class CognitoUserPool(Resource): diff --git a/samtranslator/model/connector/connector.py b/samtranslator/model/connector/connector.py index fcca66ce8e..7c13ae69da 100644 --- a/samtranslator/model/connector/connector.py +++ b/samtranslator/model/connector/connector.py @@ -1,11 +1,10 @@ from collections import namedtuple -from typing import Any, Dict, List, Optional, Iterable +from typing import Any, Dict, Iterable, List, Optional from samtranslator.model import ResourceResolver -from samtranslator.model.intrinsics import get_logical_id_from_intrinsic, ref, fnGetAtt +from samtranslator.model.intrinsics import fnGetAtt, get_logical_id_from_intrinsic, ref from samtranslator.utils.utils import as_array, insert_unique - # TODO: Switch to dataclass ConnectorResourceReference = namedtuple( "ConnectorResourceReference", diff --git a/samtranslator/model/dynamodb.py b/samtranslator/model/dynamodb.py index a7037e935c..ed33a11e30 100644 --- a/samtranslator/model/dynamodb.py +++ b/samtranslator/model/dynamodb.py @@ -1,6 +1,6 @@ from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import IS_DICT, is_type, dict_of, list_of, IS_STR, one_of from samtranslator.model.intrinsics import fnGetAtt, ref +from samtranslator.model.types import IS_DICT, IS_STR, dict_of, is_type, list_of, one_of class DynamoDBTable(Resource): diff --git a/samtranslator/model/eventbridge_utils.py b/samtranslator/model/eventbridge_utils.py index 2fc2790d95..07b5ec5f77 100644 --- a/samtranslator/model/eventbridge_utils.py +++ b/samtranslator/model/eventbridge_utils.py @@ -1,5 +1,5 @@ -from samtranslator.model.sqs import SQSQueue, SQSQueuePolicy, SQSQueuePolicies from samtranslator.model.exceptions import InvalidEventException +from samtranslator.model.sqs import SQSQueue, SQSQueuePolicies, SQSQueuePolicy class EventBridgeRuleUtils: diff --git a/samtranslator/model/events.py b/samtranslator/model/events.py index 1be29c52c8..80ff1a8591 100644 --- a/samtranslator/model/events.py +++ b/samtranslator/model/events.py @@ -1,6 +1,6 @@ from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import IS_DICT, list_of, IS_STR from samtranslator.model.intrinsics import fnGetAtt, ref +from samtranslator.model.types import IS_DICT, IS_STR, list_of class EventsRule(Resource): diff --git a/samtranslator/model/eventsources/cloudwatchlogs.py b/samtranslator/model/eventsources/cloudwatchlogs.py index 743dc1c452..6b98a5c306 100644 --- a/samtranslator/model/eventsources/cloudwatchlogs.py +++ b/samtranslator/model/eventsources/cloudwatchlogs.py @@ -6,6 +6,7 @@ from samtranslator.model.log import SubscriptionFilter from samtranslator.model.types import IS_STR from samtranslator.translator.arn_generator import ArnGenerator + from . import FUNCTION_EVETSOURCE_METRIC_PREFIX from .push import PushEventSource diff --git a/samtranslator/model/eventsources/pull.py b/samtranslator/model/eventsources/pull.py index b02bc1837d..bc72bbed1a 100644 --- a/samtranslator/model/eventsources/pull.py +++ b/samtranslator/model/eventsources/pull.py @@ -2,15 +2,14 @@ from typing import Any, Dict, List, Optional from samtranslator.metrics.method_decorator import cw_timer -from samtranslator.model import ResourceMacro, PropertyType, PassThroughProperty +from samtranslator.model import PassThroughProperty, PropertyType, ResourceMacro from samtranslator.model.eventsources import FUNCTION_EVETSOURCE_METRIC_PREFIX -from samtranslator.model.types import IS_DICT, is_type, IS_STR, PassThrough +from samtranslator.model.exceptions import InvalidEventException +from samtranslator.model.iam import IAMRolePolicies from samtranslator.model.intrinsics import is_intrinsic - from samtranslator.model.lambda_ import LambdaEventSourceMapping +from samtranslator.model.types import IS_DICT, IS_STR, PassThrough, is_type from samtranslator.translator.arn_generator import ArnGenerator -from samtranslator.model.exceptions import InvalidEventException -from samtranslator.model.iam import IAMRolePolicies from samtranslator.utils.types import Intrinsicable from samtranslator.validator.value_validator import sam_expect diff --git a/samtranslator/model/eventsources/push.py b/samtranslator/model/eventsources/push.py index f590c4e271..3d9cd19ac2 100644 --- a/samtranslator/model/eventsources/push.py +++ b/samtranslator/model/eventsources/push.py @@ -5,27 +5,25 @@ from samtranslator.intrinsics.resolver import IntrinsicsResolver from samtranslator.metrics.method_decorator import cw_timer -from samtranslator.model import ResourceMacro, PropertyType -from samtranslator.model.eventsources import FUNCTION_EVETSOURCE_METRIC_PREFIX -from samtranslator.model.types import IS_DICT, is_type, list_of, dict_of, one_of, IS_STR -from samtranslator.model.intrinsics import is_intrinsic, ref, fnGetAtt, fnSub, make_shorthand, make_conditional -from samtranslator.model.tags.resource_tagging import get_tag_list - -from samtranslator.model.s3 import S3Bucket -from samtranslator.model.sns import SNSSubscription -from samtranslator.model.lambda_ import LambdaPermission +from samtranslator.model import PropertyType, ResourceMacro +from samtranslator.model.cognito import CognitoUserPool +from samtranslator.model.eventbridge_utils import EventBridgeRuleUtils from samtranslator.model.events import EventsRule +from samtranslator.model.eventsources import FUNCTION_EVETSOURCE_METRIC_PREFIX from samtranslator.model.eventsources.pull import SQS -from samtranslator.model.sqs import SQSQueue, SQSQueuePolicy, SQSQueuePolicies -from samtranslator.model.eventbridge_utils import EventBridgeRuleUtils +from samtranslator.model.exceptions import InvalidDocumentException, InvalidEventException, InvalidResourceException +from samtranslator.model.intrinsics import fnGetAtt, fnSub, is_intrinsic, make_conditional, make_shorthand, ref from samtranslator.model.iot import IotTopicRule -from samtranslator.model.cognito import CognitoUserPool -from samtranslator.model.types import PassThrough +from samtranslator.model.lambda_ import LambdaPermission +from samtranslator.model.s3 import S3Bucket +from samtranslator.model.sns import SNSSubscription +from samtranslator.model.sqs import SQSQueue, SQSQueuePolicies, SQSQueuePolicy +from samtranslator.model.tags.resource_tagging import get_tag_list +from samtranslator.model.types import IS_DICT, IS_STR, PassThrough, dict_of, is_type, list_of, one_of +from samtranslator.open_api.open_api import OpenApiEditor +from samtranslator.swagger.swagger import SwaggerEditor from samtranslator.translator import logical_id_generator from samtranslator.translator.arn_generator import ArnGenerator -from samtranslator.model.exceptions import InvalidEventException, InvalidResourceException, InvalidDocumentException -from samtranslator.swagger.swagger import SwaggerEditor -from samtranslator.open_api.open_api import OpenApiEditor from samtranslator.utils.py27hash_fix import Py27Dict, Py27UniStr from samtranslator.validator.value_validator import sam_expect diff --git a/samtranslator/model/eventsources/scheduler.py b/samtranslator/model/eventsources/scheduler.py index 8dcb3a7abf..29808498a5 100644 --- a/samtranslator/model/eventsources/scheduler.py +++ b/samtranslator/model/eventsources/scheduler.py @@ -3,14 +3,13 @@ from samtranslator.metrics.method_decorator import cw_timer from samtranslator.model import PropertyType, Resource, ResourceMacro -from samtranslator.model.iam import IAMRole -from samtranslator.model.sqs import SQSQueue -from samtranslator.model.types import IS_DICT, IS_STR -from samtranslator.model.eventsources import FUNCTION_EVETSOURCE_METRIC_PREFIX from samtranslator.model.eventbridge_utils import EventBridgeRuleUtils +from samtranslator.model.eventsources import FUNCTION_EVETSOURCE_METRIC_PREFIX from samtranslator.model.exceptions import InvalidEventException -from samtranslator.model.iam import IAMRolePolicies +from samtranslator.model.iam import IAMRole, IAMRolePolicies from samtranslator.model.scheduler import SchedulerSchedule +from samtranslator.model.sqs import SQSQueue +from samtranslator.model.types import IS_DICT, IS_STR from samtranslator.translator.logical_id_generator import LogicalIdGenerator diff --git a/samtranslator/model/iam.py b/samtranslator/model/iam.py index 5a7231d067..961bf68900 100644 --- a/samtranslator/model/iam.py +++ b/samtranslator/model/iam.py @@ -1,8 +1,8 @@ from typing import Any, Dict from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import IS_DICT, is_type, IS_STR, list_of -from samtranslator.model.intrinsics import ref, fnGetAtt +from samtranslator.model.intrinsics import fnGetAtt, ref +from samtranslator.model.types import IS_DICT, IS_STR, is_type, list_of class IAMRole(Resource): diff --git a/samtranslator/model/intrinsics.py b/samtranslator/model/intrinsics.py index 343c6a2374..13b14d0ee9 100644 --- a/samtranslator/model/intrinsics.py +++ b/samtranslator/model/intrinsics.py @@ -1,4 +1,8 @@ -from typing import Any, Dict, Iterable, List, Union, Optional +from typing import Any, Dict, Iterable, List, Optional, Union + +MIN_NUM_CONDITIONS_TO_COMBINE = 2 +_NUM_ARGUMENTS_REQUIRED_IN_IF = 3 +_NUM_ARGUMENTS_REQUIRED_IN_GETATT = 2 def fnGetAtt(logical_name: str, attribute_name: str) -> Dict[str, List[str]]: @@ -88,8 +92,8 @@ def make_combined_condition( :param string condition_name: base name desired for new condition :return: dictionary of condition_name: condition_value """ - if len(conditions_list) < 2: - # Can't make a condition if <2 conditions provided. + if len(conditions_list) < MIN_NUM_CONDITIONS_TO_COMBINE: + # Can't make a condition not enough conditions are provided. return None # Total number of conditions allows in an Fn::Or statement. See docs: @@ -182,8 +186,8 @@ def validate_intrinsic_if_items(items: Any) -> None: ValueError If the items are invalid """ - if not isinstance(items, list) or len(items) != 3: - raise ValueError("Fn::If requires 3 arguments") + if not isinstance(items, list) or len(items) != _NUM_ARGUMENTS_REQUIRED_IN_IF: + raise ValueError(f"Fn::If requires {_NUM_ARGUMENTS_REQUIRED_IN_IF} arguments") def is_intrinsic_no_value(_input: Any) -> bool: @@ -219,13 +223,13 @@ def get_logical_id_from_intrinsic(_input: Any) -> Optional[str]: # Fn::GetAtt: [, ] v = _input.get("Fn::GetAtt") - if isinstance(v, list) and len(v) == 2 and isinstance(v[0], str): + if isinstance(v, list) and len(v) == _NUM_ARGUMENTS_REQUIRED_IN_GETATT and isinstance(v[0], str): return v[0] # Fn::GetAtt: . if isinstance(v, str): tokens = v.split(".") - if len(tokens) == 2: + if len(tokens) == _NUM_ARGUMENTS_REQUIRED_IN_GETATT: return tokens[0] return None diff --git a/samtranslator/model/iot.py b/samtranslator/model/iot.py index 55fea051c2..7aa8b1ac8f 100644 --- a/samtranslator/model/iot.py +++ b/samtranslator/model/iot.py @@ -1,6 +1,6 @@ from samtranslator.model import PropertyType, Resource +from samtranslator.model.intrinsics import fnGetAtt, ref from samtranslator.model.types import IS_DICT -from samtranslator.model.intrinsics import ref, fnGetAtt class IotTopicRule(Resource): diff --git a/samtranslator/model/lambda_.py b/samtranslator/model/lambda_.py index 6929e43b0a..2283ad6225 100644 --- a/samtranslator/model/lambda_.py +++ b/samtranslator/model/lambda_.py @@ -1,7 +1,8 @@ -from typing import Optional, Dict, Any, List, Union -from samtranslator.model import PropertyType, Resource, PassThroughProperty -from samtranslator.model.types import IS_DICT, is_type, one_of, IS_STR, list_of, any_type +from typing import Any, Dict, List, Optional, Union + +from samtranslator.model import PassThroughProperty, PropertyType, Resource from samtranslator.model.intrinsics import fnGetAtt, ref +from samtranslator.model.types import IS_DICT, IS_STR, any_type, is_type, list_of, one_of from samtranslator.utils.types import Intrinsicable diff --git a/samtranslator/model/log.py b/samtranslator/model/log.py index 45c045bc58..42615587d3 100644 --- a/samtranslator/model/log.py +++ b/samtranslator/model/log.py @@ -1,6 +1,6 @@ from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import IS_STR from samtranslator.model.intrinsics import fnGetAtt, ref +from samtranslator.model.types import IS_STR class SubscriptionFilter(Resource): diff --git a/samtranslator/model/preferences/deployment_preference_collection.py b/samtranslator/model/preferences/deployment_preference_collection.py index de2c6f5607..2106b50dcf 100644 --- a/samtranslator/model/preferences/deployment_preference_collection.py +++ b/samtranslator/model/preferences/deployment_preference_collection.py @@ -1,23 +1,23 @@ -from typing import Any, Dict, Optional, cast, List, Union +import copy +from typing import Any, Dict, List, Optional, Union, cast -from .deployment_preference import DeploymentPreference -from samtranslator.model.codedeploy import CodeDeployApplication -from samtranslator.model.codedeploy import CodeDeployDeploymentGroup +from samtranslator.model.codedeploy import CodeDeployApplication, CodeDeployDeploymentGroup from samtranslator.model.exceptions import InvalidResourceException from samtranslator.model.iam import IAMRole from samtranslator.model.intrinsics import ( + fnGetAtt, fnSub, is_intrinsic, is_intrinsic_if, is_intrinsic_no_value, - validate_intrinsic_if_items, make_combined_condition, ref, - fnGetAtt, + validate_intrinsic_if_items, ) from samtranslator.model.update_policy import UpdatePolicy from samtranslator.translator.arn_generator import ArnGenerator -import copy + +from .deployment_preference import DeploymentPreference CODE_DEPLOY_SERVICE_ROLE_LOGICAL_ID = "CodeDeployServiceRole" CODEDEPLOY_APPLICATION_LOGICAL_ID = "ServerlessDeploymentApplication" diff --git a/samtranslator/model/resource_policies.py b/samtranslator/model/resource_policies.py index 492dafe2c7..39af92577a 100644 --- a/samtranslator/model/resource_policies.py +++ b/samtranslator/model/resource_policies.py @@ -1,14 +1,14 @@ -from enum import Enum from collections import namedtuple -from typing import Dict, Any, List +from enum import Enum +from typing import Any, Dict, List +from samtranslator.model.exceptions import InvalidTemplateException from samtranslator.model.intrinsics import ( is_intrinsic, is_intrinsic_if, is_intrinsic_no_value, validate_intrinsic_if_items, ) -from samtranslator.model.exceptions import InvalidTemplateException PolicyEntry = namedtuple("PolicyEntry", "data type") diff --git a/samtranslator/model/role_utils/role_constructor.py b/samtranslator/model/role_utils/role_constructor.py index ff92f44a59..c5d39ef67e 100644 --- a/samtranslator/model/role_utils/role_constructor.py +++ b/samtranslator/model/role_utils/role_constructor.py @@ -1,7 +1,7 @@ +from samtranslator.model.exceptions import InvalidResourceException from samtranslator.model.iam import IAMRole -from samtranslator.model.resource_policies import PolicyTypes from samtranslator.model.intrinsics import is_intrinsic_if, is_intrinsic_no_value -from samtranslator.model.exceptions import InvalidResourceException +from samtranslator.model.resource_policies import PolicyTypes def construct_role_for_resource( # type: ignore[no-untyped-def] diff --git a/samtranslator/model/route53.py b/samtranslator/model/route53.py index 1dba60a552..36dc12a6fb 100644 --- a/samtranslator/model/route53.py +++ b/samtranslator/model/route53.py @@ -1,7 +1,7 @@ from typing import Any, List, Optional from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import is_type, IS_STR +from samtranslator.model.types import IS_STR, is_type from samtranslator.utils.types import Intrinsicable diff --git a/samtranslator/model/s3.py b/samtranslator/model/s3.py index bdbd9feb9e..147f4dcda8 100644 --- a/samtranslator/model/s3.py +++ b/samtranslator/model/s3.py @@ -1,6 +1,6 @@ from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import IS_DICT, is_type, IS_STR, any_type -from samtranslator.model.intrinsics import ref, fnGetAtt +from samtranslator.model.intrinsics import fnGetAtt, ref +from samtranslator.model.types import IS_DICT, IS_STR, any_type, is_type class S3Bucket(Resource): diff --git a/samtranslator/model/s3_utils/uri_parser.py b/samtranslator/model/s3_utils/uri_parser.py index c8e0f1c4ae..63ce19f268 100644 --- a/samtranslator/model/s3_utils/uri_parser.py +++ b/samtranslator/model/s3_utils/uri_parser.py @@ -1,5 +1,6 @@ from typing import Any, Dict, Optional, Union -from urllib.parse import urlparse, parse_qs +from urllib.parse import parse_qs, urlparse + from samtranslator.model.exceptions import InvalidResourceException diff --git a/samtranslator/model/sam_resources.py b/samtranslator/model/sam_resources.py index 35ef0edd1c..ad2fdc792b 100644 --- a/samtranslator/model/sam_resources.py +++ b/samtranslator/model/sam_resources.py @@ -1,87 +1,90 @@ """ SAM macro definitions """ import copy -from typing import Any, cast, Dict, List, Optional, Tuple, Union, Callable -from samtranslator.intrinsics.resolver import IntrinsicsResolver -from samtranslator.feature_toggle.feature_toggle import FeatureToggle -from samtranslator.model.connector.connector import ( - ConnectorResourceReference, - ConnectorResourceError, - add_depends_on, - replace_depends_on_logical_id, - get_event_source_mappings, - get_resource_reference, -) -from samtranslator.model.connector_profiles.profile import ( - ConnectorProfile, - profile_replace, - get_profile, - verify_profile_variables_replaced, -) +from typing import Any, Callable, Dict, List, Optional, Tuple, Union, cast import samtranslator.model.eventsources +import samtranslator.model.eventsources.cloudwatchlogs import samtranslator.model.eventsources.pull import samtranslator.model.eventsources.push -import samtranslator.model.eventsources.cloudwatchlogs import samtranslator.model.eventsources.scheduler -from .api.api_generator import ApiGenerator -from .api.http_api_generator import HttpApiGenerator -from .packagetype import ZIP, IMAGE -from .s3_utils.uri_parser import construct_s3_location_object, construct_image_code_object -from .tags.resource_tagging import get_tag_list +from samtranslator.feature_toggle.feature_toggle import FeatureToggle +from samtranslator.intrinsics.resolver import IntrinsicsResolver from samtranslator.metrics.method_decorator import cw_timer from samtranslator.model import ( - ResourceResolver, PassThroughProperty, PropertyType, - SamResourceMacro, Resource, + ResourceResolver, ResourceTypeResolver, + SamResourceMacro, ) from samtranslator.model.apigateway import ( + ApiGatewayApiKey, ApiGatewayDeployment, - ApiGatewayStage, ApiGatewayDomainName, + ApiGatewayStage, ApiGatewayUsagePlan, ApiGatewayUsagePlanKey, - ApiGatewayApiKey, ) -from samtranslator.model.apigatewayv2 import ApiGatewayV2Stage, ApiGatewayV2DomainName +from samtranslator.model.apigatewayv2 import ApiGatewayV2DomainName, ApiGatewayV2Stage from samtranslator.model.architecture import ARM64, X86_64 from samtranslator.model.cloudformation import NestedStack +from samtranslator.model.connector.connector import ( + ConnectorResourceError, + ConnectorResourceReference, + add_depends_on, + get_event_source_mappings, + get_resource_reference, + replace_depends_on_logical_id, +) +from samtranslator.model.connector_profiles.profile import ( + ConnectorProfile, + get_profile, + profile_replace, + verify_profile_variables_replaced, +) from samtranslator.model.dynamodb import DynamoDBTable from samtranslator.model.exceptions import InvalidEventException, InvalidResourceException -from samtranslator.model.preferences.deployment_preference_collection import DeploymentPreferenceCollection -from samtranslator.model.resource_policies import ResourcePolicies -from samtranslator.model.iam import IAMManagedPolicy, IAMRolePolicies, IAMRole -from samtranslator.model.lambda_ import ( - LambdaFunction, - LambdaVersion, - LambdaAlias, - LambdaLayerVersion, - LambdaEventInvokeConfig, - LambdaUrl, - LambdaPermission, -) -from samtranslator.model.types import dict_of, IS_STR, is_type, IS_DICT, list_of, one_of, any_type, PassThrough -from samtranslator.translator import logical_id_generator -from samtranslator.translator.arn_generator import ArnGenerator +from samtranslator.model.iam import IAMManagedPolicy, IAMRole, IAMRolePolicies from samtranslator.model.intrinsics import ( is_intrinsic, is_intrinsic_if, is_intrinsic_no_value, - ref, - make_not_conditional, - make_conditional, make_and_condition, + make_conditional, + make_not_conditional, + ref, ) -from samtranslator.model.sqs import SQSQueue, SQSQueuePolicy +from samtranslator.model.lambda_ import ( + LambdaAlias, + LambdaEventInvokeConfig, + LambdaFunction, + LambdaLayerVersion, + LambdaPermission, + LambdaUrl, + LambdaVersion, +) +from samtranslator.model.preferences.deployment_preference_collection import DeploymentPreferenceCollection +from samtranslator.model.resource_policies import ResourcePolicies +from samtranslator.model.role_utils import construct_role_for_resource from samtranslator.model.sns import SNSTopic, SNSTopicPolicy +from samtranslator.model.sqs import SQSQueue, SQSQueuePolicy from samtranslator.model.stepfunctions import StateMachineGenerator -from samtranslator.model.role_utils import construct_role_for_resource +from samtranslator.model.types import IS_DICT, IS_STR, PassThrough, any_type, dict_of, is_type, list_of, one_of from samtranslator.model.xray_utils import get_xray_managed_policy_name +from samtranslator.translator import logical_id_generator +from samtranslator.translator.arn_generator import ArnGenerator from samtranslator.utils.types import Intrinsicable from samtranslator.validator.value_validator import sam_expect +from .api.api_generator import ApiGenerator +from .api.http_api_generator import HttpApiGenerator +from .packagetype import IMAGE, ZIP +from .s3_utils.uri_parser import construct_image_code_object, construct_s3_location_object +from .tags.resource_tagging import get_tag_list + +_CONDITION_CHAR_LIMIT = 255 + class SamFunction(SamResourceMacro): """SAM function macro.""" @@ -453,11 +456,11 @@ def _get_or_make_condition(self, destination: Any, logical_id: str, conditions: return None, None def _make_gen_condition_name(self, name: str, hash_input: str) -> str: - # Make sure the property name is not over 255 characters (CFN limit) + # Make sure the property name is not over CFN limit (currently 255) hash_digest = logical_id_generator.LogicalIdGenerator("", hash_input).gen() condition_name: str = name + hash_digest - if len(condition_name) > 255: - return input(condition_name)[:255] + if len(condition_name) > _CONDITION_CHAR_LIMIT: + return input(condition_name)[:_CONDITION_CHAR_LIMIT] return condition_name def _get_resolved_alias_name( diff --git a/samtranslator/model/scheduler.py b/samtranslator/model/scheduler.py index 5126f9bc08..19d30d5f39 100644 --- a/samtranslator/model/scheduler.py +++ b/samtranslator/model/scheduler.py @@ -1,8 +1,8 @@ from typing import Any, Dict, Optional from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import IS_DICT, IS_STR from samtranslator.model.intrinsics import fnGetAtt +from samtranslator.model.types import IS_DICT, IS_STR class SchedulerSchedule(Resource): diff --git a/samtranslator/model/sns.py b/samtranslator/model/sns.py index 7e55c7a1ee..2d3b6f3ea1 100644 --- a/samtranslator/model/sns.py +++ b/samtranslator/model/sns.py @@ -1,6 +1,6 @@ from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import IS_DICT, IS_STR, list_of from samtranslator.model.intrinsics import ref +from samtranslator.model.types import IS_DICT, IS_STR, list_of class SNSSubscription(Resource): diff --git a/samtranslator/model/sqs.py b/samtranslator/model/sqs.py index 9fcab63890..be7f758657 100644 --- a/samtranslator/model/sqs.py +++ b/samtranslator/model/sqs.py @@ -1,8 +1,8 @@ from typing import Dict from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import IS_DICT, list_of from samtranslator.model.intrinsics import fnGetAtt, ref +from samtranslator.model.types import IS_DICT, list_of class SQSQueue(Resource): diff --git a/samtranslator/model/stepfunctions/__init__.py b/samtranslator/model/stepfunctions/__init__.py index 35c5ed4dc7..351faa72a2 100644 --- a/samtranslator/model/stepfunctions/__init__.py +++ b/samtranslator/model/stepfunctions/__init__.py @@ -1,5 +1,5 @@ __all__ = ["StepFunctionsStateMachine", "StateMachineGenerator", "events"] -from .resources import StepFunctionsStateMachine -from .generators import StateMachineGenerator from . import events +from .generators import StateMachineGenerator +from .resources import StepFunctionsStateMachine diff --git a/samtranslator/model/stepfunctions/events.py b/samtranslator/model/stepfunctions/events.py index c453a93741..582d085388 100644 --- a/samtranslator/model/stepfunctions/events.py +++ b/samtranslator/model/stepfunctions/events.py @@ -3,16 +3,16 @@ from typing import Any, Dict, Optional, cast from samtranslator.metrics.method_decorator import cw_timer -from samtranslator.model import Property, PropertyType, ResourceMacro, Resource +from samtranslator.model import Property, PropertyType, Resource, ResourceMacro +from samtranslator.model.eventbridge_utils import EventBridgeRuleUtils from samtranslator.model.events import EventsRule +from samtranslator.model.eventsources.push import Api as PushApi +from samtranslator.model.exceptions import InvalidEventException from samtranslator.model.iam import IAMRole, IAMRolePolicies -from samtranslator.model.types import IS_DICT, IS_STR, is_type, PassThrough from samtranslator.model.intrinsics import fnSub -from samtranslator.translator import logical_id_generator -from samtranslator.model.exceptions import InvalidEventException -from samtranslator.model.eventbridge_utils import EventBridgeRuleUtils -from samtranslator.model.eventsources.push import Api as PushApi +from samtranslator.model.types import IS_DICT, IS_STR, PassThrough, is_type from samtranslator.swagger.swagger import SwaggerEditor +from samtranslator.translator import logical_id_generator CONDITION = "Condition" SFN_EVETSOURCE_METRIC_PREFIX = "SFNEventSource" diff --git a/samtranslator/model/stepfunctions/generators.py b/samtranslator/model/stepfunctions/generators.py index 1ebff3c41a..dcba19da10 100644 --- a/samtranslator/model/stepfunctions/generators.py +++ b/samtranslator/model/stepfunctions/generators.py @@ -5,14 +5,12 @@ from samtranslator.metrics.method_decorator import cw_timer from samtranslator.model.exceptions import InvalidEventException, InvalidResourceException from samtranslator.model.iam import IAMRole, IAMRolePolicies +from samtranslator.model.intrinsics import fnJoin, is_intrinsic from samtranslator.model.resource_policies import ResourcePolicies from samtranslator.model.role_utils import construct_role_for_resource from samtranslator.model.s3_utils.uri_parser import parse_s3_uri -from samtranslator.model.stepfunctions import StepFunctionsStateMachine -from samtranslator.model.intrinsics import fnJoin +from samtranslator.model.stepfunctions.resources import StepFunctionsStateMachine from samtranslator.model.tags.resource_tagging import get_tag_list - -from samtranslator.model.intrinsics import is_intrinsic from samtranslator.model.xray_utils import get_xray_managed_policy_name from samtranslator.utils.cfn_dynamic_references import is_dynamic_reference diff --git a/samtranslator/model/stepfunctions/resources.py b/samtranslator/model/stepfunctions/resources.py index b35ef7ceef..c0e6a6ea94 100644 --- a/samtranslator/model/stepfunctions/resources.py +++ b/samtranslator/model/stepfunctions/resources.py @@ -1,8 +1,8 @@ from typing import Any, Dict, List, Optional from samtranslator.model import PropertyType, Resource -from samtranslator.model.types import IS_DICT, list_of, IS_STR from samtranslator.model.intrinsics import fnGetAtt, ref +from samtranslator.model.types import IS_DICT, IS_STR, list_of class StepFunctionsStateMachine(Resource): diff --git a/samtranslator/open_api/open_api.py b/samtranslator/open_api/open_api.py index 1210d6f39f..c8e032167d 100644 --- a/samtranslator/open_api/open_api.py +++ b/samtranslator/open_api/open_api.py @@ -1,17 +1,16 @@ import copy +import json import re -from typing import Callable, Any, Dict, Optional, TypeVar +from typing import Any, Callable, Dict, Optional, TypeVar from samtranslator.metrics.method_decorator import cw_timer from samtranslator.model.apigatewayv2 import ApiGatewayV2Authorizer -from samtranslator.model.intrinsics import ref, make_conditional, is_intrinsic from samtranslator.model.exceptions import InvalidDocumentException, InvalidTemplateException +from samtranslator.model.intrinsics import is_intrinsic, make_conditional, ref from samtranslator.open_api.base_editor import BaseEditor from samtranslator.utils.py27hash_fix import Py27Dict, Py27UniStr from samtranslator.utils.types import Intrinsicable -from samtranslator.utils.utils import dict_deep_get, InvalidValueType -import json - +from samtranslator.utils.utils import InvalidValueType, dict_deep_get T = TypeVar("T") diff --git a/samtranslator/parser/parser.py b/samtranslator/parser/parser.py index 43fcadeb6d..f1562f7bf5 100644 --- a/samtranslator/parser/parser.py +++ b/samtranslator/parser/parser.py @@ -2,12 +2,12 @@ from samtranslator.model.exceptions import ( InvalidDocumentException, - InvalidTemplateException, InvalidResourceAttributeTypeException, + InvalidTemplateException, ) -from samtranslator.validator.validator import SamTemplateValidator from samtranslator.plugins import LifeCycleEvents from samtranslator.public.sdk.template import SamTemplate +from samtranslator.validator.validator import SamTemplateValidator from samtranslator.validator.value_validator import sam_expect LOG = logging.getLogger(__name__) diff --git a/samtranslator/plugins/__init__.py b/samtranslator/plugins/__init__.py index 096caa4790..b1eb8d07f6 100644 --- a/samtranslator/plugins/__init__.py +++ b/samtranslator/plugins/__init__.py @@ -1,6 +1,5 @@ import logging from abc import ABC - from enum import Enum from typing import Optional diff --git a/samtranslator/plugins/api/default_definition_body_plugin.py b/samtranslator/plugins/api/default_definition_body_plugin.py index 47be9eeb2b..f053db76b0 100644 --- a/samtranslator/plugins/api/default_definition_body_plugin.py +++ b/samtranslator/plugins/api/default_definition_body_plugin.py @@ -1,9 +1,9 @@ from samtranslator.metrics.method_decorator import cw_timer -from samtranslator.plugins import BasePlugin -from samtranslator.swagger.swagger import SwaggerEditor from samtranslator.open_api.open_api import OpenApiEditor +from samtranslator.plugins import BasePlugin from samtranslator.public.sdk.resource import SamResourceType from samtranslator.public.sdk.template import SamTemplate +from samtranslator.swagger.swagger import SwaggerEditor class DefaultDefinitionBodyPlugin(BasePlugin): diff --git a/samtranslator/plugins/api/implicit_api_plugin.py b/samtranslator/plugins/api/implicit_api_plugin.py index fb8b1fa3dd..fd42599b7c 100644 --- a/samtranslator/plugins/api/implicit_api_plugin.py +++ b/samtranslator/plugins/api/implicit_api_plugin.py @@ -1,21 +1,19 @@ import copy - from abc import ABCMeta, abstractmethod from typing import Any, Dict, Generic, Optional, Tuple, Type, TypeVar, Union from samtranslator.metrics.method_decorator import cw_timer -from samtranslator.model.intrinsics import make_combined_condition from samtranslator.model.eventsources.push import Api +from samtranslator.model.intrinsics import MIN_NUM_CONDITIONS_TO_COMBINE, make_combined_condition from samtranslator.open_api.open_api import OpenApiEditor +from samtranslator.public.exceptions import InvalidDocumentException, InvalidEventException, InvalidResourceException from samtranslator.public.plugins import BasePlugin -from samtranslator.public.exceptions import InvalidDocumentException, InvalidResourceException, InvalidEventException from samtranslator.public.sdk.resource import SamResource, SamResourceType from samtranslator.public.sdk.template import SamTemplate from samtranslator.swagger.swagger import SwaggerEditor from samtranslator.utils.py27hash_fix import Py27Dict from samtranslator.validator.value_validator import sam_expect - T = TypeVar("T", bound=Union[Type[OpenApiEditor], Type[SwaggerEditor]]) @@ -371,7 +369,7 @@ def _add_combined_condition_to_template(self, template_dict, condition_name, con top-level condition. """ # defensive precondition check - if not conditions_to_combine or len(conditions_to_combine) < 2: + if not conditions_to_combine or len(conditions_to_combine) < MIN_NUM_CONDITIONS_TO_COMBINE: raise ValueError("conditions_to_combine must have at least 2 conditions") template_conditions = template_dict.setdefault("Conditions", {}) diff --git a/samtranslator/plugins/api/implicit_http_api_plugin.py b/samtranslator/plugins/api/implicit_http_api_plugin.py index 095997b66e..1eeddb5ac9 100644 --- a/samtranslator/plugins/api/implicit_http_api_plugin.py +++ b/samtranslator/plugins/api/implicit_http_api_plugin.py @@ -3,7 +3,7 @@ from samtranslator.model.intrinsics import make_conditional from samtranslator.plugins.api.implicit_api_plugin import ImplicitApiPlugin from samtranslator.public.open_api import OpenApiEditor -from samtranslator.public.sdk.resource import SamResourceType, SamResource +from samtranslator.public.sdk.resource import SamResource, SamResourceType from samtranslator.sdk.template import SamTemplate from samtranslator.validator.value_validator import sam_expect diff --git a/samtranslator/plugins/api/implicit_rest_api_plugin.py b/samtranslator/plugins/api/implicit_rest_api_plugin.py index e8962b0273..f640b194a8 100644 --- a/samtranslator/plugins/api/implicit_rest_api_plugin.py +++ b/samtranslator/plugins/api/implicit_rest_api_plugin.py @@ -1,8 +1,8 @@ from typing import Any, Dict, Optional, Type from samtranslator.plugins.api.implicit_api_plugin import ImplicitApiPlugin +from samtranslator.public.sdk.resource import SamResource, SamResourceType from samtranslator.public.swagger import SwaggerEditor -from samtranslator.public.sdk.resource import SamResourceType, SamResource from samtranslator.sdk.template import SamTemplate from samtranslator.validator.value_validator import sam_expect diff --git a/samtranslator/plugins/application/serverless_app_plugin.py b/samtranslator/plugins/application/serverless_app_plugin.py index 4a6fb07fbc..63ac13ed94 100644 --- a/samtranslator/plugins/application/serverless_app_plugin.py +++ b/samtranslator/plugins/application/serverless_app_plugin.py @@ -1,21 +1,21 @@ +import copy +import json +import logging +from time import sleep from typing import Any, Dict, Tuple import boto3 -import json from botocore.config import Config from botocore.exceptions import ClientError, EndpointConnectionError -import logging -from time import sleep -import copy +from samtranslator.intrinsics.actions import FindInMapAction +from samtranslator.intrinsics.resolver import IntrinsicsResolver from samtranslator.metrics.method_decorator import cw_timer from samtranslator.model.exceptions import InvalidResourceException from samtranslator.plugins import BasePlugin from samtranslator.plugins.exceptions import InvalidPluginException from samtranslator.public.sdk.resource import SamResourceType from samtranslator.public.sdk.template import SamTemplate -from samtranslator.intrinsics.resolver import IntrinsicsResolver -from samtranslator.intrinsics.actions import FindInMapAction from samtranslator.region_configuration import RegionConfiguration from samtranslator.utils.constants import BOTO3_CONNECT_TIMEOUT from samtranslator.validator.value_validator import sam_expect diff --git a/samtranslator/plugins/globals/globals.py b/samtranslator/plugins/globals/globals.py index 4b96caf989..65ad3d9956 100644 --- a/samtranslator/plugins/globals/globals.py +++ b/samtranslator/plugins/globals/globals.py @@ -1,8 +1,8 @@ -from typing import Any, Dict, List +from typing import Any, Dict, List from samtranslator.model.exceptions import ExceptionWithMessage -from samtranslator.public.sdk.resource import SamResourceType from samtranslator.public.intrinsics import is_intrinsics +from samtranslator.public.sdk.resource import SamResourceType from samtranslator.swagger.swagger import SwaggerEditor diff --git a/samtranslator/plugins/globals/globals_plugin.py b/samtranslator/plugins/globals/globals_plugin.py index 8c86c866b7..160a89e8da 100644 --- a/samtranslator/plugins/globals/globals_plugin.py +++ b/samtranslator/plugins/globals/globals_plugin.py @@ -1,9 +1,8 @@ from samtranslator.metrics.method_decorator import cw_timer -from samtranslator.public.sdk.template import SamTemplate -from samtranslator.public.plugins import BasePlugin -from samtranslator.public.exceptions import InvalidDocumentException - from samtranslator.plugins.globals.globals import Globals, InvalidGlobalsSectionException +from samtranslator.public.exceptions import InvalidDocumentException +from samtranslator.public.plugins import BasePlugin +from samtranslator.public.sdk.template import SamTemplate _API_RESOURCE = "AWS::Serverless::Api" diff --git a/samtranslator/plugins/policies/policy_templates_plugin.py b/samtranslator/plugins/policies/policy_templates_plugin.py index 0e96fe67cb..88e8d245d7 100644 --- a/samtranslator/plugins/policies/policy_templates_plugin.py +++ b/samtranslator/plugins/policies/policy_templates_plugin.py @@ -1,9 +1,9 @@ from samtranslator.metrics.method_decorator import cw_timer -from samtranslator.plugins import BasePlugin -from samtranslator.model.resource_policies import ResourcePolicies, PolicyTypes from samtranslator.model.exceptions import InvalidResourceException -from samtranslator.policy_template_processor.exceptions import InsufficientParameterValues, InvalidParameterValues from samtranslator.model.intrinsics import is_intrinsic_if, is_intrinsic_no_value +from samtranslator.model.resource_policies import PolicyTypes, ResourcePolicies +from samtranslator.plugins import BasePlugin +from samtranslator.policy_template_processor.exceptions import InsufficientParameterValues, InvalidParameterValues class PolicyTemplatesForResourcePlugin(BasePlugin): diff --git a/samtranslator/plugins/sam_plugins.py b/samtranslator/plugins/sam_plugins.py index 18226daf86..9740bcd3b0 100644 --- a/samtranslator/plugins/sam_plugins.py +++ b/samtranslator/plugins/sam_plugins.py @@ -1,6 +1,7 @@ import logging -from typing import Optional, Any, List, Union -from samtranslator.model.exceptions import InvalidResourceException, InvalidDocumentException, InvalidTemplateException +from typing import Any, List, Optional, Union + +from samtranslator.model.exceptions import InvalidDocumentException, InvalidResourceException, InvalidTemplateException from samtranslator.plugins import BasePlugin, LifeCycleEvents LOG = logging.getLogger(__name__) diff --git a/samtranslator/policy_template_processor/processor.py b/samtranslator/policy_template_processor/processor.py index b8bef2f5a8..05cd659fc3 100644 --- a/samtranslator/policy_template_processor/processor.py +++ b/samtranslator/policy_template_processor/processor.py @@ -1,10 +1,12 @@ import json +from typing import Any, Dict, Optional + import jsonschema -from samtranslator import policy_templates_data -from typing import Dict, Any, Optional from jsonschema.exceptions import ValidationError -from samtranslator.policy_template_processor.template import Template + +from samtranslator import policy_templates_data from samtranslator.policy_template_processor.exceptions import TemplateNotFoundException +from samtranslator.policy_template_processor.template import Template class PolicyTemplatesProcessor: diff --git a/samtranslator/policy_template_processor/template.py b/samtranslator/policy_template_processor/template.py index a035c33917..7c4c78075c 100644 --- a/samtranslator/policy_template_processor/template.py +++ b/samtranslator/policy_template_processor/template.py @@ -1,10 +1,9 @@ from typing import Any -from samtranslator.intrinsics.resolver import IntrinsicsResolver from samtranslator.intrinsics.actions import RefAction +from samtranslator.intrinsics.resolver import IntrinsicsResolver from samtranslator.policy_template_processor.exceptions import InsufficientParameterValues, InvalidParameterValues - POLICY_PARAMETER_DISAMBIGUATE_PREFIX = "___SAM_POLICY_PARAMETER_" diff --git a/samtranslator/public/exceptions.py b/samtranslator/public/exceptions.py index 3d03b3f021..54a870b1d2 100644 --- a/samtranslator/public/exceptions.py +++ b/samtranslator/public/exceptions.py @@ -1,3 +1,3 @@ __all__ = ["InvalidResourceException", "InvalidDocumentException", "InvalidEventException"] -from samtranslator.model.exceptions import InvalidResourceException, InvalidDocumentException, InvalidEventException +from samtranslator.model.exceptions import InvalidDocumentException, InvalidEventException, InvalidResourceException diff --git a/samtranslator/public/intrinsics.py b/samtranslator/public/intrinsics.py index 4904300883..27baa7721c 100644 --- a/samtranslator/public/intrinsics.py +++ b/samtranslator/public/intrinsics.py @@ -1,5 +1,4 @@ __all__ = ["IntrinsicsResolver", "is_intrinsics"] from samtranslator.intrinsics.resolver import IntrinsicsResolver - from samtranslator.model.intrinsics import is_intrinsic as is_intrinsics diff --git a/samtranslator/public/translator.py b/samtranslator/public/translator.py index 4b90576f59..1e98511982 100644 --- a/samtranslator/public/translator.py +++ b/samtranslator/public/translator.py @@ -4,5 +4,5 @@ __all__ = ["Translator", "ManagedPolicyLoader"] -from samtranslator.translator.translator import Translator from samtranslator.translator.managed_policy_translator import ManagedPolicyLoader +from samtranslator.translator.translator import Translator diff --git a/samtranslator/sdk/parameter.py b/samtranslator/sdk/parameter.py index 8b1bd815a1..2458bcfcff 100644 --- a/samtranslator/sdk/parameter.py +++ b/samtranslator/sdk/parameter.py @@ -1,6 +1,7 @@ -import boto3 -from typing import Dict, Any import copy +from typing import Any, Dict + +import boto3 from samtranslator.translator.arn_generator import ArnGenerator, NoRegionFound diff --git a/samtranslator/swagger/swagger.py b/samtranslator/swagger/swagger.py index 21542f864d..4dbc3710c3 100644 --- a/samtranslator/swagger/swagger.py +++ b/samtranslator/swagger/swagger.py @@ -1,11 +1,11 @@ -import copy +import copy import re -from typing import Callable, Dict, Any, Optional, TypeVar +from typing import Any, Callable, Dict, Optional, TypeVar from samtranslator.metrics.method_decorator import cw_timer from samtranslator.model.apigateway import ApiGatewayAuthorizer -from samtranslator.model.intrinsics import ref, make_conditional, fnSub from samtranslator.model.exceptions import InvalidDocumentException, InvalidTemplateException +from samtranslator.model.intrinsics import fnSub, make_conditional, ref from samtranslator.model.types import PassThrough from samtranslator.open_api.base_editor import BaseEditor from samtranslator.translator.arn_generator import ArnGenerator diff --git a/samtranslator/third_party/py27hash/hash.py b/samtranslator/third_party/py27hash/hash.py index a40d29ed72..5cf63836c1 100644 --- a/samtranslator/third_party/py27hash/hash.py +++ b/samtranslator/third_party/py27hash/hash.py @@ -29,6 +29,8 @@ class Hash: Various hashing methods using Python 2.7's algorithms """ + _FLOAT_ZERO = 0.0 + @staticmethod @lru_cache(maxsize=2048) def hash(value): # type: ignore[no-untyped-def] @@ -104,7 +106,7 @@ def fhash(value): # type: ignore[no-untyped-def] """ fpart = math.modf(value) - if fpart[0] == 0.0: + if fpart[0] == Hash._FLOAT_ZERO: return hash(int(fpart[1])) v, e = math.frexp(value) diff --git a/samtranslator/translator/arn_generator.py b/samtranslator/translator/arn_generator.py index 509aae9a6b..2336af2cdd 100644 --- a/samtranslator/translator/arn_generator.py +++ b/samtranslator/translator/arn_generator.py @@ -1,9 +1,8 @@ from functools import lru_cache +from typing import Optional import boto3 -from typing import Optional - class NoRegionFound(Exception): pass diff --git a/samtranslator/translator/transform.py b/samtranslator/translator/transform.py index d522db0e6f..e05ba52285 100644 --- a/samtranslator/translator/transform.py +++ b/samtranslator/translator/transform.py @@ -1,5 +1,5 @@ -from samtranslator.translator.translator import Translator from samtranslator.parser.parser import Parser +from samtranslator.translator.translator import Translator from samtranslator.utils.py27hash_fix import to_py27_compatible_template, undo_mark_unicode_str_in_template diff --git a/samtranslator/translator/translator.py b/samtranslator/translator/translator.py index 58137f1572..aed0096942 100644 --- a/samtranslator/translator/translator.py +++ b/samtranslator/translator/translator.py @@ -1,40 +1,38 @@ import copy -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple -from samtranslator.metrics.method_decorator import MetricsMethodWrapperSingleton -from samtranslator.metrics.metrics import DummyMetricsPublisher, Metrics -from typing import Dict, Any, Optional, List, Tuple from samtranslator.feature_toggle.feature_toggle import ( FeatureToggle, FeatureToggleDefaultConfigProvider, ) -from samtranslator.model import ResourceResolver, ResourceTypeResolver, sam_resources +from samtranslator.intrinsics.actions import FindInMapAction +from samtranslator.intrinsics.resolver import IntrinsicsResolver +from samtranslator.intrinsics.resource_refs import SupportedResourceReferences +from samtranslator.metrics.method_decorator import MetricsMethodWrapperSingleton +from samtranslator.metrics.metrics import DummyMetricsPublisher, Metrics +from samtranslator.model import Resource, ResourceResolver, ResourceTypeResolver, sam_resources from samtranslator.model.api.api_generator import SharedApiUsagePlan -from samtranslator.translator.verify_logical_id import verify_unique_logical_id -from samtranslator.model.preferences.deployment_preference_collection import DeploymentPreferenceCollection +from samtranslator.model.eventsources.push import Api from samtranslator.model.exceptions import ( - InvalidDocumentException, - InvalidResourceException, DuplicateLogicalIdException, + InvalidDocumentException, InvalidEventException, + InvalidResourceException, InvalidTemplateException, ) -from samtranslator.intrinsics.resolver import IntrinsicsResolver -from samtranslator.intrinsics.actions import FindInMapAction -from samtranslator.intrinsics.resource_refs import SupportedResourceReferences +from samtranslator.model.preferences.deployment_preference_collection import DeploymentPreferenceCollection +from samtranslator.model.sam_resources import SamConnector +from samtranslator.plugins import LifeCycleEvents from samtranslator.plugins.api.default_definition_body_plugin import DefaultDefinitionBodyPlugin from samtranslator.plugins.application.serverless_app_plugin import ServerlessAppPlugin -from samtranslator.plugins import LifeCycleEvents -from samtranslator.plugins.sam_plugins import SamPlugins from samtranslator.plugins.globals.globals_plugin import GlobalsPlugin from samtranslator.plugins.policies.policy_templates_plugin import PolicyTemplatesForResourcePlugin +from samtranslator.plugins.sam_plugins import SamPlugins from samtranslator.policy_template_processor.processor import PolicyTemplatesProcessor from samtranslator.sdk.parameter import SamParameterValues from samtranslator.translator.arn_generator import ArnGenerator -from samtranslator.model.eventsources.push import Api -from samtranslator.model.sam_resources import SamConnector +from samtranslator.translator.verify_logical_id import verify_unique_logical_id from samtranslator.validator.value_validator import sam_expect -from samtranslator.model import Resource class Translator: @@ -410,8 +408,8 @@ def prepare_plugins(plugins: List[Any], parameters: Optional[Dict[str, Any]] = N if TYPE_CHECKING: - from samtranslator.plugins.api.implicit_rest_api_plugin import ImplicitRestApiPlugin from samtranslator.plugins.api.implicit_http_api_plugin import ImplicitHttpApiPlugin + from samtranslator.plugins.api.implicit_rest_api_plugin import ImplicitRestApiPlugin def make_implicit_rest_api_plugin() -> "ImplicitRestApiPlugin": diff --git a/samtranslator/translator/verify_logical_id.py b/samtranslator/translator/verify_logical_id.py index fb4c488a0f..bfd966888e 100644 --- a/samtranslator/translator/verify_logical_id.py +++ b/samtranslator/translator/verify_logical_id.py @@ -1,5 +1,6 @@ +from typing import Any, Dict + from samtranslator.model import Resource -from typing import Dict, Any do_not_verify = { # type_after_transform: type_before_transform diff --git a/samtranslator/utils/py27hash_fix.py b/samtranslator/utils/py27hash_fix.py index fc9d578b8b..28217083cb 100644 --- a/samtranslator/utils/py27hash_fix.py +++ b/samtranslator/utils/py27hash_fix.py @@ -1,17 +1,15 @@ """ """ -import ctypes import copy +import ctypes import json import logging - from typing import Any, Dict, Iterator, List, cast from samtranslator.parser.parser import Parser from samtranslator.third_party.py27hash.hash import Hash - LOG = logging.getLogger(__name__) # Constants based on Python2.7 dictionary # See: https://github.com/python/cpython/blob/v2.7.18/Objects/dictobject.c @@ -165,6 +163,7 @@ class Py27Keys: # marker for deleted keys # we use DUMMY for a dummy key, force it to be treated as a str to avoid mypy unhappy DUMMY: str = cast(str, ["dummy"]) + _LARGE_DICT_SIZE_THRESHOLD = 50000 def __init__(self) -> None: super().__init__() @@ -264,7 +263,7 @@ def add(self, key): # type: ignore[no-untyped-def] # Resize if 2/3 capacity if self.size > start_size and self.fill * 3 >= ((self.mask + 1) * 2): # Python2 dict increases size by a factor of 4 for small dict, and 2 for large dict - self._resize(self.size * (2 if self.size > 50000 else 4)) # type: ignore[no-untyped-call] + self._resize(self.size * (2 if self.size > self._LARGE_DICT_SIZE_THRESHOLD else 4)) # type: ignore[no-untyped-call] def keys(self) -> List[str]: """Return keys in Python2 order""" diff --git a/samtranslator/utils/utils.py b/samtranslator/utils/utils.py index 613a294569..c38417f6a0 100644 --- a/samtranslator/utils/utils.py +++ b/samtranslator/utils/utils.py @@ -1,5 +1,5 @@ import copy -from typing import Optional, cast, Any, List +from typing import Any, List, Optional, cast def as_array(x: Any) -> List[Any]: diff --git a/samtranslator/validator/value_validator.py b/samtranslator/validator/value_validator.py index c6bcd584de..67446639f8 100644 --- a/samtranslator/validator/value_validator.py +++ b/samtranslator/validator/value_validator.py @@ -4,9 +4,9 @@ from samtranslator.model.exceptions import ( ExpectedType, InvalidEventException, + InvalidResourceAttributeTypeException, InvalidResourceException, InvalidResourcePropertyTypeException, - InvalidResourceAttributeTypeException, ) T = TypeVar("T") diff --git a/schema_source/aws_serverless_api.py b/schema_source/aws_serverless_api.py index cd2194bceb..f1de765157 100644 --- a/schema_source/aws_serverless_api.py +++ b/schema_source/aws_serverless_api.py @@ -1,18 +1,18 @@ from __future__ import annotations -from typing import Optional, Dict, Union, List +from typing import Dict, List, Optional, Union from typing_extensions import Literal +from schema_source.aws_serverless_connector import EmbeddedConnector from schema_source.common import ( - PassThroughProp, BaseModel, - SamIntrinsicable, - get_prop, DictStrAny, + PassThroughProp, ResourceAttributes, + SamIntrinsicable, + get_prop, ) -from schema_source.aws_serverless_connector import EmbeddedConnector resourcepolicy = get_prop("sam-property-api-resourcepolicystatement") cognitoauthorizeridentity = get_prop("sam-property-api-cognitoauthorizationidentity") diff --git a/schema_source/aws_serverless_application.py b/schema_source/aws_serverless_application.py index 61be98dcbf..0249164d58 100644 --- a/schema_source/aws_serverless_application.py +++ b/schema_source/aws_serverless_application.py @@ -1,10 +1,10 @@ from __future__ import annotations -from typing import Optional, Any, Dict, Union +from typing import Any, Dict, Optional, Union from typing_extensions import Literal -from schema_source.common import PassThroughProp, BaseModel, SamIntrinsicable, get_prop, ResourceAttributes +from schema_source.common import BaseModel, PassThroughProp, ResourceAttributes, SamIntrinsicable, get_prop location = get_prop("sam-property-application-applicationlocationobject") properties = get_prop("sam-resource-application") diff --git a/schema_source/aws_serverless_connector.py b/schema_source/aws_serverless_connector.py index 354012e788..44043f64e9 100644 --- a/schema_source/aws_serverless_connector.py +++ b/schema_source/aws_serverless_connector.py @@ -1,8 +1,8 @@ -from typing import Optional, List, Union +from typing import List, Optional, Union from typing_extensions import Literal -from schema_source.common import PassThroughProp, BaseModel, get_prop, ResourceAttributes +from schema_source.common import BaseModel, PassThroughProp, ResourceAttributes, get_prop resourcereference = get_prop("sam-property-connector-resourcereference") properties = get_prop("sam-resource-connector") diff --git a/schema_source/aws_serverless_function.py b/schema_source/aws_serverless_function.py index 501e82e79f..7fa4392d95 100644 --- a/schema_source/aws_serverless_function.py +++ b/schema_source/aws_serverless_function.py @@ -1,20 +1,19 @@ from __future__ import annotations -from typing import Optional, Dict, Union, List +from typing import Dict, List, Optional, Union from typing_extensions import Literal +from schema_source.aws_serverless_connector import EmbeddedConnector from schema_source.common import ( - PassThroughProp, BaseModel, - SamIntrinsicable, - get_prop, DictStrAny, + PassThroughProp, Ref, ResourceAttributes, + SamIntrinsicable, + get_prop, ) -from schema_source.aws_serverless_connector import EmbeddedConnector - alexaskilleventproperties = get_prop("sam-property-function-alexaskill") apiauth = get_prop("sam-property-function-apifunctionauth") diff --git a/schema_source/aws_serverless_httpapi.py b/schema_source/aws_serverless_httpapi.py index f17ecf8b58..3384abc5ab 100644 --- a/schema_source/aws_serverless_httpapi.py +++ b/schema_source/aws_serverless_httpapi.py @@ -1,18 +1,18 @@ from __future__ import annotations -from typing import Optional, Dict, Union, List +from typing import Dict, List, Optional, Union from typing_extensions import Literal +from schema_source.aws_serverless_connector import EmbeddedConnector from schema_source.common import ( - PassThroughProp, BaseModel, - SamIntrinsicable, - get_prop, DictStrAny, + PassThroughProp, ResourceAttributes, + SamIntrinsicable, + get_prop, ) -from schema_source.aws_serverless_connector import EmbeddedConnector oauth2authorizer = get_prop("sam-property-httpapi-oauth2authorizer") lambdauthorizeridentity = get_prop("sam-property-httpapi-lambdaauthorizationidentity") diff --git a/schema_source/aws_serverless_layerversion.py b/schema_source/aws_serverless_layerversion.py index 4413ab802d..cc94d1d875 100644 --- a/schema_source/aws_serverless_layerversion.py +++ b/schema_source/aws_serverless_layerversion.py @@ -4,7 +4,7 @@ from typing_extensions import Literal -from schema_source.common import PassThroughProp, BaseModel, SamIntrinsicable, get_prop, ResourceAttributes +from schema_source.common import BaseModel, PassThroughProp, ResourceAttributes, SamIntrinsicable, get_prop contenturi = get_prop("sam-property-layerversion-layercontent") properties = get_prop("sam-resource-layerversion") diff --git a/schema_source/aws_serverless_simpletable.py b/schema_source/aws_serverless_simpletable.py index 5d6b4727f8..cfb5851620 100644 --- a/schema_source/aws_serverless_simpletable.py +++ b/schema_source/aws_serverless_simpletable.py @@ -1,11 +1,11 @@ from __future__ import annotations -from typing import Optional, Any, Dict +from typing import Any, Dict, Optional from typing_extensions import Literal -from schema_source.common import PassThroughProp, BaseModel, get_prop, ResourceAttributes from schema_source.aws_serverless_connector import EmbeddedConnector +from schema_source.common import BaseModel, PassThroughProp, ResourceAttributes, get_prop primarykey = get_prop("sam-property-simpletable-primarykeyobject") properties = get_prop("sam-resource-simpletable") diff --git a/schema_source/aws_serverless_statemachine.py b/schema_source/aws_serverless_statemachine.py index cca792ad5e..6c52567551 100644 --- a/schema_source/aws_serverless_statemachine.py +++ b/schema_source/aws_serverless_statemachine.py @@ -1,18 +1,18 @@ from __future__ import annotations -from typing import Optional, Dict, Union, List +from typing import Dict, List, Optional, Union from typing_extensions import Literal +from schema_source.aws_serverless_connector import EmbeddedConnector from schema_source.common import ( - PassThroughProp, BaseModel, - SamIntrinsicable, DictStrAny, - get_prop, + PassThroughProp, ResourceAttributes, + SamIntrinsicable, + get_prop, ) -from schema_source.aws_serverless_connector import EmbeddedConnector properties = get_prop("sam-resource-statemachine") deadletterconfig = get_prop("sam-property-statemachine-statemachinedeadletterconfig") diff --git a/schema_source/common.py b/schema_source/common.py index f594493461..ad87412126 100644 --- a/schema_source/common.py +++ b/schema_source/common.py @@ -1,8 +1,9 @@ import json import os -from pathlib import Path -from typing import Any, Dict, Optional, Union, TypeVar from functools import partial +from pathlib import Path +from typing import Any, Dict, Optional, TypeVar, Union + import pydantic from pydantic import Extra, Field diff --git a/schema_source/schema.py b/schema_source/schema.py index aa0ad23732..7161c491ff 100644 --- a/schema_source/schema.py +++ b/schema_source/schema.py @@ -3,24 +3,22 @@ import argparse import json from pathlib import Path +from typing import Any, Dict, Optional, Type, Union import pydantic -from typing import Any, Dict, Type, Optional, Union - - -from schema_source.common import BaseModel, LenientBaseModel from schema_source import ( - aws_serverless_simpletable, + any_cfn_resource, + aws_serverless_api, aws_serverless_application, aws_serverless_connector, aws_serverless_function, - aws_serverless_statemachine, - aws_serverless_layerversion, - aws_serverless_api, aws_serverless_httpapi, - any_cfn_resource, + aws_serverless_layerversion, + aws_serverless_simpletable, + aws_serverless_statemachine, ) +from schema_source.common import BaseModel, LenientBaseModel class Globals(BaseModel):