Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: add 3.11 to classifiers and upgrade Docker #5225

Merged
merged 12 commits into from
Jun 2, 2023
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ lint:
# Linter performs static analysis to catch latent bugs
ruff samcli
# mypy performs type check
mypy --no-incremental setup.py samcli tests
mypy --exclude /testdata/ --exclude /init/templates/ --no-incremental setup.py samcli tests

# Command to run everytime you make changes to verify everything works
dev: lint test
Expand Down
2 changes: 1 addition & 1 deletion mypy.ini
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ warn_return_any=True
warn_unused_configs=True
no_implicit_optional=True
warn_redundant_casts=True
warn_unused_ignores=True
warn_unused_ignores=False # @jfuss Done as a stop gap since different py versions have different errors
warn_unreachable=True

#
Expand Down
10 changes: 5 additions & 5 deletions requirements/base.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@ click~=8.0
Flask<2.3
#Need to add Schemas latest SDK.
boto3>=1.19.5,==1.*
jmespath~=0.10.0
ruamel_yaml==0.17.21
jmespath~=1.0.1
ruamel_yaml~=0.17.21
PyYAML>=5.4.1,==5.*
cookiecutter~=2.1.1
aws-sam-translator==1.68.0
#docker minor version updates can include breaking changes. Auto update micro version only.
docker~=4.2.0
docker~=6.1.0
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Integ tests seem to be passing.

dateparser~=1.1
requests==2.31.0
requests~=2.31.0
serverlessrepo==0.1.10
aws_lambda_builders==1.32.0
tomlkit==0.11.8
watchdog==2.1.2
rich~=13.3.3
pyopenssl==23.0.0
pyopenssl~=23.0.0

# Needed for supporting Protocol in Python 3.7, Protocol class became public with python3.8
typing_extensions~=4.4.0
Expand Down
14 changes: 11 additions & 3 deletions requirements/dev.txt
Original file line number Diff line number Diff line change
@@ -1,22 +1,30 @@
-r pre-dev.txt

coverage==5.3
coverage==7.2.7
pytest-cov==4.0.0


# type checking and related stubs
# mypy adds new rules in new minor versions, which could cause our PR check to fail
# here we fix its version and upgrade it manually in the future
mypy==0.790
mypy==1.3.0
boto3-stubs[apigateway,cloudformation,ecr,iam,lambda,s3,schemas,secretsmanager,signer,stepfunctions,sts,xray]==1.26.131
types-pywin32==306.0.0.0
types-PyYAML==6.0.12
types-chevron==0.14.2.4
types-psutil==5.9.5.12
types-setuptools==65.4.0.0
types-Pygments==2.15.0.1
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

thanks for adding the others!

types-colorama==0.4.15.11
types-dateparser==1.1.4.9
types-docutils==0.20.0.1
types-jsonschema==4.17.0.8
types-pyOpenSSL==23.2.0.0
types-requests==2.31.0.1
types-urllib3==1.26.25.13

# Test requirements
pytest==7.2.2
pytest~=7.2.2
parameterized==0.9.0
pytest-xdist==3.2.0
pytest-forked==1.6.0
Expand Down
2 changes: 1 addition & 1 deletion samcli/cli/global_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ def get_value(
self,
config_entry: ConfigEntry,
default: Optional[T] = None,
value_type: Type[T] = T,
value_type: Type[T] = T, # type: ignore
is_flag: bool = False,
reload_config: bool = False,
) -> Optional[T]:
Expand Down
14 changes: 3 additions & 11 deletions samcli/cli/hidden_imports.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,31 +2,23 @@
Keeps list of hidden/dynamic imports that is being used in SAM CLI, so that pyinstaller can include these packages
"""
import pkgutil
from typing import cast
from types import ModuleType

from typing_extensions import Protocol


class HasPathAndName(Protocol):
__path__: str
__name__: str


def walk_modules(module: HasPathAndName, visited: set) -> None:
def walk_modules(module: ModuleType, visited: set) -> None:
"""Recursively find all modules from a parent module"""
for pkg in pkgutil.walk_packages(module.__path__, module.__name__ + "."):
if pkg.name in visited:
continue
visited.add(pkg.name)
if pkg.ispkg:
submodule = __import__(pkg.name)
submodule = cast(HasPathAndName, submodule)
submodule = submodule
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we just remove this line?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done

walk_modules(submodule, visited)


samcli_modules = set(["samcli"])
samcli = __import__("samcli")
samcli = cast(HasPathAndName, samcli)
walk_modules(samcli, samcli_modules)

SAM_CLI_HIDDEN_IMPORTS = list(samcli_modules) + [
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ def _link_using_terraform_config(self, source_tf_resource: TFResource, cfn_resou
return

for cfn_resource in cfn_resources:
self._resource_pair.cfn_resource_update_call_back_function(cfn_resource, dest_resources) # type: ignore
self._resource_pair.cfn_resource_update_call_back_function(cfn_resource, dest_resources)

def _link_using_linking_fields(self, cfn_resource: Dict) -> None:
"""
Expand Down Expand Up @@ -298,7 +298,7 @@ def _link_using_linking_fields(self, cfn_resource: Dict) -> None:
return

