diff --git a/pyproject.toml b/pyproject.toml index 4359b833cc..350236ff1b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -10,6 +10,7 @@ select = [ "F", # Pyflakes "PL", # pylint "I", # isort + "TID", # flake8-tidy-imports ] ignore = ["PLR0913", "PLC0415", "PLW1641"] @@ -18,6 +19,9 @@ max-branches = 25 max-returns = 8 max-statements = 80 +[tool.ruff.lint.flake8-tidy-imports] +ban-relative-imports = "all" + [tool.ruff.lint.per-file-ignores] "__init__.py" = ["F401", "E501"] "integration_uri.py" = ["E501"] # ARNs are long. diff --git a/samcli/cli/options.py b/samcli/cli/options.py index ade35adc45..592e8853c9 100644 --- a/samcli/cli/options.py +++ b/samcli/cli/options.py @@ -5,7 +5,7 @@ import click -from .context import Context +from samcli.cli.context import Context def debug_option(f): diff --git a/samcli/commands/bootstrap/__init__.py b/samcli/commands/bootstrap/__init__.py index 4ea37345e2..f6f448a6c1 100644 --- a/samcli/commands/bootstrap/__init__.py +++ b/samcli/commands/bootstrap/__init__.py @@ -3,4 +3,4 @@ """ # Expose the cli object here -from .command import cli # pragma: no cover +from samcli.commands.bootstrap.command import cli # pragma: no cover diff --git a/samcli/commands/init/__init__.py b/samcli/commands/init/__init__.py index 7f72e7f7fd..89b4b89fd2 100644 --- a/samcli/commands/init/__init__.py +++ b/samcli/commands/init/__init__.py @@ -2,4 +2,4 @@ Expose top level cli command for `init` """ -from .command import cli +from samcli.commands.init.command import cli diff --git a/samcli/commands/local/local.py b/samcli/commands/local/local.py index 70f243a21c..fd6fcfbd49 100644 --- a/samcli/commands/local/local.py +++ b/samcli/commands/local/local.py @@ -5,10 +5,10 @@ import click -from .generate_event.cli import cli as generate_event_cli -from .invoke.cli import cli as invoke_cli -from .start_api.cli import cli as start_api_cli -from .start_lambda.cli import cli as start_lambda_cli +from samcli.commands.local.generate_event.cli import cli as generate_event_cli +from samcli.commands.local.invoke.cli import cli as invoke_cli +from samcli.commands.local.start_api.cli import cli as start_api_cli +from samcli.commands.local.start_lambda.cli import cli as start_lambda_cli @click.group() diff --git a/samcli/commands/pipeline/bootstrap/cli.py b/samcli/commands/pipeline/bootstrap/cli.py index 36438b5efc..e5193eec4e 100644 --- a/samcli/commands/pipeline/bootstrap/cli.py +++ b/samcli/commands/pipeline/bootstrap/cli.py @@ -12,6 +12,7 @@ from samcli.cli.main import aws_creds_options, common_options, pass_context, print_cmdline_args from samcli.commands._utils.click_mutex import ClickMutex from samcli.commands._utils.command_exception_handler import command_exception_handler +from samcli.commands.pipeline.bootstrap.guided_context import BITBUCKET, GITHUB_ACTIONS, GITLAB, IAM, OPEN_ID_CONNECT from samcli.commands.pipeline.bootstrap.oidc_config import ( BitbucketOidcConfig, GitHubOidcConfig, @@ -23,8 +24,6 @@ from samcli.lib.telemetry.metric import track_command from samcli.lib.utils.version_checker import check_newer_version -from .guided_context import BITBUCKET, GITHUB_ACTIONS, GITLAB, IAM, OPEN_ID_CONNECT - SHORT_HELP = "Generates the required AWS resources to connect your CI/CD system." HELP_TEXT = """ diff --git a/samcli/commands/pipeline/init/interactive_init_flow.py b/samcli/commands/pipeline/init/interactive_init_flow.py index ce29274c3c..c4a043732c 100644 --- a/samcli/commands/pipeline/init/interactive_init_flow.py +++ b/samcli/commands/pipeline/init/interactive_init_flow.py @@ -18,6 +18,17 @@ AppPipelineTemplateMetadataException, PipelineTemplateCloneException, ) +from samcli.commands.pipeline.bootstrap.cli import ( + PIPELINE_CONFIG_DIR, + PIPELINE_CONFIG_FILENAME, + _get_bootstrap_command_names, +) +from samcli.commands.pipeline.bootstrap.cli import do_cli as do_bootstrap +from samcli.commands.pipeline.init.pipeline_templates_manifest import ( + PipelineTemplateMetadata, + PipelineTemplatesManifest, + Provider, +) from samcli.lib.config.samconfig import SamConfig from samcli.lib.cookiecutter.interactive_flow import InteractiveFlow from samcli.lib.cookiecutter.interactive_flow_creator import InteractiveFlowCreator @@ -27,14 +38,6 @@ from samcli.lib.utils.colors import Colored from samcli.lib.utils.git_repo import CloneRepoException, GitRepo -from ..bootstrap.cli import ( - PIPELINE_CONFIG_DIR, - PIPELINE_CONFIG_FILENAME, - _get_bootstrap_command_names, -) -from ..bootstrap.cli import do_cli as do_bootstrap -from .pipeline_templates_manifest import PipelineTemplateMetadata, PipelineTemplatesManifest, Provider - LOG = logging.getLogger(__name__) shared_path: Path = GlobalConfig().config_dir APP_PIPELINE_TEMPLATES_REPO_URL = "https://github.com/aws/aws-sam-cli-pipeline-init-templates.git" diff --git a/samcli/commands/pipeline/pipeline.py b/samcli/commands/pipeline/pipeline.py index 2d8df4463e..ec0270e90e 100644 --- a/samcli/commands/pipeline/pipeline.py +++ b/samcli/commands/pipeline/pipeline.py @@ -5,8 +5,8 @@ import click -from .bootstrap.cli import cli as bootstrap_cli -from .init.cli import cli as init_cli +from samcli.commands.pipeline.bootstrap.cli import cli as bootstrap_cli +from samcli.commands.pipeline.init.cli import cli as init_cli @click.group() diff --git a/samcli/hook_packages/terraform/__init__.py b/samcli/hook_packages/terraform/__init__.py index e75196dfb6..85147b49a3 100644 --- a/samcli/hook_packages/terraform/__init__.py +++ b/samcli/hook_packages/terraform/__init__.py @@ -2,4 +2,4 @@ Expose top level prepare hook """ -from .main import prepare +from samcli.hook_packages.terraform.main import prepare diff --git a/samcli/hook_packages/terraform/main.py b/samcli/hook_packages/terraform/main.py index e66309abf0..4066b93694 100644 --- a/samcli/hook_packages/terraform/main.py +++ b/samcli/hook_packages/terraform/main.py @@ -2,7 +2,7 @@ Module for Terraform hook entry points """ -from .hooks.prepare.hook import prepare as prepare_hook +from samcli.hook_packages.terraform.hooks.prepare.hook import prepare as prepare_hook def prepare(params: dict) -> dict: diff --git a/samcli/lib/cookiecutter/interactive_flow.py b/samcli/lib/cookiecutter/interactive_flow.py index 67e1256d1c..afab5c2f02 100644 --- a/samcli/lib/cookiecutter/interactive_flow.py +++ b/samcli/lib/cookiecutter/interactive_flow.py @@ -4,8 +4,8 @@ import click -from ..utils.colors import Colored -from .question import Question +from samcli.lib.cookiecutter.question import Question +from samcli.lib.utils.colors import Colored class InteractiveFlow: diff --git a/samcli/lib/cookiecutter/interactive_flow_creator.py b/samcli/lib/cookiecutter/interactive_flow_creator.py index 801a068557..3103384635 100644 --- a/samcli/lib/cookiecutter/interactive_flow_creator.py +++ b/samcli/lib/cookiecutter/interactive_flow_creator.py @@ -5,11 +5,10 @@ import yaml from samcli.commands.exceptions import UserException +from samcli.lib.cookiecutter.interactive_flow import InteractiveFlow +from samcli.lib.cookiecutter.question import Question, QuestionFactory from samcli.yamlhelper import parse_yaml_file -from .interactive_flow import InteractiveFlow -from .question import Question, QuestionFactory - class QuestionsNotFoundException(UserException): pass diff --git a/samcli/lib/cookiecutter/plugin.py b/samcli/lib/cookiecutter/plugin.py index a8a7cb4cad..6043e9c01f 100644 --- a/samcli/lib/cookiecutter/plugin.py +++ b/samcli/lib/cookiecutter/plugin.py @@ -4,8 +4,8 @@ from typing import NamedTuple -from .interactive_flow import InteractiveFlow -from .processor import Processor +from samcli.lib.cookiecutter.interactive_flow import InteractiveFlow +from samcli.lib.cookiecutter.processor import Processor class Plugin(NamedTuple): diff --git a/samcli/lib/cookiecutter/template.py b/samcli/lib/cookiecutter/template.py index 9ff2a279b9..62c2527e7d 100644 --- a/samcli/lib/cookiecutter/template.py +++ b/samcli/lib/cookiecutter/template.py @@ -10,13 +10,17 @@ from cookiecutter.main import cookiecutter from samcli.commands.exceptions import UserException +from samcli.lib.cookiecutter.exceptions import ( + GenerateProjectFailedError, + InvalidLocationError, + PostprocessingError, + PreprocessingError, +) +from samcli.lib.cookiecutter.interactive_flow import InteractiveFlow +from samcli.lib.cookiecutter.plugin import Plugin +from samcli.lib.cookiecutter.processor import Processor from samcli.lib.init.arbitrary_project import generate_non_cookiecutter_project -from .exceptions import GenerateProjectFailedError, InvalidLocationError, PostprocessingError, PreprocessingError -from .interactive_flow import InteractiveFlow -from .plugin import Plugin -from .processor import Processor - LOG = logging.getLogger(__name__) diff --git a/samcli/lib/hook/hook_config.py b/samcli/lib/hook/hook_config.py index 7f53c18411..2663bf4cdf 100644 --- a/samcli/lib/hook/hook_config.py +++ b/samcli/lib/hook/hook_config.py @@ -6,7 +6,7 @@ import jsonschema -from .exceptions import InvalidHookPackageConfigException +from samcli.lib.hook.exceptions import InvalidHookPackageConfigException class HookFunctionality(NamedTuple): diff --git a/samcli/lib/hook/hook_wrapper.py b/samcli/lib/hook/hook_wrapper.py index 87bbdbb31b..7353e627f5 100644 --- a/samcli/lib/hook/hook_wrapper.py +++ b/samcli/lib/hook/hook_wrapper.py @@ -7,11 +7,8 @@ from pathlib import Path from typing import Dict, List, Optional, cast -from .exceptions import ( - HookPackageExecuteFunctionalityException, - InvalidHookWrapperException, -) -from .hook_config import HookPackageConfig +from samcli.lib.hook.exceptions import HookPackageExecuteFunctionalityException, InvalidHookWrapperException +from samcli.lib.hook.hook_config import HookPackageConfig LOG = logging.getLogger(__name__) INTERNAL_PACKAGES_ROOT = Path(__file__).parent / ".." / ".." / "hook_packages" diff --git a/samcli/lib/init/__init__.py b/samcli/lib/init/__init__.py index 241076bc05..922b4fa675 100644 --- a/samcli/lib/init/__init__.py +++ b/samcli/lib/init/__init__.py @@ -12,7 +12,9 @@ from cookiecutter.main import cookiecutter from samcli.lib.config.samconfig import DEFAULT_CONFIG_FILE_EXTENSION, DEFAULT_CONFIG_FILE_NAME +from samcli.lib.init.arbitrary_project import generate_non_cookiecutter_project from samcli.lib.init.default_samconfig import DefaultSamconfig +from samcli.lib.init.exceptions import GenerateProjectFailedError, InvalidLocationError from samcli.lib.init.template_modifiers.application_insights_template_modifier import ( ApplicationInsightsTemplateModifier, ) @@ -23,9 +25,6 @@ from samcli.lib.utils.packagetype import ZIP from samcli.local.common.runtime_template import RUNTIME_DEP_TEMPLATE_MAPPING, is_custom_runtime -from .arbitrary_project import generate_non_cookiecutter_project -from .exceptions import GenerateProjectFailedError, InvalidLocationError - LOG = logging.getLogger(__name__) diff --git a/samcli/lib/init/arbitrary_project.py b/samcli/lib/init/arbitrary_project.py index 321e597665..2780aaec3a 100644 --- a/samcli/lib/init/arbitrary_project.py +++ b/samcli/lib/init/arbitrary_project.py @@ -8,10 +8,9 @@ from cookiecutter import config, exceptions, repository +from samcli.lib.init.exceptions import ArbitraryProjectDownloadFailed from samcli.lib.utils import osutils -from .exceptions import ArbitraryProjectDownloadFailed - LOG = logging.getLogger(__name__) diff --git a/samcli/lib/providers/sam_function_provider.py b/samcli/lib/providers/sam_function_provider.py index 2f578b2055..4892d3c758 100644 --- a/samcli/lib/providers/sam_function_provider.py +++ b/samcli/lib/providers/sam_function_provider.py @@ -10,8 +10,12 @@ from samcli.commands._utils.template import TemplateFailedParsingException from samcli.commands.local.cli_common.user_exceptions import InvalidLayerVersionArn +from samcli.lib.build.constants import DEPRECATED_RUNTIMES from samcli.lib.build.exceptions import MissingFunctionHandlerException from samcli.lib.providers.exceptions import InvalidLayerReference, MissingFunctionNameException +from samcli.lib.providers.provider import Function, LayerVersion, Stack, get_full_path, get_function_build_info +from samcli.lib.providers.sam_base_provider import SamBaseProvider +from samcli.lib.providers.sam_stack_provider import SamLocalStackProvider from samcli.lib.utils.colors import Colored, Colors from samcli.lib.utils.file_observer import FileObserver from samcli.lib.utils.packagetype import IMAGE, ZIP @@ -23,11 +27,6 @@ AWS_SERVERLESS_LAYERVERSION, ) -from ..build.constants import DEPRECATED_RUNTIMES -from .provider import Function, LayerVersion, Stack, get_full_path, get_function_build_info -from .sam_base_provider import SamBaseProvider -from .sam_stack_provider import SamLocalStackProvider - LOG = logging.getLogger(__name__) diff --git a/samcli/lib/providers/sam_layer_provider.py b/samcli/lib/providers/sam_layer_provider.py index ecd642f751..20fffea227 100644 --- a/samcli/lib/providers/sam_layer_provider.py +++ b/samcli/lib/providers/sam_layer_provider.py @@ -5,12 +5,11 @@ import logging from typing import Dict, List, Optional +from samcli.lib.providers.provider import LayerVersion, Stack +from samcli.lib.providers.sam_base_provider import SamBaseProvider +from samcli.lib.providers.sam_stack_provider import SamLocalStackProvider from samcli.lib.utils.resources import AWS_LAMBDA_LAYERVERSION, AWS_SERVERLESS_LAYERVERSION -from .provider import LayerVersion, Stack -from .sam_base_provider import SamBaseProvider -from .sam_stack_provider import SamLocalStackProvider - LOG = logging.getLogger(__name__) diff --git a/samcli/lib/samlib/wrapper.py b/samcli/lib/samlib/wrapper.py index d4c510b5df..9a4f2d69f8 100644 --- a/samcli/lib/samlib/wrapper.py +++ b/samcli/lib/samlib/wrapper.py @@ -26,8 +26,7 @@ from samtranslator.validator.validator import SamTemplateValidator from samcli.commands.validate.lib.exceptions import InvalidSamDocumentException - -from .local_uri_plugin import SupportLocalUriPlugin +from samcli.lib.samlib.local_uri_plugin import SupportLocalUriPlugin class SamTranslatorWrapper: diff --git a/samcli/local/docker/lambda_container.py b/samcli/local/docker/lambda_container.py index 761cca7f1d..6cc2b8ae5d 100644 --- a/samcli/local/docker/lambda_container.py +++ b/samcli/local/docker/lambda_container.py @@ -7,11 +7,10 @@ from typing import List from samcli.lib.utils.packagetype import IMAGE +from samcli.local.docker.container import DEFAULT_CONTAINER_HOST_INTERFACE, Container from samcli.local.docker.exceptions import InvalidRuntimeException from samcli.local.docker.lambda_debug_settings import LambdaDebugSettings - -from .container import DEFAULT_CONTAINER_HOST_INTERFACE, Container -from .lambda_image import LambdaImage, Runtime +from samcli.local.docker.lambda_image import LambdaImage, Runtime LOG = logging.getLogger(__name__) diff --git a/samcli/local/lambda_service/local_lambda_invoke_service.py b/samcli/local/lambda_service/local_lambda_invoke_service.py index ad1b8c4079..d208383b99 100644 --- a/samcli/local/lambda_service/local_lambda_invoke_service.py +++ b/samcli/local/lambda_service/local_lambda_invoke_service.py @@ -11,11 +11,10 @@ from samcli.lib.utils.name_utils import InvalidFunctionNameException, normalize_sam_function_identifier from samcli.lib.utils.stream_writer import StreamWriter from samcli.local.docker.exceptions import DockerContainerCreationFailedException +from samcli.local.lambda_service.lambda_error_responses import LambdaErrorResponses from samcli.local.lambdafn.exceptions import FunctionNotFound from samcli.local.services.base_local_service import BaseLocalService, LambdaOutputParser -from .lambda_error_responses import LambdaErrorResponses - LOG = logging.getLogger(__name__) diff --git a/samcli/local/lambdafn/config.py b/samcli/local/lambdafn/config.py index 1d940aed2d..7c845a02cc 100644 --- a/samcli/local/lambdafn/config.py +++ b/samcli/local/lambdafn/config.py @@ -3,8 +3,7 @@ """ from samcli.commands.local.cli_common.user_exceptions import InvalidSamTemplateException - -from .env_vars import EnvironmentVariables +from samcli.local.lambdafn.env_vars import EnvironmentVariables class FunctionConfig: diff --git a/samcli/local/lambdafn/runtime.py b/samcli/local/lambdafn/runtime.py index 3bfca43cfd..757c10d309 100644 --- a/samcli/local/lambdafn/runtime.py +++ b/samcli/local/lambdafn/runtime.py @@ -11,17 +11,16 @@ import threading from typing import Dict, Optional, Union +from samcli.lib.providers.provider import LayerVersion from samcli.lib.telemetry.metric import capture_parameter from samcli.lib.utils.file_observer import LambdaFunctionObserver from samcli.lib.utils.packagetype import ZIP +from samcli.lib.utils.stream_writer import StreamWriter from samcli.local.docker.container import Container, ContainerContext from samcli.local.docker.container_analyzer import ContainerAnalyzer from samcli.local.docker.exceptions import ContainerFailureError, DockerContainerCreationFailedException from samcli.local.docker.lambda_container import LambdaContainer - -from ...lib.providers.provider import LayerVersion -from ...lib.utils.stream_writer import StreamWriter -from .zip import unzip +from samcli.local.lambdafn.zip import unzip LOG = logging.getLogger(__name__) diff --git a/samcli/vendor/serverlessrepo/__init__.py b/samcli/vendor/serverlessrepo/__init__.py index 074bf641cf..1ed1afae2f 100644 --- a/samcli/vendor/serverlessrepo/__init__.py +++ b/samcli/vendor/serverlessrepo/__init__.py @@ -1,5 +1,3 @@ """Common library for AWS Serverless Application Repository.""" -from .publish import ( # noqa: F401 - publish_application, -) +from samcli.vendor.serverlessrepo.publish import publish_application diff --git a/samcli/vendor/serverlessrepo/application_metadata.py b/samcli/vendor/serverlessrepo/application_metadata.py index 75dc63e290..35a9fa3037 100644 --- a/samcli/vendor/serverlessrepo/application_metadata.py +++ b/samcli/vendor/serverlessrepo/application_metadata.py @@ -1,6 +1,6 @@ """Module containing class to store SAR application metadata.""" -from .exceptions import InvalidApplicationMetadataError +from samcli.vendor.serverlessrepo.exceptions import InvalidApplicationMetadataError class ApplicationMetadata(object): diff --git a/samcli/vendor/serverlessrepo/parser.py b/samcli/vendor/serverlessrepo/parser.py index df33326f3a..759716cb8c 100644 --- a/samcli/vendor/serverlessrepo/parser.py +++ b/samcli/vendor/serverlessrepo/parser.py @@ -7,11 +7,10 @@ import yaml +from samcli.vendor.serverlessrepo.application_metadata import ApplicationMetadata +from samcli.vendor.serverlessrepo.exceptions import ApplicationMetadataNotFoundError from samcli.yamlhelper import intrinsics_multi_constructor -from .application_metadata import ApplicationMetadata -from .exceptions import ApplicationMetadataNotFoundError - METADATA = "Metadata" SERVERLESS_REPO_APPLICATION = "AWS::ServerlessRepo::Application" APPLICATION_ID_PATTERN = r"arn:[\w\-]+:serverlessrepo:[\w\-]+:[0-9]+:applications\/[\S]+" diff --git a/samcli/vendor/serverlessrepo/publish.py b/samcli/vendor/serverlessrepo/publish.py index 603755bce7..f81c312944 100644 --- a/samcli/vendor/serverlessrepo/publish.py +++ b/samcli/vendor/serverlessrepo/publish.py @@ -7,17 +7,21 @@ import boto3 from botocore.exceptions import ClientError -from samcli.yamlhelper import yaml_dump - -from .application_metadata import ApplicationMetadata -from .exceptions import ( +from samcli.vendor.serverlessrepo.application_metadata import ApplicationMetadata +from samcli.vendor.serverlessrepo.exceptions import ( DuplicateSemanticVersionError, InvalidS3UriError, MissingSemanticVersionError, S3PermissionsRequired, ServerlessRepoClientError, ) -from .parser import get_app_metadata, parse_application_id, parse_template, strip_app_metadata +from samcli.vendor.serverlessrepo.parser import ( + get_app_metadata, + parse_application_id, + parse_template, + strip_app_metadata, +) +from samcli.yamlhelper import yaml_dump LOG = logging.getLogger(__name__)