diff --git a/setup.py b/setup.py index 99af9091e005..00328b898313 100644 --- a/setup.py +++ b/setup.py @@ -16,7 +16,7 @@ def read(*parts): def find_version(*file_paths): version_file = read(*file_paths) - version_match = re.search(r"^__version__ = ['\"]([^'\"]*)['\"]", + version_match = re.search(r"^__version__\s*=\s*['\"]([^'\"]*)['\"]", version_file, re.M) if version_match: return version_match.group(1) @@ -81,8 +81,8 @@ def find_version(*file_paths): 'optimize': 0, 'skip_archive': True, 'dll_excludes': ['crypt32.dll'], - 'packages': ['docutils', 'urllib', 'httplib', 'HTMLParser', - 'awscli', 'ConfigParser', 'xml.etree', 'pipes'], + 'packages': ['docutils', 'urllib', 'http.client', 'html.parser', + 'awscli', 'configparser', 'xml.etree', 'pipes'], } } setup_options['console'] = ['bin/aws'] diff --git a/tests/__init__.py b/tests/__init__.py index 4bfba60a8499..7ebed6c74c06 100644 --- a/tests/__init__.py +++ b/tests/__init__.py @@ -277,7 +277,7 @@ def __ne__(self, other): return not self.__eq__(other) -# CaseInsensitiveDict from requests that must be serializble. +# CaseInsensitiveDict from requests that must be serializable. class CaseInsensitiveDict(collections_abc.MutableMapping): def __init__(self, data=None, **kwargs): self._store = dict() @@ -320,7 +320,7 @@ def __eq__(self, other): # Copy is required def copy(self): - return CaseInsensitiveDict(self._store.values()) + return CaseInsensitiveDict(dict(self._store.values())) def __repr__(self): return str(dict(self.items())) diff --git a/tests/unit/test_setup.py b/tests/unit/test_setup.py new file mode 100644 index 000000000000..6c61f0100928 --- /dev/null +++ b/tests/unit/test_setup.py @@ -0,0 +1,68 @@ +import importlib.util +import sys +from pathlib import Path +from unittest import mock + + +def load_setup_module(argv=None): + setup_path = Path(__file__).parents[2] / "setup.py" + spec = importlib.util.spec_from_file_location( + "awscli_setup", + setup_path, + ) + module = importlib.util.module_from_spec(spec) + + if argv is None: + argv = ["setup.py"] + + with ( + mock.patch.object(sys, "argv", argv), + mock.patch.dict(sys.modules, {"py2exe": mock.Mock()}), + mock.patch("setuptools.setup"), + ): + spec.loader.exec_module(module) + + return module + + +class TestFindVersion: + def test_finds_version_without_spaces_around_equals(self): + setup_module = load_setup_module() + + with mock.patch.object( + setup_module, + "read", + return_value="__version__='1.2.3'", + ): + assert setup_module.find_version( + "awscli", + "__init__.py", + ) == "1.2.3" + + def test_finds_version_with_multiple_spaces_around_equals(self): + setup_module = load_setup_module() + + with mock.patch.object( + setup_module, + "read", + return_value="__version__ = '1.2.3'", + ): + assert setup_module.find_version( + "awscli", + "__init__.py", + ) == "1.2.3" + + +class TestPy2ExeOptions: + def test_uses_python3_package_names(self): + setup_module = load_setup_module(["setup.py", "py2exe"]) + + packages = setup_module.setup_options["options"]["py2exe"]["packages"] + + assert "http.client" in packages + assert "html.parser" in packages + assert "configparser" in packages + + assert "httplib" not in packages + assert "HTMLParser" not in packages + assert "ConfigParser" not in packages \ No newline at end of file diff --git a/tests/unit/test_tests_init.py b/tests/unit/test_tests_init.py new file mode 100644 index 000000000000..83a403463005 --- /dev/null +++ b/tests/unit/test_tests_init.py @@ -0,0 +1,19 @@ +from tests import CaseInsensitiveDict + + +class TestCaseInsensitiveDict: + def test_copy_returns_independent_dictionary(self): + original = CaseInsensitiveDict({ + "Content-Type": "application/json", + "X-Test": "value", + }) + + copied = original.copy() + + assert copied == original + assert copied is not original + + copied["X-Test"] = "changed" + + assert original["X-Test"] == "value" + assert copied["X-Test"] == "changed" \ No newline at end of file