LOG.debug("The value of the source resource linking field after mapping %s", dest_resources)
self._resource_pair.cfn_resource_update_call_back_function(cfn_resource, dest_resources) # type: ignore
self._resource_pair.cfn_resource_update_call_back_function(cfn_resource, dest_resources)

def _process_resolved_resources(
self,
Expand Down
2 changes: 1 addition & 1 deletion samcli/hook_packages/terraform/lib/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def _calculate_configuration_attribute_value_hash(
else:
sorted_references_list = sorted(
configuration_attribute_value,
key=lambda x: x.value if isinstance(x, ConstantValue) else f"{x.module_address}.{x.value}", # type: ignore
key=lambda x: x.value if isinstance(x, ConstantValue) else f"{x.module_address}.{x.value}",
)
for ref in sorted_references_list:
md5.update(
Expand Down
2 changes: 1 addition & 1 deletion samcli/lib/build/workflows.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from typing import List

CONFIG = namedtuple(
"Capability",
"CONFIG",
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

is this right?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I could ignore them but mypy complains. This is the "name-match" error mypy throws.

[
"language",
"dependency_manager",
Expand Down
2 changes: 1 addition & 1 deletion samcli/lib/deploy/deployer.py
Original file line number Diff line number Diff line change
Expand Up @@ -624,7 +624,7 @@ def sync(
msg = ""

if exists:
kwargs["DisableRollback"] = disable_rollback
kwargs["DisableRollback"] = disable_rollback # type: ignore

result = self.update_stack(**kwargs)
self.wait_for_execute(stack_name, "UPDATE", disable_rollback, on_failure=on_failure)
Expand Down
2 changes: 1 addition & 1 deletion samcli/lib/hook/hook_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from pathlib import Path
from typing import Dict, NamedTuple, Optional, cast

import jsonschema # type: ignore
import jsonschema

from .exceptions import InvalidHookPackageConfigException

Expand Down
6 changes: 3 additions & 3 deletions samcli/lib/iac/cdk/cdk_iac.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,13 @@ class CdkIacImplementation(IaCPluginInterface):
the CDK project type
"""

def read_project(self, lookup_paths: List[LookupPath]) -> SamCliProject:
def read_project(self, lookup_paths: List[LookupPath]) -> SamCliProject: # type: ignore
pass

def write_project(self, project: SamCliProject, build_dir: str) -> bool:
def write_project(self, project: SamCliProject, build_dir: str) -> bool: # type: ignore
pass

def update_packaged_locations(self, stack: Stack) -> bool:
def update_packaged_locations(self, stack: Stack) -> bool: # type: ignore
pass

@staticmethod
Expand Down
5 changes: 2 additions & 3 deletions samcli/lib/iac/cfn/cfn_iac.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
"""
Provide a CFN implementation of IaCPluginInterface
"""

import logging
import os
from typing import List, Optional
Expand Down Expand Up @@ -72,11 +71,11 @@ def read_project(self, lookup_paths: List[LookupPath]) -> SamCliProject:
stack = self._build_stack(self._template_file)
return SamCliProject([stack])

def write_project(self, project: SamCliProject, build_dir: str) -> bool:
def write_project(self, project: SamCliProject, build_dir: str) -> bool: # type: ignore
# TODO
pass

def update_packaged_locations(self, stack: Stack) -> bool:
def update_packaged_locations(self, stack: Stack) -> bool: # type: ignore
# TODO
pass

Expand Down
4 changes: 2 additions & 2 deletions samcli/lib/pipeline/bootstrap/stage.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
import click
import requests
from botocore.exceptions import ClientError
from OpenSSL import SSL, crypto # type: ignore
from OpenSSL import SSL, crypto

from samcli.commands.pipeline.bootstrap.guided_context import BITBUCKET, GITHUB_ACTIONS, GITLAB, OPEN_ID_CONNECT
from samcli.commands.pipeline.bootstrap.pipeline_oidc_provider import PipelineOidcProvider
Expand Down Expand Up @@ -222,7 +222,7 @@ def generate_thumbprint(oidc_provider_url: Optional[str]) -> Optional[str]:
# If we attempt to get the cert chain without exchanging some traffic it will be empty
c.sendall(str.encode("HEAD / HTTP/1.0\n\n"))
peerCertChain = c.get_peer_cert_chain()
cert = peerCertChain[-1]
cert = peerCertChain[-1] # type: ignore

# Dump the certificate in DER/ASN1 format so that its SHA1 hash can be computed
dumped_cert = crypto.dump_certificate(crypto.FILETYPE_ASN1, cert)
Expand Down
6 changes: 4 additions & 2 deletions samcli/lib/providers/provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -463,9 +463,11 @@ def binary_media_types(self) -> List[str]:
return list(self.binary_media_types_set)


_CorsTuple = namedtuple("Cors", ["allow_origin", "allow_methods", "allow_headers", "allow_credentials", "max_age"])
_CorsTuple = namedtuple(
"_CorsTuple", ["allow_origin", "allow_methods", "allow_headers", "allow_credentials", "max_age"]
)

_CorsTuple.__new__.__defaults__ = ( # type: ignore
_CorsTuple.__new__.__defaults__ = (
None, # Allow Origin defaults to None
None, # Allow Methods is optional and defaults to empty
None, # Allow Headers is optional and defaults to empty
Expand Down
2 changes: 1 addition & 1 deletion samcli/lib/utils/lock_distributor.py
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ def __init__(
self._manager = manager
self._dict_lock = self._create_new_lock()
self._locks = (
self._manager.dict()
self._manager.dict() # type: ignore
if self._lock_type == LockDistributorType.PROCESS and self._manager is not None
else dict()
)
Expand Down
3 changes: 0 additions & 3 deletions samcli/local/docker/container.py
Original file line number Diff line number Diff line change
Expand Up @@ -206,9 +206,6 @@ def create(self):
# Ex: 128m => 128MB
kwargs["mem_limit"] = "{}m".format(self._memory_limit_mb)

if self.network_id == "host":
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removing this as this never worked anyways.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we add a help text or note. along with a pinned issue for this?

kwargs["network_mode"] = self.network_id

real_container = self.docker_client.containers.create(self._image, **kwargs)
self.id = real_container.id

Expand Down
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ def read_version():
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.11",
"Topic :: Internet",
"Topic :: Software Development :: Build Tools",
"Topic :: Utilities",
Expand Down
6 changes: 3 additions & 3 deletions tests/integration/logs/test_logs_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import logging
import time
from pathlib import Path
from typing import List, Optional, Tuple
from typing import Any, Dict, List, Optional, Tuple

import boto3
import pytest
Expand Down Expand Up @@ -30,7 +30,7 @@ class LogsIntegTestCases(LogsIntegBase):
test_template_folder = ""

stack_name = ""
stack_resources = {}
stack_resources: Dict[Any, Any] = {}
stack_info = None

def setUp(self):
Expand Down Expand Up @@ -76,7 +76,7 @@ def _get_physical_id(self, resource_path: str):
return self.stack_resources[resource_path]

def _get_output_value(self, key: str):
for output in self.stack_info.outputs:
for output in self.stack_info.outputs: # type: ignore
if output.get("OutputKey", "") == key:
return output.get("OutputValue", "")

Expand Down
4 changes: 2 additions & 2 deletions tests/integration/traces/test_traces_command.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import itertools
import time
from pathlib import Path
from typing import List
from typing import Any, List
from unittest import skipIf

import boto3
Expand Down Expand Up @@ -32,7 +32,7 @@
@skipIf(SKIP_TRACES_TESTS, "Skip traces tests in CI/CD only")
@pytest.mark.xdist_group(name="sam_traces")
class TestTracesCommand(TracesIntegBase):
stack_resources = []
stack_resources: List[Any] = []
stack_name = ""

def setUp(self):
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/commands/deploy/test_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ def setUp(self):
def tearDown(self):
self.companion_stack_manager_patch.stop()

@patch("os.environ", {**os.environ, "SAM_CLI_POLL_DELAY": 10})
@patch("os.environ", {**os.environ, "SAM_CLI_POLL_DELAY": 10}) # type: ignore
@patch("samcli.commands.package.command.click")
@patch("samcli.commands.package.package_context.PackageContext")
@patch("samcli.commands.deploy.command.click")
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/commands/sync/test_command.py
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ def setUp(self):
(False, False, False, False, True, InfraSyncResult(True)),
]
)
@patch("os.environ", {**os.environ, "SAM_CLI_POLL_DELAY": 10})
@patch("os.environ", {**os.environ, "SAM_CLI_POLL_DELAY": 10}) # type: ignore
@patch("samcli.commands.sync.command.click")
@patch("samcli.commands.sync.command.execute_code_sync")
@patch("samcli.commands.build.command.click")
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/commands/validate/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
from samcli.commands.validate.lib.exceptions import InvalidSamDocumentException
from samcli.commands.validate.validate import do_cli, _read_sam_file, _lint

ctx_mock = namedtuple("ctx", ["profile", "region"])
ctx_lint_mock = namedtuple("ctx", ["debug", "region"])
ctx_mock = namedtuple("ctx_mock", ["profile", "region"])
ctx_lint_mock = namedtuple("ctx_lint_mock", ["debug", "region"])


class TestValidateCli(TestCase):
Expand Down
3 changes: 1 addition & 2 deletions tests/unit/lib/build_module/test_app_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -1418,8 +1418,7 @@ def setUp(self):
def test_must_write_absolute_path_for_different_drives(self):
def mock_new(cls, *args, **kwargs):
cls = WindowsPath
self = cls._from_parts(args, init=False)
self._init()
self = cls._from_parts(args)
return self

def mock_resolve(self):
Expand Down
4 changes: 2 additions & 2 deletions tests/unit/lib/deploy/test_deployer.py
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ def test_wait_for_changeset(self):
self.deployer._client.get_waiter = MagicMock(return_value=MockChangesetWaiter())
self.deployer.wait_for_changeset("test-id", "test-stack")

@patch("os.environ", {**os.environ, "SAM_CLI_POLL_DELAY": 10})
@patch("os.environ", {**os.environ, "SAM_CLI_POLL_DELAY": 10}) # type: ignore
def test_wait_for_changeset_client_sleep(self):
deployer = Deployer(MagicMock().client("cloudformation"), client_sleep=os.getenv("SAM_CLI_POLL_DELAY", 0.5))
deployer._client.get_waiter = MagicMock(return_value=MockChangesetWaiter())
Expand All @@ -358,7 +358,7 @@ def test_wait_for_changeset_default_delay(self):
ChangeSetName="test-id", StackName="test-stack", WaiterConfig={"Delay": 0.5}
)

@patch("os.environ", {**os.environ, "SAM_CLI_POLL_DELAY": 10})
@patch("os.environ", {**os.environ, "SAM_CLI_POLL_DELAY": 10}) # type: ignore
def test_wait_for_changeset_custom_delay(self):
deployer = Deployer(MagicMock().client("cloudformation"), client_sleep=os.getenv("SAM_CLI_POLL_DELAY"))
deployer.wait_for_changeset("test-id", "test-stack")
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/lib/pipeline/bootstrap/test_environment.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from unittest import TestCase
from unittest.mock import Mock, patch, call, MagicMock

import OpenSSL.SSL # type: ignore
import OpenSSL.SSL
import requests

from samcli.commands.pipeline.bootstrap.guided_context import GITHUB_ACTIONS
Expand Down
2 changes: 1 addition & 1 deletion tests/unit/local/apigw/test_lambda_authorizer.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ def test_valid_header_identity_source(self):
[
({"headers": Headers({})},), # test empty headers
({},), # test no headers
({"headers": Headers({"not here": 123})},), # test missing headers
({"headers": Headers({"not here": 123})},), # type: ignore # test missing headers
({"validation_expression": "^123$"},), # test no headers, but provided validation
]
)
Expand Down
Loading