diff --git a/Makefile b/Makefile index 7804f7c4f..c47d6ec3a 100644 --- a/Makefile +++ b/Makefile @@ -18,7 +18,7 @@ init: lint: flake8 moto black --check moto/ tests/ - pylint -j 0 tests + pylint -j 0 moto/a* moto/b* moto/c* tests format: black moto/ tests/ diff --git a/moto/acm/models.py b/moto/acm/models.py index 7401aede3..63719135c 100644 --- a/moto/acm/models.py +++ b/moto/acm/models.py @@ -405,7 +405,7 @@ class CertBundle(BaseModel): class AWSCertificateManagerBackend(BaseBackend): def __init__(self, region): - super(AWSCertificateManagerBackend, self).__init__() + super().__init__() self.region = region self._certificates = {} self._idempotency_tokens = {} diff --git a/moto/apigateway/exceptions.py b/moto/apigateway/exceptions.py index 3d22eab98..b08eb2ad8 100644 --- a/moto/apigateway/exceptions.py +++ b/moto/apigateway/exceptions.py @@ -19,7 +19,7 @@ class ConflictException(JsonRESTError): class AwsProxyNotAllowed(BadRequestException): def __init__(self): - super(AwsProxyNotAllowed, self).__init__( + super().__init__( "BadRequestException", "Integrations of type 'AWS_PROXY' currently only supports Lambda function and Firehose stream invocations.", ) @@ -27,28 +27,28 @@ class AwsProxyNotAllowed(BadRequestException): class CrossAccountNotAllowed(AccessDeniedException): def __init__(self): - super(CrossAccountNotAllowed, self).__init__( + super().__init__( "AccessDeniedException", "Cross-account pass role is not allowed." ) class RoleNotSpecified(BadRequestException): def __init__(self): - super(RoleNotSpecified, self).__init__( + super().__init__( "BadRequestException", "Role ARN must be specified for AWS integrations" ) class IntegrationMethodNotDefined(BadRequestException): def __init__(self): - super(IntegrationMethodNotDefined, self).__init__( + super().__init__( "BadRequestException", "Enumeration value for HttpMethod must be non-empty" ) class InvalidResourcePathException(BadRequestException): def __init__(self): - super(InvalidResourcePathException, self).__init__( + super().__init__( "BadRequestException", "Resource's path part only allow a-zA-Z0-9._- and curly braces at the beginning and the end and an optional plus sign before the closing brace.", ) @@ -56,51 +56,43 @@ class InvalidResourcePathException(BadRequestException): class InvalidHttpEndpoint(BadRequestException): def __init__(self): - super(InvalidHttpEndpoint, self).__init__( + super().__init__( "BadRequestException", "Invalid HTTP endpoint specified for URI" ) class InvalidArn(BadRequestException): def __init__(self): - super(InvalidArn, self).__init__( - "BadRequestException", "Invalid ARN specified in the request" - ) + super().__init__("BadRequestException", "Invalid ARN specified in the request") class InvalidIntegrationArn(BadRequestException): def __init__(self): - super(InvalidIntegrationArn, self).__init__( + super().__init__( "BadRequestException", "AWS ARN for integration must contain path or action" ) class InvalidRequestInput(BadRequestException): def __init__(self): - super(InvalidRequestInput, self).__init__( - "BadRequestException", "Invalid request input" - ) + super().__init__("BadRequestException", "Invalid request input") class NoIntegrationDefined(NotFoundException): def __init__(self): - super(NoIntegrationDefined, self).__init__( - "NotFoundException", "No integration defined for method" - ) + super().__init__("NotFoundException", "No integration defined for method") class NoIntegrationResponseDefined(NotFoundException): code = 404 def __init__(self, code=None): - super(NoIntegrationResponseDefined, self).__init__( - "NotFoundException", "Invalid Response status code specified" - ) + super().__init__("NotFoundException", "Invalid Response status code specified") class NoMethodDefined(BadRequestException): def __init__(self): - super(NoMethodDefined, self).__init__( + super().__init__( "BadRequestException", "The REST API doesn't contain any methods" ) @@ -109,61 +101,49 @@ class AuthorizerNotFoundException(NotFoundException): code = 404 def __init__(self): - super(AuthorizerNotFoundException, self).__init__( - "NotFoundException", "Invalid Authorizer identifier specified" - ) + super().__init__("NotFoundException", "Invalid Authorizer identifier specified") class StageNotFoundException(NotFoundException): code = 404 def __init__(self): - super(StageNotFoundException, self).__init__( - "NotFoundException", "Invalid stage identifier specified" - ) + super().__init__("NotFoundException", "Invalid stage identifier specified") class ApiKeyNotFoundException(NotFoundException): code = 404 def __init__(self): - super(ApiKeyNotFoundException, self).__init__( - "NotFoundException", "Invalid API Key identifier specified" - ) + super().__init__("NotFoundException", "Invalid API Key identifier specified") class UsagePlanNotFoundException(NotFoundException): code = 404 def __init__(self): - super(UsagePlanNotFoundException, self).__init__( - "NotFoundException", "Invalid Usage Plan ID specified" - ) + super().__init__("NotFoundException", "Invalid Usage Plan ID specified") class ApiKeyAlreadyExists(JsonRESTError): code = 409 def __init__(self): - super(ApiKeyAlreadyExists, self).__init__( - "ConflictException", "API Key already exists" - ) + super().__init__("ConflictException", "API Key already exists") class InvalidDomainName(BadRequestException): code = 404 def __init__(self): - super(InvalidDomainName, self).__init__( - "BadRequestException", "No Domain Name specified" - ) + super().__init__("BadRequestException", "No Domain Name specified") class DomainNameNotFound(NotFoundException): code = 404 def __init__(self): - super(DomainNameNotFound, self).__init__( + super().__init__( "NotFoundException", "Invalid domain name identifier specified" ) @@ -172,52 +152,42 @@ class InvalidRestApiId(BadRequestException): code = 404 def __init__(self): - super(InvalidRestApiId, self).__init__( - "BadRequestException", "No Rest API Id specified" - ) + super().__init__("BadRequestException", "No Rest API Id specified") class InvalidModelName(BadRequestException): code = 404 def __init__(self): - super(InvalidModelName, self).__init__( - "BadRequestException", "No Model Name specified" - ) + super().__init__("BadRequestException", "No Model Name specified") class RestAPINotFound(NotFoundException): code = 404 def __init__(self): - super(RestAPINotFound, self).__init__( - "NotFoundException", "Invalid Rest API Id specified" - ) + super().__init__("NotFoundException", "Invalid Rest API Id specified") class RequestValidatorNotFound(BadRequestException): code = 400 def __init__(self): - super(RequestValidatorNotFound, self).__init__( - "NotFoundException", "Invalid Request Validator Id specified" - ) + super().__init__("NotFoundException", "Invalid Request Validator Id specified") class ModelNotFound(NotFoundException): code = 404 def __init__(self): - super(ModelNotFound, self).__init__( - "NotFoundException", "Invalid Model Name specified" - ) + super().__init__("NotFoundException", "Invalid Model Name specified") class ApiKeyValueMinLength(BadRequestException): code = 400 def __init__(self): - super(ApiKeyValueMinLength, self).__init__( + super().__init__( "BadRequestException", "API Key value should be at least 20 characters" ) @@ -226,16 +196,14 @@ class MethodNotFoundException(NotFoundException): code = 404 def __init__(self): - super(MethodNotFoundException, self).__init__( - "NotFoundException", "Invalid Method identifier specified" - ) + super().__init__("NotFoundException", "Invalid Method identifier specified") class InvalidBasePathException(BadRequestException): code = 400 def __init__(self): - super(InvalidBasePathException, self).__init__( + super().__init__( "BadRequestException", "API Gateway V1 doesn't support the slash character (/) in base path mappings. " "To create a multi-level base path mapping, use API Gateway V2.", @@ -246,23 +214,19 @@ class InvalidRestApiIdForBasePathMappingException(BadRequestException): code = 400 def __init__(self): - super(InvalidRestApiIdForBasePathMappingException, self).__init__( - "BadRequestException", "Invalid REST API identifier specified" - ) + super().__init__("BadRequestException", "Invalid REST API identifier specified") class InvalidStageException(BadRequestException): code = 400 def __init__(self): - super(InvalidStageException, self).__init__( - "BadRequestException", "Invalid stage identifier specified" - ) + super().__init__("BadRequestException", "Invalid stage identifier specified") class BasePathConflictException(ConflictException): def __init__(self): - super(BasePathConflictException, self).__init__( + super().__init__( "ConflictException", "Base path already exists for this domain name" ) @@ -271,6 +235,6 @@ class BasePathNotFoundException(NotFoundException): code = 404 def __init__(self): - super(BasePathNotFoundException, self).__init__( + super().__init__( "NotFoundException", "Invalid base path mapping identifier specified" ) diff --git a/moto/apigateway/models.py b/moto/apigateway/models.py index cc0782e5c..e401d3fdd 100644 --- a/moto/apigateway/models.py +++ b/moto/apigateway/models.py @@ -60,7 +60,7 @@ STAGE_URL = "https://{api_id}.execute-api.{region_name}.amazonaws.com/{stage_nam class Deployment(CloudFormationModel, dict): def __init__(self, deployment_id, name, description=""): - super(Deployment, self).__init__() + super().__init__() self["id"] = deployment_id self["stageName"] = name self["description"] = description @@ -121,7 +121,7 @@ class Integration(BaseModel, dict): tls_config=None, cache_namespace=None, ): - super(Integration, self).__init__() + super().__init__() self["type"] = integration_type self["uri"] = uri self["httpMethod"] = http_method @@ -158,7 +158,7 @@ class Integration(BaseModel, dict): class MethodResponse(BaseModel, dict): def __init__(self, status_code, response_models=None, response_parameters=None): - super(MethodResponse, self).__init__() + super().__init__() self["statusCode"] = status_code self["responseModels"] = response_models self["responseParameters"] = response_parameters @@ -166,7 +166,7 @@ class MethodResponse(BaseModel, dict): class Method(CloudFormationModel, dict): def __init__(self, method_type, authorization_type, **kwargs): - super(Method, self).__init__() + super().__init__() self.update( dict( httpMethod=method_type, @@ -237,9 +237,9 @@ class Method(CloudFormationModel, dict): class Resource(CloudFormationModel): - def __init__(self, id, region_name, api_id, path_part, parent_id): - super(Resource, self).__init__() - self.id = id + def __init__(self, resource_id, region_name, api_id, path_part, parent_id): + super().__init__() + self.id = resource_id self.region_name = region_name self.api_id = api_id self.path_part = path_part @@ -383,9 +383,9 @@ class Resource(CloudFormationModel): class Authorizer(BaseModel, dict): - def __init__(self, id, name, authorizer_type, **kwargs): - super(Authorizer, self).__init__() - self["id"] = id + def __init__(self, authorizer_id, name, authorizer_type, **kwargs): + super().__init__() + self["id"] = authorizer_id self["name"] = name self["type"] = authorizer_type if kwargs.get("provider_arns"): @@ -442,7 +442,7 @@ class Stage(BaseModel, dict): tags=None, tracing_enabled=None, ): - super(Stage, self).__init__() + super().__init__() if variables is None: variables = {} self["stageName"] = name @@ -579,11 +579,11 @@ class ApiKey(BaseModel, dict): enabled=False, generateDistinctId=False, value=None, - stageKeys=[], + stageKeys=None, tags=None, customerId=None, ): - super(ApiKey, self).__init__() + super().__init__() self["id"] = create_id() self["value"] = ( value @@ -595,7 +595,7 @@ class ApiKey(BaseModel, dict): self["description"] = description self["enabled"] = enabled self["createdDate"] = self["lastUpdatedDate"] = int(time.time()) - self["stageKeys"] = stageKeys + self["stageKeys"] = stageKeys or [] self["tags"] = tags def update_operations(self, patch_operations): @@ -628,7 +628,7 @@ class UsagePlan(BaseModel, dict): productCode=None, tags=None, ): - super(UsagePlan, self).__init__() + super().__init__() self["id"] = create_id() self["name"] = name self["description"] = description @@ -671,9 +671,9 @@ class RequestValidator(BaseModel, dict): OP_REPLACE = "replace" OP_OP = "op" - def __init__(self, id, name, validateRequestBody, validateRequestParameters): - super(RequestValidator, self).__init__() - self[RequestValidator.PROP_ID] = id + def __init__(self, _id, name, validateRequestBody, validateRequestParameters): + super().__init__() + self[RequestValidator.PROP_ID] = _id self[RequestValidator.PROP_NAME] = name self[RequestValidator.PROP_VALIDATE_REQUEST_BODY] = validateRequestBody self[ @@ -706,11 +706,11 @@ class RequestValidator(BaseModel, dict): class UsagePlanKey(BaseModel, dict): - def __init__(self, id, type, name, value): - super(UsagePlanKey, self).__init__() - self["id"] = id + def __init__(self, plan_id, plan_type, name, value): + super().__init__() + self["id"] = plan_id self["name"] = name - self["type"] = type + self["type"] = plan_type self["value"] = value @@ -737,9 +737,9 @@ class RestAPI(CloudFormationModel): OPERATION_VALUE = "value" OPERATION_OP = "op" - def __init__(self, id, region_name, name, description, **kwargs): - super(RestAPI, self).__init__() - self.id = id + def __init__(self, api_id, region_name, name, description, **kwargs): + super().__init__() + self.id = api_id self.region_name = region_name self.name = name self.description = description @@ -855,7 +855,7 @@ class RestAPI(CloudFormationModel): def add_child(self, path, parent_id=None): child_id = create_id() child = Resource( - id=child_id, + resource_id=child_id, region_name=self.region_name, api_id=self.id, path_part=path, @@ -875,7 +875,7 @@ class RestAPI(CloudFormationModel): ): model_id = create_id() new_model = Model( - id=model_id, + model_id=model_id, name=name, description=description, schema=schema, @@ -909,11 +909,11 @@ class RestAPI(CloudFormationModel): api_id=self.id.upper(), region_name=self.region_name, stage_name=stage_name ) - for resource_id, resource in self.resources.items(): + for resource in self.resources.values(): path = resource.get_path() path = "" if path == "/" else path - for http_method, method in resource.resource_methods.items(): + for http_method in resource.resource_methods.keys(): for url in [stage_url_lower, stage_url_upper]: callback_response = responses.CallbackResponse( url=url + path, @@ -926,7 +926,7 @@ class RestAPI(CloudFormationModel): def create_authorizer( self, - id, + authorizer_id, name, authorizer_type, provider_arns=None, @@ -938,7 +938,7 @@ class RestAPI(CloudFormationModel): authorizer_result_ttl=None, ): authorizer = Authorizer( - id=id, + authorizer_id=authorizer_id, name=name, authorizer_type=authorizer_type, provider_arns=provider_arns, @@ -949,7 +949,7 @@ class RestAPI(CloudFormationModel): identiy_validation_expression=identiy_validation_expression, authorizer_result_ttl=authorizer_result_ttl, ) - self.authorizers[id] = authorizer + self.authorizers[authorizer_id] = authorizer return authorizer def create_stage( @@ -1012,7 +1012,7 @@ class RestAPI(CloudFormationModel): ): validator_id = create_id() request_validator = RequestValidator( - id=validator_id, + _id=validator_id, name=name, validateRequestBody=validateRequestBody, validateRequestParameters=validateRequestParameters, @@ -1040,7 +1040,7 @@ class RestAPI(CloudFormationModel): class DomainName(BaseModel, dict): def __init__(self, domain_name, **kwargs): - super(DomainName, self).__init__() + super().__init__() self["domainName"] = domain_name self["regionalDomainName"] = "d-%s.execute-api.%s.amazonaws.com" % ( create_id(), @@ -1077,9 +1077,9 @@ class DomainName(BaseModel, dict): class Model(BaseModel, dict): - def __init__(self, id, name, **kwargs): - super(Model, self).__init__() - self["id"] = id + def __init__(self, model_id, name, **kwargs): + super().__init__() + self["id"] = model_id self["name"] = name if kwargs.get("description"): self["description"] = kwargs.get("description") @@ -1095,7 +1095,7 @@ class Model(BaseModel, dict): class BasePathMapping(BaseModel, dict): def __init__(self, domain_name, rest_api_id, **kwargs): - super(BasePathMapping, self).__init__() + super().__init__() self["domain_name"] = domain_name self["restApiId"] = rest_api_id if kwargs.get("basePath"): @@ -1135,7 +1135,7 @@ class APIGatewayBackend(BaseBackend): """ def __init__(self, region_name): - super(APIGatewayBackend, self).__init__() + super().__init__() self.apis = {} self.keys = {} self.usage_plans = {} @@ -1591,8 +1591,8 @@ class APIGatewayBackend(BaseBackend): api_key = self.keys[key_id] usage_plan_key = UsagePlanKey( - id=key_id, - type=payload["keyType"], + plan_id=key_id, + plan_type=payload["keyType"], name=api_key["name"], value=api_key["value"], ) diff --git a/moto/apigateway/responses.py b/moto/apigateway/responses.py index 82a80e918..11eb3ea1d 100644 --- a/moto/apigateway/responses.py +++ b/moto/apigateway/responses.py @@ -289,9 +289,9 @@ class APIGatewayResponse(BaseResponse): ) authorizer_response = self.backend.create_authorizer( - restapi_id, - name, - authorizer_type, + restapi_id=restapi_id, + name=name, + authorizer_type=authorizer_type, provider_arns=provider_arns, auth_type=auth_type, authorizer_uri=authorizer_uri, diff --git a/moto/applicationautoscaling/exceptions.py b/moto/applicationautoscaling/exceptions.py index e7850d5e6..3bb161162 100644 --- a/moto/applicationautoscaling/exceptions.py +++ b/moto/applicationautoscaling/exceptions.py @@ -3,6 +3,4 @@ from moto.core.exceptions import JsonRESTError class AWSValidationException(JsonRESTError): def __init__(self, message, **kwargs): - super(AWSValidationException, self).__init__( - "ValidationException", message, **kwargs - ) + super().__init__("ValidationException", message, **kwargs) diff --git a/moto/applicationautoscaling/models.py b/moto/applicationautoscaling/models.py index 1153619c0..ab3de4f8e 100644 --- a/moto/applicationautoscaling/models.py +++ b/moto/applicationautoscaling/models.py @@ -59,7 +59,7 @@ class ScalableDimensionValueSet(Enum): class ApplicationAutoscalingBackend(BaseBackend): def __init__(self, region, ecs): - super(ApplicationAutoscalingBackend, self).__init__() + super().__init__() self.region = region self.ecs_backend = ecs self.targets = OrderedDict() @@ -124,7 +124,7 @@ class ApplicationAutoscalingBackend(BaseBackend): """Raises a ValidationException if an ECS service does not exist for the specified resource ID. """ - resource_type, cluster, service = r_id.split("/") + _, cluster, service = r_id.split("/") result, _ = self.ecs_backend.describe_services(cluster, [service]) if len(result) != 1: raise AWSValidationException("ECS service doesn't exist: {}".format(r_id)) @@ -242,7 +242,7 @@ def _target_params_are_valid(namespace, r_id, dimension): try: valid_dimensions = [d.value for d in ScalableDimensionValueSet] resource_type_exceptions = [r.value for r in ResourceTypeExceptionValueSet] - d_namespace, d_resource_type, scaling_property = dimension.split(":") + d_namespace, d_resource_type, _ = dimension.split(":") if d_resource_type not in resource_type_exceptions: resource_type = _get_resource_type_from_resource_id(r_id) else: diff --git a/moto/athena/exceptions.py b/moto/athena/exceptions.py index 50a01d25d..6beeb6479 100644 --- a/moto/athena/exceptions.py +++ b/moto/athena/exceptions.py @@ -4,7 +4,7 @@ from werkzeug.exceptions import BadRequest class AthenaClientError(BadRequest): def __init__(self, code, message): - super(AthenaClientError, self).__init__() + super().__init__() self.description = json.dumps( { "Error": { diff --git a/moto/athena/models.py b/moto/athena/models.py index defa6c356..912ea772c 100644 --- a/moto/athena/models.py +++ b/moto/athena/models.py @@ -39,9 +39,7 @@ class WorkGroup(TaggableResourceMixin, BaseModel): def __init__(self, athena_backend, name, configuration, description, tags): self.region_name = athena_backend.region_name - super(WorkGroup, self).__init__( - self.region_name, "workgroup/{}".format(name), tags - ) + super().__init__(self.region_name, "workgroup/{}".format(name), tags) self.athena_backend = athena_backend self.name = name self.description = description diff --git a/moto/athena/responses.py b/moto/athena/responses.py index ad256b5e2..d4a85bb4a 100644 --- a/moto/athena/responses.py +++ b/moto/athena/responses.py @@ -43,10 +43,10 @@ class AthenaResponse(BaseResponse): workgroup = self._get_param("WorkGroup") if workgroup and not self.athena_backend.get_work_group(workgroup): return self.error("WorkGroup does not exist", 400) - id = self.athena_backend.start_query_execution( + q_exec_id = self.athena_backend.start_query_execution( query=query, context=context, config=config, workgroup=workgroup ) - return json.dumps({"QueryExecutionId": id}) + return json.dumps({"QueryExecutionId": q_exec_id}) def get_query_execution(self): exec_id = self._get_param("QueryExecutionId") diff --git a/moto/autoscaling/exceptions.py b/moto/autoscaling/exceptions.py index ced239919..c408e16b2 100644 --- a/moto/autoscaling/exceptions.py +++ b/moto/autoscaling/exceptions.py @@ -9,7 +9,7 @@ class ResourceContentionError(RESTError): code = 500 def __init__(self): - super(ResourceContentionError, self).__init__( + super().__init__( "ResourceContentionError", "You already have a pending update to an Auto Scaling resource (for example, a group, instance, or load balancer).", ) @@ -17,11 +17,11 @@ class ResourceContentionError(RESTError): class InvalidInstanceError(AutoscalingClientError): def __init__(self, instance_id): - super(InvalidInstanceError, self).__init__( + super().__init__( "ValidationError", "Instance [{0}] is invalid.".format(instance_id) ) class ValidationError(AutoscalingClientError): def __init__(self, message): - super(ValidationError, self).__init__("ValidationError", message) + super().__init__("ValidationError", message) diff --git a/moto/awslambda/exceptions.py b/moto/awslambda/exceptions.py index 08d13dce5..b998d6e36 100644 --- a/moto/awslambda/exceptions.py +++ b/moto/awslambda/exceptions.py @@ -5,21 +5,19 @@ from moto.core.exceptions import JsonRESTError class LambdaClientError(ClientError): def __init__(self, error, message): error_response = {"Error": {"Code": error, "Message": message}} - super(LambdaClientError, self).__init__(error_response, None) + super().__init__(error_response, None) class CrossAccountNotAllowed(LambdaClientError): def __init__(self): - super(CrossAccountNotAllowed, self).__init__( + super().__init__( "AccessDeniedException", "Cross-account pass role is not allowed." ) class InvalidParameterValueException(LambdaClientError): def __init__(self, message): - super(InvalidParameterValueException, self).__init__( - "InvalidParameterValueException", message - ) + super().__init__("InvalidParameterValueException", message) class InvalidRoleFormat(LambdaClientError): @@ -29,13 +27,11 @@ class InvalidRoleFormat(LambdaClientError): message = "1 validation error detected: Value '{0}' at 'role' failed to satisfy constraint: Member must satisfy regular expression pattern: {1}".format( role, InvalidRoleFormat.pattern ) - super(InvalidRoleFormat, self).__init__("ValidationException", message) + super().__init__("ValidationException", message) class PreconditionFailedException(JsonRESTError): code = 412 def __init__(self, message): - super(PreconditionFailedException, self).__init__( - "PreconditionFailedException", message - ) + super().__init__("PreconditionFailedException", message) diff --git a/moto/awslambda/models.py b/moto/awslambda/models.py index eb083e664..eb3b91919 100644 --- a/moto/awslambda/models.py +++ b/moto/awslambda/models.py @@ -948,8 +948,10 @@ class LambdaStorage(object): def get_arn(self, arn): return self._arns.get(arn, None) - def get_function_by_name_or_arn(self, input, qualifier=None): - return self.get_function_by_name(input, qualifier) or self.get_arn(input) + def get_function_by_name_or_arn(self, name_or_arn, qualifier=None): + return self.get_function_by_name(name_or_arn, qualifier) or self.get_arn( + name_or_arn + ) def put_function(self, fn): """ @@ -1226,7 +1228,7 @@ class LambdaBackend(BaseBackend): if not esm: return False - for key, value in spec.items(): + for key in spec.keys(): if key == "FunctionName": func = self._lambdas.get_function_by_name_or_arn(spec[key]) esm.function_arn = func.function_arn diff --git a/moto/batch/models.py b/moto/batch/models.py index fc0307649..8e98db457 100644 --- a/moto/batch/models.py +++ b/moto/batch/models.py @@ -27,7 +27,7 @@ from moto.ec2.models import INSTANCE_TYPES as EC2_INSTANCE_TYPES from moto.iam.exceptions import IAMNotFoundException from moto.core import ACCOUNT_ID as DEFAULT_ACCOUNT_ID from moto.core.utils import unix_time_millis -from moto.utilities.docker_utilities import DockerModel, parse_image_ref +from moto.utilities.docker_utilities import DockerModel from ..utilities.tagging_service import TaggingService logger = logging.getLogger(__name__) @@ -197,7 +197,7 @@ class JobDefinition(CloudFormationModel): _type, container_properties, region_name, - tags={}, + tags=None, revision=0, retry_strategy=0, timeout=None, @@ -217,13 +217,13 @@ class JobDefinition(CloudFormationModel): self._validate() self._update_arn() - tags = self._format_tags(tags) + tags = self._format_tags(tags or {}) # Validate the tags before proceeding. - errmsg = self.tagger.validate_tags(tags or []) + errmsg = self.tagger.validate_tags(tags) if errmsg: raise ValidationError(errmsg) - self.tagger.tag_resource(self.arn, tags or []) + self.tagger.tag_resource(self.arn, tags) def _format_tags(self, tags): return [{"Key": k, "Value": v} for k, v in tags.items()] @@ -546,9 +546,6 @@ class Job(threading.Thread, BaseModel, DockerModel): self.job_started_at = datetime.datetime.now() log_config = docker.types.LogConfig(type=docker.types.LogConfig.types.JSON) - image_repository, image_tag = parse_image_ref(image) - # avoid explicit pulling here, to allow using cached images - # self.docker_client.images.pull(image_repository, image_tag) self.job_state = "STARTING" container = self.docker_client.containers.run( image, @@ -691,7 +688,7 @@ class Job(threading.Thread, BaseModel, DockerModel): class BatchBackend(BaseBackend): def __init__(self, region_name=None): - super(BatchBackend, self).__init__() + super().__init__() self.region_name = region_name self._compute_environments = {} diff --git a/moto/cloudformation/exceptions.py b/moto/cloudformation/exceptions.py index f4d0664b6..52bf9d157 100644 --- a/moto/cloudformation/exceptions.py +++ b/moto/cloudformation/exceptions.py @@ -15,14 +15,14 @@ class ValidationError(BadRequest): message = "Stack with id {0} does not exist".format(name_or_id) template = Template(ERROR_RESPONSE) - super(ValidationError, self).__init__() + super().__init__() self.description = template.render(code="ValidationError", message=message) class MissingParameterError(BadRequest): def __init__(self, parameter_name): template = Template(ERROR_RESPONSE) - super(MissingParameterError, self).__init__() + super().__init__() self.description = template.render( code="Missing Parameter", message="Missing parameter {0}".format(parameter_name), @@ -34,7 +34,7 @@ class ExportNotFound(BadRequest): def __init__(self, export_name): template = Template(ERROR_RESPONSE) - super(ExportNotFound, self).__init__() + super().__init__() self.description = template.render( code="ExportNotFound", message="No export named {0} found.".format(export_name), @@ -44,7 +44,7 @@ class ExportNotFound(BadRequest): class UnsupportedAttribute(ValidationError): def __init__(self, resource, attr): template = Template(ERROR_RESPONSE) - super(UnsupportedAttribute, self).__init__() + super().__init__() self.description = template.render( code="ValidationError", message=f"Template error: resource {resource} does not support attribute type {attr} in Fn::GetAtt", diff --git a/moto/cloudformation/models.py b/moto/cloudformation/models.py index 9ca85dff8..fb4449bbb 100644 --- a/moto/cloudformation/models.py +++ b/moto/cloudformation/models.py @@ -4,8 +4,10 @@ import yaml import uuid from boto3 import Session - from collections import OrderedDict +from yaml.parser import ParserError # pylint:disable=c-extension-no-member +from yaml.scanner import ScannerError # pylint:disable=c-extension-no-member + from moto.core import BaseBackend, BaseModel from moto.core.models import ACCOUNT_ID from moto.core.utils import ( @@ -54,7 +56,11 @@ class FakeStackSet(BaseModel): self.stack_instances = self.instances.stack_instances self.operations = [] - def _create_operation(self, operation_id, action, status, accounts=[], regions=[]): + def _create_operation( + self, operation_id, action, status, accounts=None, regions=None + ): + accounts = accounts or [] + regions = regions or [] operation = { "OperationId": str(operation_id), "Action": action, @@ -309,7 +315,7 @@ class FakeStack(BaseModel): yaml.add_multi_constructor("", yaml_tag_constructor) try: self.template_dict = yaml.load(self.template, Loader=yaml.Loader) - except (yaml.parser.ParserError, yaml.scanner.ScannerError): + except (ParserError, ScannerError): self.template_dict = json.loads(self.template) @property @@ -418,7 +424,7 @@ class FakeChangeSet(BaseModel): yaml.add_multi_constructor("", yaml_tag_constructor) try: self.template_dict = yaml.load(self.template, Loader=yaml.Loader) - except (yaml.parser.ParserError, yaml.scanner.ScannerError): + except (ParserError, ScannerError): self.template_dict = json.loads(self.template) @property diff --git a/moto/cloudformation/parsing.py b/moto/cloudformation/parsing.py index bcd9eae30..ad64d1f14 100644 --- a/moto/cloudformation/parsing.py +++ b/moto/cloudformation/parsing.py @@ -14,39 +14,41 @@ import collections.abc as collections_abc # the subclass's module hasn't been imported yet - then that subclass # doesn't exist yet, and __subclasses__ won't find it. # So we import here to populate the list of subclasses. -from moto.apigateway import models as apigateway_models # noqa -from moto.autoscaling import models as autoscaling_models # noqa -from moto.awslambda import models as awslambda_models # noqa -from moto.batch import models as batch_models # noqa +from moto.apigateway import models # noqa # pylint: disable=all +from moto.autoscaling import models # noqa # pylint: disable=all +from moto.awslambda import models # noqa # pylint: disable=all +from moto.batch import models # noqa # pylint: disable=all from moto.cloudformation.custom_model import CustomModel -from moto.cloudwatch import models as cloudwatch_models # noqa -from moto.datapipeline import models as datapipeline_models # noqa -from moto.dynamodb2 import models as dynamodb2_models # noqa +from moto.cloudwatch import models # noqa # pylint: disable=all +from moto.datapipeline import models # noqa # pylint: disable=all +from moto.dynamodb2 import models # noqa # pylint: disable=all from moto.ec2 import models as ec2_models -from moto.ecr import models as ecr_models # noqa -from moto.ecs import models as ecs_models # noqa -from moto.efs import models as efs_models # noqa -from moto.elb import models as elb_models # noqa -from moto.elbv2 import models as elbv2_models # noqa -from moto.events import models as events_models # noqa -from moto.iam import models as iam_models # noqa -from moto.kinesis import models as kinesis_models # noqa -from moto.kms import models as kms_models # noqa -from moto.rds import models as rds_models # noqa -from moto.rds2 import models as rds2_models # noqa -from moto.redshift import models as redshift_models # noqa -from moto.route53 import models as route53_models # noqa -from moto.s3 import models as s3_models, s3_backend # noqa -from moto.s3.utils import bucket_and_name_from_url -from moto.sagemaker import models as sagemaker_models # noqa -from moto.sns import models as sns_models # noqa -from moto.sqs import models as sqs_models # noqa -from moto.stepfunctions import models as stepfunctions_models # noqa -from moto.ssm import models as ssm_models, ssm_backends # noqa +from moto.ecr import models # noqa # pylint: disable=all +from moto.ecs import models # noqa # pylint: disable=all +from moto.efs import models # noqa # pylint: disable=all +from moto.elb import models # noqa # pylint: disable=all +from moto.elbv2 import models # noqa # pylint: disable=all +from moto.events import models # noqa # pylint: disable=all +from moto.iam import models # noqa # pylint: disable=all +from moto.kinesis import models # noqa # pylint: disable=all +from moto.kms import models # noqa # pylint: disable=all +from moto.rds import models # noqa # pylint: disable=all +from moto.rds2 import models # noqa # pylint: disable=all +from moto.redshift import models # noqa # pylint: disable=all +from moto.route53 import models # noqa # pylint: disable=all +from moto.s3 import models # noqa # pylint: disable=all +from moto.sagemaker import models # noqa # pylint: disable=all +from moto.sns import models # noqa # pylint: disable=all +from moto.sqs import models # noqa # pylint: disable=all +from moto.stepfunctions import models # noqa # pylint: disable=all +from moto.ssm import models # noqa # pylint: disable=all # End ugly list of imports from moto.core import ACCOUNT_ID, CloudFormationModel +from moto.s3 import s3_backend +from moto.s3.utils import bucket_and_name_from_url +from moto.ssm import ssm_backends from .utils import random_suffix from .exceptions import ( ExportNotFound, @@ -512,7 +514,7 @@ class ResourceMap(collections_abc.Mapping): self._parsed_resources.update(self._template.get("Mappings", {})) def transform_mapping(self): - for k, v in self._template.get("Mappings", {}).items(): + for v in self._template.get("Mappings", {}).values(): if "Fn::Transform" in v: name = v["Fn::Transform"]["Name"] params = v["Fn::Transform"]["Parameters"] @@ -600,7 +602,7 @@ class ResourceMap(collections_abc.Mapping): def validate_outputs(self): outputs = self._template.get("Outputs") or {} - for key, value in outputs.items(): + for value in outputs.values(): value = value.get("Value", {}) if "Fn::GetAtt" in value: resource_type = self._resource_json_map.get(value["Fn::GetAtt"][0])[ @@ -828,7 +830,7 @@ class OutputMap(collections_abc.Mapping): def exports(self): exports = [] if self.outputs: - for key, value in self._output_json_map.items(): + for value in self._output_json_map.values(): if value.get("Export"): cleaned_name = clean_json( value["Export"].get("Name"), self._resource_map diff --git a/moto/cloudformation/responses.py b/moto/cloudformation/responses.py index 028a5bb19..b20267a6b 100644 --- a/moto/cloudformation/responses.py +++ b/moto/cloudformation/responses.py @@ -1,6 +1,8 @@ import json import yaml from urllib.parse import urlparse +from yaml.parser import ParserError # pylint:disable=c-extension-no-member +from yaml.scanner import ScannerError # pylint:disable=c-extension-no-member from moto.core.responses import BaseResponse from moto.core.utils import amzn_request_id @@ -28,7 +30,7 @@ def get_template_summary_response_from_template(template_body): try: template_dict = yaml.load(template_body, Loader=yaml.Loader) - except (yaml.parser.ParserError, yaml.scanner.ScannerError): + except (ParserError, ScannerError): template_dict = json.loads(template_body) resources_types = get_resource_types(template_dict) @@ -446,7 +448,7 @@ class CloudFormationResponse(BaseResponse): pass try: description = yaml.load(template_body, Loader=yaml.Loader)["Description"] - except (yaml.parser.ParserError, yaml.scanner.ScannerError, KeyError): + except (ParserError, ScannerError, KeyError): pass template = self.response_template(VALIDATE_STACK_RESPONSE_TEMPLATE) return template.render(description=description) diff --git a/moto/cloudtrail/exceptions.py b/moto/cloudtrail/exceptions.py index 853750865..94e711262 100644 --- a/moto/cloudtrail/exceptions.py +++ b/moto/cloudtrail/exceptions.py @@ -7,34 +7,28 @@ class InvalidParameterCombinationException(JsonRESTError): code = 400 def __init__(self, message): - super(InvalidParameterCombinationException, self).__init__( - "InvalidParameterCombinationException", message - ) + super().__init__("InvalidParameterCombinationException", message) class S3BucketDoesNotExistException(JsonRESTError): code = 400 def __init__(self, message): - super(S3BucketDoesNotExistException, self).__init__( - "S3BucketDoesNotExistException", message - ) + super().__init__("S3BucketDoesNotExistException", message) class InsufficientSnsTopicPolicyException(JsonRESTError): code = 400 def __init__(self, message): - super(InsufficientSnsTopicPolicyException, self).__init__( - "InsufficientSnsTopicPolicyException", message - ) + super().__init__("InsufficientSnsTopicPolicyException", message) class TrailNotFoundException(JsonRESTError): code = 400 def __init__(self, name): - super(TrailNotFoundException, self).__init__( + super().__init__( "TrailNotFoundException", f"Unknown trail: {name} for the user: {ACCOUNT_ID}", ) @@ -44,41 +38,35 @@ class InvalidTrailNameException(JsonRESTError): code = 400 def __init__(self, message): - super(InvalidTrailNameException, self).__init__( - "InvalidTrailNameException", message - ) + super().__init__("InvalidTrailNameException", message) class TrailNameTooShort(InvalidTrailNameException): def __init__(self, actual_length): - super(TrailNameTooShort, self).__init__( + super().__init__( f"Trail name too short. Minimum allowed length: 3 characters. Specified name length: {actual_length} characters." ) class TrailNameTooLong(InvalidTrailNameException): def __init__(self, actual_length): - super(TrailNameTooLong, self).__init__( + super().__init__( f"Trail name too long. Maximum allowed length: 128 characters. Specified name length: {actual_length} characters." ) class TrailNameNotStartingCorrectly(InvalidTrailNameException): def __init__(self): - super(TrailNameNotStartingCorrectly, self).__init__( - "Trail name must starts with a letter or number." - ) + super().__init__("Trail name must starts with a letter or number.") class TrailNameNotEndingCorrectly(InvalidTrailNameException): def __init__(self): - super(TrailNameNotEndingCorrectly, self).__init__( - "Trail name must ends with a letter or number." - ) + super().__init__("Trail name must ends with a letter or number.") class TrailNameInvalidChars(InvalidTrailNameException): def __init__(self): - super(TrailNameInvalidChars, self).__init__( + super().__init__( "Trail name or ARN can only contain uppercase letters, lowercase letters, numbers, periods (.), hyphens (-), and underscores (_)." ) diff --git a/moto/cloudwatch/models.py b/moto/cloudwatch/models.py index 06fa9226a..ea51c93ac 100644 --- a/moto/cloudwatch/models.py +++ b/moto/cloudwatch/models.py @@ -64,9 +64,9 @@ class MetricStat(object): class MetricDataQuery(object): def __init__( - self, id, label, period, return_data, expression=None, metric_stat=None + self, query_id, label, period, return_data, expression=None, metric_stat=None ): - self.id = id + self.id = query_id self.label = label self.period = period self.return_data = return_data @@ -214,13 +214,13 @@ class MetricDatum(BaseModel): ] self.unit = unit - def filter(self, namespace, name, dimensions, already_present_metrics=[]): + def filter(self, namespace, name, dimensions, already_present_metrics=None): if namespace and namespace != self.namespace: return False if name and name != self.name: return False - for metric in already_present_metrics: + for metric in already_present_metrics or []: if self.dimensions and are_dimensions_same( metric.dimensions, self.dimensions ): diff --git a/moto/cloudwatch/responses.py b/moto/cloudwatch/responses.py index b548397cd..4c5fd265f 100644 --- a/moto/cloudwatch/responses.py +++ b/moto/cloudwatch/responses.py @@ -55,7 +55,7 @@ class CloudWatchResponse(BaseResponse): ) metric_data_queries.append( MetricDataQuery( - id=metric.get("Id"), + query_id=metric.get("Id"), label=metric.get("Label"), period=metric.get("Period"), return_data=metric.get("ReturnData"), diff --git a/moto/codecommit/exceptions.py b/moto/codecommit/exceptions.py index 136af50f1..8e93dd1ad 100644 --- a/moto/codecommit/exceptions.py +++ b/moto/codecommit/exceptions.py @@ -5,7 +5,7 @@ class RepositoryNameExistsException(JsonRESTError): code = 400 def __init__(self, repository_name): - super(RepositoryNameExistsException, self).__init__( + super().__init__( "RepositoryNameExistsException", "Repository named {0} already exists".format(repository_name), ) @@ -15,7 +15,7 @@ class RepositoryDoesNotExistException(JsonRESTError): code = 400 def __init__(self, repository_name): - super(RepositoryDoesNotExistException, self).__init__( + super().__init__( "RepositoryDoesNotExistException", "{0} does not exist".format(repository_name), ) @@ -25,7 +25,7 @@ class InvalidRepositoryNameException(JsonRESTError): code = 400 def __init__(self): - super(InvalidRepositoryNameException, self).__init__( + super().__init__( "InvalidRepositoryNameException", "The repository name is not valid. Repository names can be any valid " "combination of letters, numbers, " diff --git a/moto/codepipeline/exceptions.py b/moto/codepipeline/exceptions.py index a4db9aab1..0f2489109 100644 --- a/moto/codepipeline/exceptions.py +++ b/moto/codepipeline/exceptions.py @@ -5,40 +5,34 @@ class InvalidStructureException(JsonRESTError): code = 400 def __init__(self, message): - super(InvalidStructureException, self).__init__( - "InvalidStructureException", message - ) + super().__init__("InvalidStructureException", message) class PipelineNotFoundException(JsonRESTError): code = 400 def __init__(self, message): - super(PipelineNotFoundException, self).__init__( - "PipelineNotFoundException", message - ) + super().__init__("PipelineNotFoundException", message) class ResourceNotFoundException(JsonRESTError): code = 400 def __init__(self, message): - super(ResourceNotFoundException, self).__init__( - "ResourceNotFoundException", message - ) + super().__init__("ResourceNotFoundException", message) class InvalidTagsException(JsonRESTError): code = 400 def __init__(self, message): - super(InvalidTagsException, self).__init__("InvalidTagsException", message) + super().__init__("InvalidTagsException", message) class TooManyTagsException(JsonRESTError): code = 400 def __init__(self, arn): - super(TooManyTagsException, self).__init__( + super().__init__( "TooManyTagsException", "Tag limit exceeded for resource [{}].".format(arn) ) diff --git a/moto/cognitoidentity/exceptions.py b/moto/cognitoidentity/exceptions.py index 947ae8047..674952536 100644 --- a/moto/cognitoidentity/exceptions.py +++ b/moto/cognitoidentity/exceptions.py @@ -5,7 +5,7 @@ from werkzeug.exceptions import BadRequest class ResourceNotFoundError(BadRequest): def __init__(self, message): - super(ResourceNotFoundError, self).__init__() + super().__init__() self.description = json.dumps( {"message": message, "__type": "ResourceNotFoundException"} ) @@ -16,7 +16,7 @@ class InvalidNameException(BadRequest): message = "1 validation error detected: Value '{}' at 'identityPoolName' failed to satisfy constraint: Member must satisfy regular expression pattern: [\\w\\s+=,.@-]+" def __init__(self, name): - super(InvalidNameException, self).__init__() + super().__init__() self.description = json.dumps( { "message": InvalidNameException.message.format(name), diff --git a/moto/cognitoidentity/models.py b/moto/cognitoidentity/models.py index 70a0ebea1..3329574ce 100644 --- a/moto/cognitoidentity/models.py +++ b/moto/cognitoidentity/models.py @@ -51,7 +51,7 @@ class CognitoIdentity(BaseModel): class CognitoIdentityBackend(BaseBackend): def __init__(self, region): - super(CognitoIdentityBackend, self).__init__() + super().__init__() self.region = region self.identity_pools = OrderedDict() self.pools_identities = {} diff --git a/moto/cognitoidp/exceptions.py b/moto/cognitoidp/exceptions.py index 21f738b14..9617acce7 100644 --- a/moto/cognitoidp/exceptions.py +++ b/moto/cognitoidp/exceptions.py @@ -5,7 +5,7 @@ from moto.core.exceptions import JsonRESTError class ResourceNotFoundError(BadRequest): def __init__(self, message): - super(ResourceNotFoundError, self).__init__() + super().__init__() self.description = json.dumps( {"message": message, "__type": "ResourceNotFoundException"} ) @@ -13,7 +13,7 @@ class ResourceNotFoundError(BadRequest): class UserNotFoundError(BadRequest): def __init__(self, message): - super(UserNotFoundError, self).__init__() + super().__init__() self.description = json.dumps( {"message": message, "__type": "UserNotFoundException"} ) @@ -21,7 +21,7 @@ class UserNotFoundError(BadRequest): class UsernameExistsException(BadRequest): def __init__(self, message): - super(UsernameExistsException, self).__init__() + super().__init__() self.description = json.dumps( {"message": message, "__type": "UsernameExistsException"} ) @@ -29,7 +29,7 @@ class UsernameExistsException(BadRequest): class GroupExistsException(BadRequest): def __init__(self, message): - super(GroupExistsException, self).__init__() + super().__init__() self.description = json.dumps( {"message": message, "__type": "GroupExistsException"} ) @@ -37,7 +37,7 @@ class GroupExistsException(BadRequest): class NotAuthorizedError(BadRequest): def __init__(self, message): - super(NotAuthorizedError, self).__init__() + super().__init__() self.description = json.dumps( {"message": message, "__type": "NotAuthorizedException"} ) @@ -45,7 +45,7 @@ class NotAuthorizedError(BadRequest): class UserNotConfirmedException(BadRequest): def __init__(self, message): - super(UserNotConfirmedException, self).__init__() + super().__init__() self.description = json.dumps( {"message": message, "__type": "UserNotConfirmedException"} ) @@ -53,7 +53,7 @@ class UserNotConfirmedException(BadRequest): class ExpiredCodeException(BadRequest): def __init__(self, message): - super(ExpiredCodeException, self).__init__() + super().__init__() self.description = json.dumps( {"message": message, "__type": "ExpiredCodeException"} ) @@ -62,6 +62,6 @@ class ExpiredCodeException(BadRequest): class InvalidParameterException(JsonRESTError): def __init__(self, msg=None): self.code = 400 - super(InvalidParameterException, self).__init__( + super().__init__( "InvalidParameterException", msg or "A parameter is specified incorrectly." ) diff --git a/moto/cognitoidp/models.py b/moto/cognitoidp/models.py index 70acc6601..6463460f3 100644 --- a/moto/cognitoidp/models.py +++ b/moto/cognitoidp/models.py @@ -421,7 +421,7 @@ class CognitoIdpUserPool(BaseModel): return self.users.get(username) def create_jwt( - self, client_id, username, token_use, expires_in=60 * 60, extra_data={} + self, client_id, username, token_use, expires_in=60 * 60, extra_data=None ): now = int(time.time()) payload = { @@ -435,7 +435,7 @@ class CognitoIdpUserPool(BaseModel): "exp": now + expires_in, "email": flatten_attrs(self._get_user(username).attributes).get("email"), } - payload.update(extra_data) + payload.update(extra_data or {}) headers = {"kid": "dummy"} # KID as present in jwks-public.json return ( @@ -517,12 +517,12 @@ class CognitoIdpUserPoolDomain(BaseModel): def _distribution_name(self): if self.custom_domain_config and "CertificateArn" in self.custom_domain_config: - hash = hashlib.md5( + unique_hash = hashlib.md5( self.custom_domain_config["CertificateArn"].encode("utf-8") ).hexdigest() - return "{hash}.cloudfront.net".format(hash=hash[:16]) - hash = hashlib.md5(self.user_pool_id.encode("utf-8")).hexdigest() - return "{hash}.amazoncognito.com".format(hash=hash[:16]) + return f"{unique_hash[:16]}.cloudfront.net" + unique_hash = hashlib.md5(self.user_pool_id.encode("utf-8")).hexdigest() + return f"{unique_hash[:16]}.amazoncognito.com" def to_json(self, extended=True): distribution = self._distribution_name() @@ -730,7 +730,7 @@ class CognitoResourceServer(BaseModel): class CognitoIdpBackend(BaseBackend): def __init__(self, region): - super(CognitoIdpBackend, self).__init__() + super().__init__() self.region = region self.user_pools = OrderedDict() self.user_pool_domains = OrderedDict() diff --git a/moto/core/exceptions.py b/moto/core/exceptions.py index adcded4f0..49d573f19 100644 --- a/moto/core/exceptions.py +++ b/moto/core/exceptions.py @@ -50,7 +50,7 @@ class RESTError(HTTPException): } def __init__(self, error_type, message, template="error", **kwargs): - super(RESTError, self).__init__() + super().__init__() self.error_type = error_type self.message = message @@ -80,7 +80,7 @@ class DryRunClientError(RESTError): class JsonRESTError(RESTError): def __init__(self, error_type, message, template="error_json", **kwargs): - super(JsonRESTError, self).__init__(error_type, message, template, **kwargs) + super().__init__(error_type, message, template, **kwargs) self.description = json.dumps( {"__type": self.error_type, "message": self.message} ) @@ -94,7 +94,7 @@ class SignatureDoesNotMatchError(RESTError): code = 403 def __init__(self): - super(SignatureDoesNotMatchError, self).__init__( + super().__init__( "SignatureDoesNotMatch", "The request signature we calculated does not match the signature you provided. Check your AWS Secret Access Key and signing method. Consult the service documentation for details.", ) @@ -104,7 +104,7 @@ class InvalidClientTokenIdError(RESTError): code = 403 def __init__(self): - super(InvalidClientTokenIdError, self).__init__( + super().__init__( "InvalidClientTokenId", "The security token included in the request is invalid.", ) @@ -114,7 +114,7 @@ class AccessDeniedError(RESTError): code = 403 def __init__(self, user_arn, action): - super(AccessDeniedError, self).__init__( + super().__init__( "AccessDenied", "User: {user_arn} is not authorized to perform: {operation}".format( user_arn=user_arn, operation=action @@ -126,7 +126,7 @@ class AuthFailureError(RESTError): code = 401 def __init__(self): - super(AuthFailureError, self).__init__( + super().__init__( "AuthFailure", "AWS was not able to validate the provided access credentials", ) @@ -136,10 +136,10 @@ class AWSError(Exception): TYPE = None STATUS = 400 - def __init__(self, message, type=None, status=None): + def __init__(self, message, exception_type=None, status=None): self.message = message - self.type = type if type is not None else self.TYPE - self.status = status if status is not None else self.STATUS + self.type = exception_type or self.TYPE + self.status = status or self.STATUS def response(self): return ( @@ -154,7 +154,7 @@ class InvalidNextTokenException(JsonRESTError): code = 400 def __init__(self): - super(InvalidNextTokenException, self).__init__( + super().__init__( "InvalidNextTokenException", "The nextToken provided is invalid" ) @@ -164,4 +164,4 @@ class InvalidToken(AWSError): STATUS = 400 def __init__(self, message="Invalid token"): - super(InvalidToken, self).__init__("Invalid Token: {}".format(message)) + super().__init__("Invalid Token: {}".format(message)) diff --git a/moto/core/models.py b/moto/core/models.py index fb20c0bdd..05dbf57bd 100644 --- a/moto/core/models.py +++ b/moto/core/models.py @@ -289,10 +289,7 @@ responses_mock.add_passthru("http") def _find_first_match_legacy(self, request): - matches = [] - for i, match in enumerate(self._matches): - if match.matches(request): - matches.append(match) + matches = [match for match in self._matches if match.matches(request)] # Look for implemented callbacks first implemented_matches = [ @@ -311,7 +308,7 @@ def _find_first_match_legacy(self, request): def _find_first_match(self, request): matches = [] match_failed_reasons = [] - for i, match in enumerate(self._matches): + for match in self._matches: match_result, reason = match.matches(request) if match_result: matches.append(match) @@ -351,10 +348,10 @@ BOTOCORE_HTTP_METHODS = ["GET", "DELETE", "HEAD", "OPTIONS", "PATCH", "POST", "P class MockRawResponse(BytesIO): - def __init__(self, input): - if isinstance(input, str): - input = input.encode("utf-8") - super(MockRawResponse, self).__init__(input) + def __init__(self, response_input): + if isinstance(response_input, str): + response_input = response_input.encode("utf-8") + super().__init__(response_input) def stream(self, **kwargs): contents = self.read() @@ -553,7 +550,7 @@ class ServerModeMockAWS(BaseMockAWS): if "region_name" in kwargs: return kwargs["region_name"] if type(args) == tuple and len(args) == 2: - service, region = args + _, region = args return region return None @@ -565,7 +562,7 @@ class ServerModeMockAWS(BaseMockAWS): class Model(type): def __new__(self, clsname, bases, namespace): - cls = super(Model, self).__new__(self, clsname, bases, namespace) + cls = super().__new__(self, clsname, bases, namespace) cls.__models__ = {} for name, value in namespace.items(): model = getattr(value, "__returns_model__", False) @@ -679,8 +676,8 @@ class CloudFormationModel(BaseModel): class BaseBackend: def _reset_model_refs(self): # Remove all references to the models stored - for service, models in model_data.items(): - for model_name, model in models.items(): + for models in model_data.values(): + for model in models.values(): model.instances = [] def reset(self): @@ -954,7 +951,7 @@ class MotoAPIBackend(BaseBackend): for name, backends_ in backends.loaded_backends(): if name == "moto_api": continue - for region_name, backend in backends_.items(): + for backend in backends_.values(): backend.reset() self.__init__() diff --git a/moto/core/responses.py b/moto/core/responses.py index 93aa0fee8..0438fe78d 100644 --- a/moto/core/responses.py +++ b/moto/core/responses.py @@ -82,7 +82,7 @@ class _TemplateEnvironmentMixin(object): RIGHT_PATTERN = re.compile(r">[\s\n]+") def __init__(self): - super(_TemplateEnvironmentMixin, self).__init__() + super().__init__() self.loader = DynamicDictLoader({}) self.environment = Environment( loader=self.loader, autoescape=self.should_autoescape @@ -237,7 +237,7 @@ class BaseResponse(_TemplateEnvironmentMixin, ActionAuthenticatorMixin): target = request.headers.get("x-amz-target") or request.headers.get( "X-Amz-Target" ) - service, method = target.split(".") + _, method = target.split(".") input_spec = self.aws_service_spec.input_spec(method) flat = flatten_json_request_body("", decoded, input_spec) for key, value in flat.items(): diff --git a/moto/core/utils.py b/moto/core/utils.py index 535961acf..d50516382 100644 --- a/moto/core/utils.py +++ b/moto/core/utils.py @@ -207,8 +207,8 @@ def rfc_1123_datetime(datetime): return datetime.strftime(RFC1123) -def str_to_rfc_1123_datetime(str): - return datetime.datetime.strptime(str, RFC1123) +def str_to_rfc_1123_datetime(value): + return datetime.datetime.strptime(value, RFC1123) def unix_time(dt=None): @@ -320,7 +320,7 @@ def tags_from_query_string( querystring_dict, prefix="Tag", key_suffix="Key", value_suffix="Value" ): response_values = {} - for key, value in querystring_dict.items(): + for key in querystring_dict.keys(): if key.startswith(prefix) and key.endswith(key_suffix): tag_index = key.replace(prefix + ".", "").replace("." + key_suffix, "") tag_key = querystring_dict.get( @@ -405,11 +405,11 @@ def aws_api_matches(pattern, string): """ # use a negative lookback regex to match stars that are not prefixed with a backslash # and replace all stars not prefixed w/ a backslash with '.*' to take this from "glob" to PCRE syntax - pattern, n = re.subn(r"(?