From 7f6804c4953a18386809f11faf4d86898570debc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20G=C3=A2teau?= Date: Sat, 30 May 2020 00:11:50 +0200 Subject: [PATCH] Fix default values being loaded with wrong encoding on Windows (#1414) Explicitly set the encoding to utf-8 when reading the context file to ensure values are correctly loaded. Co-authored-by: Andrey Shpak --- cookiecutter/generate.py | 2 +- tests/test-generate-context/non_ascii.json | 3 +++ tests/test_generate_context.py | 11 +++++++++++ 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 tests/test-generate-context/non_ascii.json diff --git a/cookiecutter/generate.py b/cookiecutter/generate.py index 37365a496..c526b97db 100644 --- a/cookiecutter/generate.py +++ b/cookiecutter/generate.py @@ -82,7 +82,7 @@ def generate_context( context = OrderedDict([]) try: - with open(context_file) as file_handle: + with open(context_file, encoding='utf-8') as file_handle: obj = json.load(file_handle, object_pairs_hook=OrderedDict) except ValueError as e: # JSON decoding error. Let's throw a new exception that is more diff --git a/tests/test-generate-context/non_ascii.json b/tests/test-generate-context/non_ascii.json new file mode 100644 index 000000000..af0edf631 --- /dev/null +++ b/tests/test-generate-context/non_ascii.json @@ -0,0 +1,3 @@ +{ + "full_name": "éèà" +} diff --git a/tests/test_generate_context.py b/tests/test_generate_context.py index 26e7d4d68..69d014845 100644 --- a/tests/test_generate_context.py +++ b/tests/test_generate_context.py @@ -108,6 +108,17 @@ def test_default_context_replacement_in_generate_context(): assert generated_context == expected_context +def test_generate_context_decodes_non_ascii_chars(): + """Verify `generate_context` correctly decodes non-ascii chars.""" + expected_context = {'non_ascii': OrderedDict([('full_name', 'éèà'),])} + + generated_context = generate.generate_context( + context_file='tests/test-generate-context/non_ascii.json' + ) + + assert generated_context == expected_context + + @pytest.fixture def template_context(): """Fixture. Populates template content for future tests."""