OLD | NEW |
1 # -*- encoding: utf-8 -*- | 1 # -*- encoding: utf-8 -*- |
2 | 2 |
3 import json | 3 import json |
4 | 4 |
5 import yaml | 5 import yaml |
6 | 6 |
7 from juju.errors import JujuError | 7 from juju.errors import JujuError |
8 from juju.lib.testing import TestCase | 8 from juju.lib.testing import TestCase |
9 from juju.lib.format import ( | 9 from juju.lib.format import ( |
10 PythonFormat, YAMLFormat, is_valid_charm_format, get_charm_formatter, | 10 PythonFormat, YAMLFormat, is_valid_charm_format, get_charm_formatter, |
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
216 self.assert_format(True, "true") | 216 self.assert_format(True, "true") |
217 self.assert_format(0.0, "0.0") | 217 self.assert_format(0.0, "0.0") |
218 self.assert_format(3.14159, "3.14159") | 218 self.assert_format(3.14159, "3.14159") |
219 self.assert_format(6.02214178e23, "6.02214178e+23") | 219 self.assert_format(6.02214178e23, "6.02214178e+23") |
220 self.assert_format(0, "0") | 220 self.assert_format(0, "0") |
221 self.assert_format(42, "42") | 221 self.assert_format(42, "42") |
222 | 222 |
223 def assert_parse(self, data): | 223 def assert_parse(self, data): |
224 """Verify input parses as expected, including from a data file""" | 224 """Verify input parses as expected, including from a data file""" |
225 formatter = YAMLFormat() | 225 formatter = YAMLFormat() |
226 formatted = formatter.format(data) | 226 formatted = formatter.format_raw(data) |
227 data_file = self.makeFile(formatted) | 227 data_file = self.makeFile(formatted) |
228 kvs = ["formatted=%s" % formatted, | 228 kvs = ["formatted=%s" % formatted, |
229 "file=@%s" % data_file] | 229 "file=@%s" % data_file] |
230 parsed = formatter.parse_keyvalue_pairs(kvs) | 230 parsed = formatter.parse_keyvalue_pairs(kvs) |
231 self.assertEqual(parsed["formatted"], data) | 231 self.assertEqual(parsed["formatted"], data) |
232 self.assertEqual(parsed["file"], data) | 232 self.assertEqual(parsed["file"], data) |
233 | 233 |
234 def test_parse_keyvalue_pairs(self): | 234 def test_parse_keyvalue_pairs(self): |
235 """Verify key value pairs parse for a wide range of YAML inputs.""" | 235 """Verify key value pairs parse for a wide range of YAML inputs.""" |
236 formatter = YAMLFormat() | 236 formatter = YAMLFormat() |
237 self.assert_parse(None) | |
238 self.assert_parse("") | 237 self.assert_parse("") |
239 self.assert_parse("A string") | 238 self.assert_parse("A string") |
240 self.assert_parse("High bytes: \xCA\xFE") | 239 self.assert_parse("High bytes: \xCA\xFE") |
241 self.assert_parse(u"") | |
242 self.assert_parse(u"A unicode string (but really ascii)") | |
243 self.assert_parse(u"中文") | |
244 self.assert_parse({}) | |
245 self.assert_parse( | |
246 {u"public-address": u"ec2-1-2-3-4.compute-1.amazonaws.com", | |
247 u"foo": u"bar", | |
248 u"configured": True}) | |
249 self.assert_parse([]) | |
250 self.assert_parse(["abc", "xyz", 42, True]) | |
251 self.assert_parse(False) | |
252 self.assert_parse(True) | |
253 self.assert_parse(0.0) | |
254 self.assert_parse(3.14159) | |
255 self.assert_parse(6.02214178e23) | |
256 self.assert_parse(0) | |
257 self.assert_parse(42) | |
258 | 240 |
259 # Raises an error if no such file | 241 # Raises an error if no such file |
260 e = self.assertRaises( | 242 e = self.assertRaises( |
261 JujuError, | 243 JujuError, |
262 formatter.parse_keyvalue_pairs, ["content=@missing"]) | 244 formatter.parse_keyvalue_pairs, ["content=@missing"]) |
263 self.assertEquals( | 245 self.assertEquals( |
264 str(e), | 246 str(e), |
265 "No such file or directory: missing (argument:content)") | 247 "No such file or directory: missing (argument:content)") |
266 | 248 |
267 # Raises an error if not of the form K=V or K= | 249 # Raises an error if not of the form K=V or K= |
268 e = self.assertRaises( | 250 e = self.assertRaises( |
269 JujuError, | 251 JujuError, |
270 formatter.parse_keyvalue_pairs, ["foobar"]) | 252 formatter.parse_keyvalue_pairs, ["foobar"]) |
271 self.assertEquals( | 253 self.assertEquals( |
272 str(e), "Expected `option=value`. Found `foobar`") | 254 str(e), "Expected `option=value`. Found `foobar`") |
273 | 255 |
274 # Raises an error if the value is invalid YAML | |
275 e = self.assertRaises( | |
276 JujuError, | |
277 formatter.parse_keyvalue_pairs, ["content=\xCA\FE"]) | |
278 self.assertEquals( | |
279 str(e), | |
280 "Invalid YAML value (argument:content)") | |
281 | |
282 def assert_dump_load(self, data, expected): | 256 def assert_dump_load(self, data, expected): |
283 """Asserts expected formatting and roundtrip through dump/load""" | 257 """Asserts expected formatting and roundtrip through dump/load""" |
284 formatter = YAMLFormat() | 258 formatter = YAMLFormat() |
285 dumped = formatter.dump({"data": data}) | 259 dumped = formatter.dump({"data": data}) |
286 loaded = formatter.load(dumped)["data"] | 260 loaded = formatter.load(dumped)["data"] |
287 self.assertEqual(dumped, expected) | 261 self.assertEqual(dumped, expected) |
288 self.assertEqual(data, loaded) | 262 self.assertEqual(data, loaded) |
289 if isinstance(data, str): | 263 if isinstance(data, str): |
290 # Verify that no promotion to unicode occurs for str values | 264 # Verify that no promotion to unicode occurs for str values |
291 self.assertInstance(loaded, str) | 265 self.assertInstance(loaded, str) |
(...skipping 21 matching lines...) Expand all Loading... |
313 " public-address: ec2-1-2-3-4.compute-1.amazonaws.com")) | 287 " public-address: ec2-1-2-3-4.compute-1.amazonaws.com")) |
314 self.assert_dump_load(False, "data: false") | 288 self.assert_dump_load(False, "data: false") |
315 self.assert_dump_load(True, "data: true") | 289 self.assert_dump_load(True, "data: true") |
316 self.assert_dump_load(0.0, "data: 0.0") | 290 self.assert_dump_load(0.0, "data: 0.0") |
317 self.assert_dump_load(3.14159, "data: 3.14159") | 291 self.assert_dump_load(3.14159, "data: 3.14159") |
318 self.assert_dump_load(6.02214178e23, "data: 6.02214178e+23") | 292 self.assert_dump_load(6.02214178e23, "data: 6.02214178e+23") |
319 self.assert_dump_load(0, "data: 0") | 293 self.assert_dump_load(0, "data: 0") |
320 self.assert_dump_load(42, "data: 42") | 294 self.assert_dump_load(42, "data: 42") |
321 | 295 |
322 def test_should_delete(self): | 296 def test_should_delete(self): |
323 """Verify only `None` values (as YAML loaded) indicate deletion""" | 297 """Verify empty or whitespace only strings indicate deletion""" |
324 formatter = YAMLFormat() | 298 formatter = PythonFormat() |
325 self.assertFalse(formatter.should_delete("0")) | 299 self.assertFalse(formatter.should_delete("0")) |
326 self.assertFalse(formatter.should_delete("something")) | 300 self.assertFalse(formatter.should_delete("something")) |
327 self.assertFalse(formatter.should_delete("")) | 301 self.assertTrue(formatter.should_delete("")) |
328 self.assertFalse(formatter.should_delete(" ")) | 302 self.assertTrue(formatter.should_delete(" ")) |
329 self.assertFalse(formatter.should_delete(0)) | 303 |
330 self.assertTrue(formatter.should_delete(None)) | 304 # Verify that format: 1 can only work with str values |
| 305 e = self.assertRaises(AttributeError, formatter.should_delete, 42) |
| 306 self.assertEqual(str(e), "'int' object has no attribute 'strip'") |
| 307 e = self.assertRaises(AttributeError, formatter.should_delete, None) |
| 308 self.assertEqual(str(e), "'NoneType' object has no attribute 'strip'") |
OLD | NEW |