mirror of
				https://github.com/docker/compose.git
				synced 2025-10-26 16:53:53 +01:00 
			
		
		
		
	Fix unicode errors in interpolation / serialization
Signed-off-by: Joffrey F <joffrey@docker.com>
This commit is contained in:
		
							parent
							
								
									1b39817172
								
							
						
					
					
						commit
						39d535c1f5
					
				| @ -137,6 +137,8 @@ class TemplateWithDefaults(Template): | |||||||
| 
 | 
 | ||||||
|             if named is not None: |             if named is not None: | ||||||
|                 val = mapping[named] |                 val = mapping[named] | ||||||
|  |                 if isinstance(val, six.binary_type): | ||||||
|  |                     val = val.decode('utf-8') | ||||||
|                 return '%s' % (val,) |                 return '%s' % (val,) | ||||||
|             if mo.group('escaped') is not None: |             if mo.group('escaped') is not None: | ||||||
|                 return self.delimiter |                 return self.delimiter | ||||||
|  | |||||||
| @ -27,6 +27,9 @@ def serialize_string(dumper, data): | |||||||
|     """ Ensure boolean-like strings are quoted in the output and escape $ characters """ |     """ Ensure boolean-like strings are quoted in the output and escape $ characters """ | ||||||
|     representer = dumper.represent_str if six.PY3 else dumper.represent_unicode |     representer = dumper.represent_str if six.PY3 else dumper.represent_unicode | ||||||
| 
 | 
 | ||||||
|  |     if isinstance(data, six.binary_type): | ||||||
|  |         data = data.decode('utf-8') | ||||||
|  | 
 | ||||||
|     data = data.replace('$', '$$') |     data = data.replace('$', '$$') | ||||||
| 
 | 
 | ||||||
|     if data.lower() in ('y', 'n', 'yes', 'no', 'on', 'off', 'true', 'false'): |     if data.lower() in ('y', 'n', 'yes', 'no', 'on', 'off', 'true', 'false'): | ||||||
| @ -90,7 +93,8 @@ def serialize_config(config, image_digests=None): | |||||||
|         denormalize_config(config, image_digests), |         denormalize_config(config, image_digests), | ||||||
|         default_flow_style=False, |         default_flow_style=False, | ||||||
|         indent=2, |         indent=2, | ||||||
|         width=80 |         width=80, | ||||||
|  |         allow_unicode=True | ||||||
|     ) |     ) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -4750,3 +4750,20 @@ class SerializeTest(unittest.TestCase): | |||||||
|         assert serialized_service['environment']['CURRENCY'] == '$$' |         assert serialized_service['environment']['CURRENCY'] == '$$' | ||||||
|         assert serialized_service['command'] == 'echo $$FOO' |         assert serialized_service['command'] == 'echo $$FOO' | ||||||
|         assert serialized_service['entrypoint'][0] == '$$SHELL' |         assert serialized_service['entrypoint'][0] == '$$SHELL' | ||||||
|  | 
 | ||||||
|  |     def test_serialize_unicode_values(self): | ||||||
|  |         cfg = { | ||||||
|  |             'version': '2.3', | ||||||
|  |             'services': { | ||||||
|  |                 'web': { | ||||||
|  |                     'image': 'busybox', | ||||||
|  |                     'command': 'echo 十六夜 咲夜' | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         config_dict = config.load(build_config_details(cfg)) | ||||||
|  | 
 | ||||||
|  |         serialized_config = yaml.load(serialize_config(config_dict)) | ||||||
|  |         serialized_service = serialized_config['services']['web'] | ||||||
|  |         assert serialized_service['command'] == 'echo 十六夜 咲夜' | ||||||
|  | |||||||
| @ -1,3 +1,5 @@ | |||||||
|  | # encoding: utf-8 | ||||||
|  | 
 | ||||||
| from __future__ import absolute_import | from __future__ import absolute_import | ||||||
| from __future__ import unicode_literals | from __future__ import unicode_literals | ||||||
| 
 | 
 | ||||||
| @ -401,3 +403,14 @@ def test_interpolate_mixed_separators(defaults_interpolator): | |||||||
| def test_unbraced_separators(defaults_interpolator): | def test_unbraced_separators(defaults_interpolator): | ||||||
|     assert defaults_interpolator("ok $FOO:-bar") == "ok first:-bar" |     assert defaults_interpolator("ok $FOO:-bar") == "ok first:-bar" | ||||||
|     assert defaults_interpolator("ok $BAZ?error") == "ok ?error" |     assert defaults_interpolator("ok $BAZ?error") == "ok ?error" | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | def test_interpolate_unicode_values(): | ||||||
|  |     variable_mapping = { | ||||||
|  |         'FOO': '十六夜 咲夜'.encode('utf-8'), | ||||||
|  |         'BAR': '十六夜 咲夜' | ||||||
|  |     } | ||||||
|  |     interpol = Interpolator(TemplateWithDefaults, variable_mapping).interpolate | ||||||
|  | 
 | ||||||
|  |     interpol("$FOO") == '十六夜 咲夜' | ||||||
|  |     interpol("${BAR}") == '十六夜 咲夜' | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user