add special word '+value' to add_children/set_children in xml module (#8437)
Some checks failed
EOL CI / EOL Sanity (Ⓐ2.15) (push) Has been cancelled
EOL CI / EOL Units (Ⓐ2.15+py2.7) (push) Has been cancelled
EOL CI / EOL Units (Ⓐ2.15+py3.10) (push) Has been cancelled
EOL CI / EOL Units (Ⓐ2.15+py3.5) (push) Has been cancelled
EOL CI / EOL I (Ⓐ2.15+alpine3+py:azp/posix/1/) (push) Has been cancelled
EOL CI / EOL I (Ⓐ2.15+alpine3+py:azp/posix/2/) (push) Has been cancelled
EOL CI / EOL I (Ⓐ2.15+alpine3+py:azp/posix/3/) (push) Has been cancelled
EOL CI / EOL I (Ⓐ2.15+fedora37+py:azp/posix/1/) (push) Has been cancelled
EOL CI / EOL I (Ⓐ2.15+fedora37+py:azp/posix/2/) (push) Has been cancelled
EOL CI / EOL I (Ⓐ2.15+fedora37+py:azp/posix/3/) (push) Has been cancelled
nox / Run extra sanity tests (push) Has been cancelled

* add special word '_value' to add_children/set_children in xml module

* changelog fragment added

* Update changelogs/fragments/8437-xml-children-value.yml

Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>

* rebase

* add integration test

* fix result file of integration test

---------

Co-authored-by: z1kk0 <anamleev@phoenixit.ru>
Co-authored-by: Alexei Znamensky <103110+russoz@users.noreply.github.com>
This commit is contained in:
z1kk0 2025-05-31 17:42:24 +03:00 committed by GitHub
parent 0dc1d9045b
commit 3a1ad01b1b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 88 additions and 1 deletions

View file

@ -0,0 +1,2 @@
minor_changes:
- xml - support adding value of children when creating with subnodes (https://github.com/ansible-collections/community.general/pull/8437).

View file

@ -301,6 +301,8 @@ EXAMPLES = r"""
# Attributes # Attributes
name: Scumm bar name: Scumm bar
location: Monkey island location: Monkey island
# Value
+value: unreal
# Subnodes # Subnodes
_: _:
- floor: Pirate hall - floor: Pirate hall
@ -756,6 +758,7 @@ def child_to_element(module, child, in_type):
(key, value) = next(iteritems(child)) (key, value) = next(iteritems(child))
if isinstance(value, MutableMapping): if isinstance(value, MutableMapping):
children = value.pop('_', None) children = value.pop('_', None)
child_value = value.pop('+value', None)
node = etree.Element(key, value) node = etree.Element(key, value)
@ -765,6 +768,9 @@ def child_to_element(module, child, in_type):
subnodes = children_to_nodes(module, children) subnodes = children_to_nodes(module, children)
node.extend(subnodes) node.extend(subnodes)
if child_value is not None:
node.text = child_value
else: else:
node = etree.Element(key) node = etree.Element(key)
node.text = value node.text = value

View file

@ -0,0 +1,11 @@
<?xml version='1.0' encoding='UTF-8'?>
<business type="bar">
<name>Tasty Beverage Co.</name>
<beers>
<beer alcohol="0.5" name="90 Minute IPA">2</beer><beer alcohol="0.3" name="Harvest Pumpkin Ale">5</beer></beers>
<rating subjective="true">10</rating>
<website>
<mobilefriendly/>
<address>http://tastybeverageco.com</address>
</website>
</business>

View file

@ -0,0 +1,3 @@
GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
SPDX-License-Identifier: GPL-3.0-or-later
SPDX-FileCopyrightText: Ansible Project

View file

@ -62,6 +62,7 @@
- include_tasks: test-set-attribute-value.yml - include_tasks: test-set-attribute-value.yml
- include_tasks: test-set-children-elements.yml - include_tasks: test-set-children-elements.yml
- include_tasks: test-set-children-elements-level.yml - include_tasks: test-set-children-elements-level.yml
- include_tasks: test-set-children-elements-value.yml
- include_tasks: test-set-element-value.yml - include_tasks: test-set-element-value.yml
- include_tasks: test-set-element-value-empty.yml - include_tasks: test-set-element-value-empty.yml
- include_tasks: test-pretty-print.yml - include_tasks: test-pretty-print.yml

View file

@ -0,0 +1,64 @@
---
# Copyright (c) Ansible Project
# GNU General Public License v3.0+ (see LICENSES/GPL-3.0-or-later.txt or https://www.gnu.org/licenses/gpl-3.0.txt)
# SPDX-License-Identifier: GPL-3.0-or-later
- name: Setup test fixture
copy:
src: fixtures/ansible-xml-beers.xml
dest: /tmp/ansible-xml-beers.xml
- name: Set child elements
xml:
path: /tmp/ansible-xml-beers.xml
xpath: /business/beers
set_children: &children
- beer:
alcohol: "0.5"
name: 90 Minute IPA
+value: "2"
- beer:
alcohol: "0.3"
name: Harvest Pumpkin Ale
+value: "5"
register: set_children_elements_value
- name: Add trailing newline
shell: echo "" >> /tmp/ansible-xml-beers.xml
- name: Compare to expected result
copy:
src: results/test-set-children-elements-value.xml
dest: /tmp/ansible-xml-beers.xml
check_mode: true
diff: true
register: comparison
- name: Test expected result
assert:
that:
- set_children_elements_value is changed
- comparison is not changed # identical
- name: Set child elements (again)
xml:
path: /tmp/ansible-xml-beers.xml
xpath: /business/beers
set_children: *children
register: set_children_again
- name: Compare to expected result
copy:
src: results/test-set-children-elements-value.xml
dest: /tmp/ansible-xml-beers.xml
check_mode: true
diff: true
register: comparison
- name: Test expected result
assert:
that:
- set_children_again is not changed
- comparison is not changed # identical