From 2cddb093f5b245474514c2137684d67a37fde1e7 Mon Sep 17 00:00:00 2001 From: Toshio Kuratomi Date: Thu, 2 Apr 2015 12:37:02 -0700 Subject: [PATCH] Add AnsibleList for keeping track of line numbers in lists parsed from yaml --- v2/ansible/parsing/yaml/constructor.py | 11 ++++++++++- v2/ansible/parsing/yaml/objects.py | 4 ++++ v2/test/parsing/yaml/test_loader.py | 18 +++++++++++++----- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/v2/ansible/parsing/yaml/constructor.py b/v2/ansible/parsing/yaml/constructor.py index aed2553c05b..97f9c71ef8b 100644 --- a/v2/ansible/parsing/yaml/constructor.py +++ b/v2/ansible/parsing/yaml/constructor.py @@ -20,7 +20,7 @@ from __future__ import (absolute_import, division, print_function) __metaclass__ = type from yaml.constructor import Constructor -from ansible.parsing.yaml.objects import AnsibleMapping, AnsibleUnicode +from ansible.parsing.yaml.objects import AnsibleMapping, AnsibleSequence, AnsibleUnicode class AnsibleConstructor(Constructor): def __init__(self, file_name=None): @@ -50,6 +50,12 @@ class AnsibleConstructor(Constructor): return ret + def construct_yaml_seq(self, node): + data = AnsibleSequence() + yield data + data.extend(self.construct_sequence(node)) + data.ansible_pos = self._node_position_info(node) + def _node_position_info(self, node): # the line number where the previous token has ended (plus empty lines) column = node.start_mark.column + 1 @@ -79,3 +85,6 @@ AnsibleConstructor.add_constructor( u'tag:yaml.org,2002:python/unicode', AnsibleConstructor.construct_yaml_str) +AnsibleConstructor.add_constructor( + u'tag:yaml.org,2002:seq', + AnsibleConstructor.construct_yaml_seq) diff --git a/v2/ansible/parsing/yaml/objects.py b/v2/ansible/parsing/yaml/objects.py index 15850dd4f87..fe37eaab94a 100644 --- a/v2/ansible/parsing/yaml/objects.py +++ b/v2/ansible/parsing/yaml/objects.py @@ -50,3 +50,7 @@ class AnsibleMapping(AnsibleBaseYAMLObject, dict): class AnsibleUnicode(AnsibleBaseYAMLObject, unicode): ''' sub class for unicode objects ''' pass + +class AnsibleSequence(AnsibleBaseYAMLObject, list): + ''' sub class for lists ''' + pass diff --git a/v2/test/parsing/yaml/test_loader.py b/v2/test/parsing/yaml/test_loader.py index f9144fb2925..4c569626100 100644 --- a/v2/test/parsing/yaml/test_loader.py +++ b/v2/test/parsing/yaml/test_loader.py @@ -95,7 +95,11 @@ class TestAnsibleLoaderBasic(unittest.TestCase): self.assertEqual(data, [u'a', u'b']) self.assertEqual(len(data), 2) self.assertIsInstance(data[0], unicode) - # No line/column info saved yet + + self.assertEqual(data.ansible_pos, ('myfile.yml', 2, 17)) + + self.assertEqual(data[0].ansible_pos, ('myfile.yml', 2, 19)) + self.assertEqual(data[1].ansible_pos, ('myfile.yml', 3, 19)) class TestAnsibleLoaderPlay(unittest.TestCase): @@ -184,12 +188,17 @@ class TestAnsibleLoaderPlay(unittest.TestCase): self.assertEqual(self.data[0][u'vars'][u'string'].ansible_pos, (self.play_filename, 5, 29)) self.assertEqual(self.data[0][u'vars'][u'utf8_string'].ansible_pos, (self.play_filename, 6, 34)) + self.assertEqual(self.data[0][u'vars'][u'dictionary'].ansible_pos, (self.play_filename, 8, 23)) self.assertEqual(self.data[0][u'vars'][u'dictionary'][u'webster'].ansible_pos, (self.play_filename, 8, 32)) self.assertEqual(self.data[0][u'vars'][u'dictionary'][u'oed'].ansible_pos, (self.play_filename, 9, 28)) - # Lists don't yet have line/col information - #self.assertEqual(self.data[0][u'vars'][u'list'].ansible_pos, (self.play_filename, 10, 21)) + self.assertEqual(self.data[0][u'vars'][u'list'].ansible_pos, (self.play_filename, 11, 23)) + self.assertEqual(self.data[0][u'vars'][u'list'][0].ansible_pos, (self.play_filename, 11, 25)) + self.assertEqual(self.data[0][u'vars'][u'list'][1].ansible_pos, (self.play_filename, 12, 25)) + # Numbers don't have line/col info yet + #self.assertEqual(self.data[0][u'vars'][u'list'][2].ansible_pos, (self.play_filename, 13, 25)) + #self.assertEqual(self.data[0][u'vars'][u'list'][3].ansible_pos, (self.play_filename, 14, 25)) def check_tasks(self): # @@ -224,7 +233,6 @@ class TestAnsibleLoaderPlay(unittest.TestCase): self.check_vars() - # Lists don't yet have line/col info - #self.assertEqual(self.data[0][u'tasks'].ansible_pos, (self.play_filename, 17, 28)) + self.assertEqual(self.data[0][u'tasks'].ansible_pos, (self.play_filename, 16, 21)) self.check_tasks()