Skip to content

Commit 19569a9

Browse files
authored
Merge pull request #226 from amcmahon-rh/comps-fixup
Populate optional comps.xml unit fields [RHELDST-25995]
2 parents 7b23ce8 + 5803674 commit 19569a9

File tree

4 files changed

+292
-12
lines changed

4 files changed

+292
-12
lines changed

src/pubtools/pulplib/_impl/comps.py

+46-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,34 @@
55
from io import StringIO
66

77

8+
# All optional fields in the pulp-rpm comps.xml units
9+
COMMON_FIELDS = [
10+
"description",
11+
"translated_description",
12+
"display_order",
13+
"translated_name",
14+
"name",
15+
]
16+
UNIT_FIELD_DEFAULTS = {
17+
"package_group": (
18+
{"default": False, "user_visible": False},
19+
[
20+
"default_package_names",
21+
"optional_package_names",
22+
"mandatory_package_names",
23+
"default",
24+
"user_visible",
25+
"langonly",
26+
"conditional_package_names",
27+
]
28+
+ COMMON_FIELDS,
29+
),
30+
"package_category": ({}, ["packagegroupids"] + COMMON_FIELDS),
31+
"package_environment": ({}, ["group_ids", "options"] + COMMON_FIELDS),
32+
"package_langpacks": ({}, ["matches"]),
33+
}
34+
35+
836
class BooleanStringIO(StringIO):
937
"""A StringIO which coerces the output value into a boolean."""
1038

@@ -356,4 +384,21 @@ def units_for_xml(io):
356384
modules.
357385
"""
358386
parser = CompsParser()
359-
return parser.parse(io)
387+
return fill_unit_field_defaults(parser.parse(io))
388+
389+
390+
def fill_unit_field_defaults(units):
391+
"""
392+
Fill in missing comp unit fields with default values.
393+
394+
Arguments:
395+
units (dict)
396+
Parsed comps.xml file.
397+
"""
398+
399+
for unit in units:
400+
defaults, fields = UNIT_FIELD_DEFAULTS[unit["_content_type_id"]]
401+
for field in fields:
402+
unit[field] = unit.get(field, defaults.get(field))
403+
404+
return units

tests/comps/test_comps_parse.py

+121-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import os
44

5-
from pubtools.pulplib._impl.comps import units_for_xml
5+
from pubtools.pulplib._impl.comps import units_for_xml, fill_unit_field_defaults
66

77
# Don't use autoformatting in this file because we use u'' string literals
88
# at least until py2 support is dropped, and black wants to remove them...
@@ -38,6 +38,10 @@ def test_can_parse_units(data_path):
3838
},
3939
"translated_name": {"af": "3D-drukwerk", "bg": u"3D Печатане"},
4040
"user_visible": True,
41+
"optional_package_names": None,
42+
"langonly": None,
43+
"mandatory_package_names": None,
44+
"display_order": None,
4145
}
4246

4347
assert units[1] == {
@@ -53,6 +57,11 @@ def test_can_parse_units(data_path):
5357
"default": False,
5458
"user_visible": True,
5559
"mandatory_package_names": ["abrt-desktop", "gnome-disk-utility"],
60+
"conditional_package_names": None,
61+
"default_package_names": None,
62+
"display_order": None,
63+
"langonly": None,
64+
"optional_package_names": None,
5665
}
5766

5867
assert units[2] == {
@@ -115,6 +124,7 @@ def test_can_parse_units(data_path):
115124
"es": u"Cinnamon proporciona un entorno de escritorio tradicional, con características avanzadas, fácil de usar, potente y flexible.",
116125
},
117126
"display_order": 22,
127+
"description": None,
118128
"group_ids": ["input-methods", "multimedia"],
119129
"options": [{"default": False, "group": "libreoffice"}],
120130
}
@@ -128,3 +138,113 @@ def test_can_parse_units(data_path):
128138
{"install": "tkgate-%s", "name": "tkgate"},
129139
],
130140
}
141+
142+
143+
def test_parse_populates_default_fields(data_path):
144+
"""units_for_xml parses comps.xml data and can populate fields with
145+
default values."""
146+
147+
xml_path = os.path.join(data_path, "sparse-comps.xml")
148+
149+
with open(xml_path, "rb") as f:
150+
units = units_for_xml(f)
151+
152+
assert len(units) == 8
153+
154+
assert units[0] == {"_content_type_id": "package_group", "id": "3d-printing",
155+
"name": "3D Printing",
156+
"translated_name": {"af": "3D-drukwerk", "bg": "3D Печатане"},
157+
"user_visible": True, "default_package_names": None,
158+
"optional_package_names": None, "mandatory_package_names": None,
159+
"default": False, "langonly": None,
160+
"conditional_package_names": None, "description": None,
161+
"translated_description": None, "display_order": None}
162+
assert units[1] == {"_content_type_id": "package_group", "id": "admin-tools",
163+
"name": "Administration Tools",
164+
"translated_name": {"af": "Administrasienutsgoed",
165+
"am": "የአስተዳደሩ መሣሪያዎች"},
166+
"description": "This group is a collection of graphical administration tools for the system, such as for managing user accounts and configuring system hardware.",
167+
"translated_description": {
168+
"sr": "Ова група је скуп графичких системских административних алатки, нпр. за управљање корисничким налозима и подешавање хардвера у систему.",
169+
"sr@Latn": "Ova grupa je skup grafičkih sistemskih administrativnih alatki, npr. za upravljanje korisničkim nalozima i podešavanje hardvera u sistemu."},
170+
"mandatory_package_names": ["abrt-desktop", "gnome-disk-utility"],
171+
"default_package_names": None, "optional_package_names": None,
172+
"default": False, "user_visible": False, "langonly": None,
173+
"conditional_package_names": None, "display_order": None}
174+
assert units[2] == {"_content_type_id": "package_category",
175+
"id": "kde-desktop-environment", "name": "KDE Desktop",
176+
"translated_name": {"af": "KDE-werkskerm", "as": "KDE ডেস্কটপ"},
177+
"packagegroupids": ["kde-office", "kde-telepathy"],
178+
"description": None, "translated_description": None,
179+
"display_order": None}
180+
assert units[3] == {
181+
"_content_type_id": "package_category",
182+
"id": "xfce-desktop-environment",
183+
"name": "Xfce Desktop",
184+
"translated_name": {"uk": u"Графічне середовище Xfce", "zh_CN": u"Xfce 桌面环境"},
185+
"description": "A lightweight desktop environment that works well on low end machines.",
186+
"translated_description": {
187+
"as": u"এটা লঘুভাৰৰ ডেষ্কট'প পৰিবেশ যি নিম্ন বিন্যাসৰ যন্ত্ৰত ভালকৈ কাম কৰি ।",
188+
"ast": u"Un entornu d'escritoriu llixeru que furrula bien en máquines pequeñes.",
189+
},
190+
"display_order": 15,
191+
"packagegroupids": ["xfce-apps", "xfce-desktop"],
192+
}
193+
assert units[4] == {"_content_type_id": "package_environment",
194+
"id": "basic-desktop-environment", "name": "Basic Desktop",
195+
"description": "X Window System with a choice of window manager.",
196+
"translated_description": {
197+
"af": "X Window-stelsel met ’n keuse van vensterbestuurder.",
198+
"bg": "X Window система с избор на мениджър на прозорци."},
199+
"display_order": None,
200+
"group_ids": ["networkmanager-submodules", "standard"],
201+
"options": None, "translated_name": None}
202+
203+
assert units[5] == {"_content_type_id": "package_environment",
204+
"id": "cinnamon-desktop-environment", "name": "Cinnamon Desktop",
205+
"translated_name": {"en_GB": "Cinnamon Desktop",
206+
"fr": "Bureau Cinnamon"},
207+
"translated_description": {
208+
"ca": "Cinnamon proporciona un escriptori amb un disseny tradicional, funcionalitats avançades, facilitat d'ús, potent i flexible.",
209+
"es": "Cinnamon proporciona un entorno de escritorio tradicional, con características avanzadas, fácil de usar, potente y flexible."},
210+
"display_order": 22, "group_ids": ["input-methods", "multimedia"],
211+
"options": [{"group": "libreoffice", "default": False}],
212+
"description": None}
213+
214+
assert units[6] == {"_content_type_id": "package_langpacks",
215+
"matches": [{"install": "stardict-dic-%s", "name": "stardict"},
216+
{"install": "tagainijisho-dic-%s",
217+
"name": "tagainijisho-common"},
218+
{"install": "tesseract-langpack-%s",
219+
"name": "tesseract"},
220+
{"install": "tkgate-%s", "name": "tkgate"}]}
221+
222+
assert units[7] == {"_content_type_id": "package_langpacks", "matches": None}
223+
224+
225+
226+
def test_fill_unit_field_defaults():
227+
"""Missing fields are filled in with expected values."""
228+
units = [{"_content_type_id": "package_group"},
229+
{"_content_type_id": "package_category"},
230+
{"_content_type_id": "package_environment"},
231+
{"_content_type_id": "package_langpacks"}]
232+
expected = [{"_content_type_id": "package_group", "default_package_names": None,
233+
"optional_package_names": None, "mandatory_package_names": None,
234+
"default": False, "user_visible": False, "langonly": None,
235+
"conditional_package_names": None, "description": None,
236+
"translated_description": None, "display_order": None,
237+
"translated_name": None, "name": None},
238+
{"_content_type_id": "package_category", "packagegroupids": None,
239+
"description": None, "translated_description": None,
240+
"display_order": None,
241+
"translated_name": None, "name": None},
242+
{"_content_type_id": "package_environment", "group_ids": None,
243+
"options": None, "description": None,
244+
"translated_description": None,
245+
"display_order": None, "translated_name": None, "name": None},
246+
{"_content_type_id": "package_langpacks", "matches": None}]
247+
248+
units = fill_unit_field_defaults(units)
249+
250+
assert units == expected

tests/data/sparse-comps.xml

+102
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,102 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!DOCTYPE comps
3+
PUBLIC '-//Red Hat, Inc.//DTD Comps info//EN'
4+
'comps.dtd'>
5+
6+
<!--
7+
A comps file for testing.
8+
9+
This was originally copied from sample-comps.xml, but trimmed down to
10+
test field population
11+
-->
12+
13+
<comps>
14+
15+
16+
<group>
17+
<id>3d-printing</id>
18+
<name>3D Printing</name>
19+
<name xml:lang="af">3D-drukwerk</name>
20+
<name xml:lang="bg">3D Печатане</name>
21+
<uservisible>true</uservisible>
22+
</group>
23+
<group>
24+
<id>admin-tools</id>
25+
<name>Administration Tools</name>
26+
<name xml:lang="af">Administrasienutsgoed</name>
27+
<name xml:lang="am">የአስተዳደሩ መሣሪያዎች</name>
28+
<description>This group is a collection of graphical administration tools for the system, such as for managing user accounts and configuring system hardware.</description>
29+
<description xml:lang="sr">Ова група је скуп графичких системских административних алатки, нпр. за управљање корисничким налозима и подешавање хардвера у систему.</description>
30+
<description xml:lang="sr@Latn">Ova grupa je skup grafičkih sistemskih administrativnih alatki, npr. za upravljanje korisničkim nalozima i podešavanje hardvera u sistemu.</description>
31+
<packagelist>
32+
<packagereq type="mandatory">abrt-desktop</packagereq>
33+
<packagereq type="mandatory">gnome-disk-utility</packagereq>
34+
</packagelist>
35+
</group>
36+
37+
38+
<category>
39+
<id>kde-desktop-environment</id>
40+
<name>KDE Desktop</name>
41+
<name xml:lang="af">KDE-werkskerm</name>
42+
<name xml:lang="as">KDE ডেস্কটপ</name>
43+
<grouplist>
44+
<groupid>kde-office</groupid>
45+
<groupid>kde-telepathy</groupid>
46+
</grouplist>
47+
</category>
48+
<category>
49+
<id>xfce-desktop-environment</id>
50+
<name>Xfce Desktop</name>
51+
<name xml:lang="uk">Графічне середовище Xfce</name>
52+
<name xml:lang="zh_CN">Xfce 桌面环境</name>
53+
<description>A lightweight desktop environment that works well on low end machines.</description>
54+
<description xml:lang="as">এটা লঘুভাৰৰ ডেষ্কট'প পৰিবেশ যি নিম্ন বিন্যাসৰ যন্ত্ৰত ভালকৈ কাম কৰি ।</description>
55+
<description xml:lang="ast">Un entornu d'escritoriu llixeru que furrula bien en máquines pequeñes.</description>
56+
<display_order>15</display_order>
57+
<grouplist>
58+
<groupid>xfce-apps</groupid>
59+
<groupid>xfce-desktop</groupid>
60+
</grouplist>
61+
</category>
62+
63+
64+
<environment>
65+
<id>basic-desktop-environment</id>
66+
<name>Basic Desktop</name>
67+
<description>X Window System with a choice of window manager.</description>
68+
<description xml:lang="af">X Window-stelsel met ’n keuse van vensterbestuurder.</description>
69+
<description xml:lang="bg">X Window система с избор на мениджър на прозорци.</description>
70+
<display_order><!-- tweaked: try empty display order --></display_order>
71+
<grouplist>
72+
<groupid>networkmanager-submodules</groupid>
73+
<groupid>standard</groupid>
74+
</grouplist>
75+
</environment>
76+
<environment>
77+
<id>cinnamon-desktop-environment</id>
78+
<name>Cinnamon Desktop</name>
79+
<name xml:lang="en_GB">Cinnamon Desktop</name>
80+
<name xml:lang="fr">Bureau Cinnamon</name>
81+
<description xml:lang="ca">Cinnamon proporciona un escriptori amb un disseny tradicional, funcionalitats avançades, facilitat d'ús, potent i flexible.</description>
82+
<description xml:lang="es">Cinnamon proporciona un entorno de escritorio tradicional, con características avanzadas, fácil de usar, potente y flexible.</description>
83+
<display_order>22</display_order>
84+
<grouplist>
85+
<groupid>input-methods</groupid>
86+
<groupid>multimedia</groupid>
87+
</grouplist>
88+
<optionlist>
89+
<groupid>libreoffice</groupid>
90+
</optionlist>
91+
</environment>
92+
93+
<langpacks>
94+
<match install="stardict-dic-%s" name="stardict"/>
95+
<match install="tagainijisho-dic-%s" name="tagainijisho-common"/>
96+
<match install="tesseract-langpack-%s" name="tesseract"/>
97+
<match install="tkgate-%s" name="tkgate"/>
98+
</langpacks>
99+
<langpacks>
100+
<!-- An empty langpack doesn't really make much sense hey-->
101+
</langpacks>
102+
</comps>

tests/repository/test_upload_comps.py

+23-10
Original file line numberDiff line numberDiff line change
@@ -136,37 +136,50 @@ def test_upload_comps_xml(client, requests_mocker):
136136
imported_units.sort(key=lambda u: u["_content_type_id"])
137137

138138
# Did we import exactly the expected units?
139+
139140
assert imported_units == [
140141
{
141142
"_content_type_id": "package_category",
143+
"description": None,
144+
"display_order": 10,
142145
"id": "kde-desktop-environment",
143146
"name": "KDE Desktop",
144-
"display_order": 10,
145147
"packagegroupids": ["kde-office", "kde-telepathy"],
146148
"repo_id": "repo1",
149+
"translated_description": None,
150+
"translated_name": None,
147151
},
148152
{
149153
"_content_type_id": "package_environment",
150-
"id": "basic-desktop-environment",
151-
"name": "Basic Desktop",
152-
"translated_name": {"af": "Basiese werkskerm"},
153154
"description": "X Window System with a choice of window manager.",
155+
"display_order": None,
154156
"group_ids": ["networkmanager-submodules", "standard"],
157+
"id": "basic-desktop-environment",
158+
"name": "Basic Desktop",
155159
"options": [
156-
{"group": "xmonad", "default": True},
157-
{"group": "xmonad-mate", "default": False},
160+
{"default": True, "group": "xmonad"},
161+
{"default": False, "group": "xmonad-mate"},
158162
],
159163
"repo_id": "repo1",
164+
"translated_description": None,
165+
"translated_name": {"af": "Basiese werkskerm"},
160166
},
161167
{
162168
"_content_type_id": "package_group",
163-
"id": "3d-printing",
164-
"name": "3D Printing",
165-
"translated_name": {"af": "3D-drukwerk"},
166-
"description": "3D printing software",
169+
"conditional_package_names": None,
170+
"default": False,
167171
"default_package_names": ["admesh"],
172+
"description": "3D printing software",
173+
"display_order": None,
174+
"id": "3d-printing",
175+
"langonly": None,
168176
"mandatory_package_names": ["blender"],
177+
"name": "3D Printing",
178+
"optional_package_names": None,
169179
"repo_id": "repo1",
180+
"translated_description": None,
181+
"translated_name": {"af": "3D-drukwerk"},
182+
"user_visible": False,
170183
},
171184
{
172185
"_content_type_id": "package_langpacks",

0 commit comments

Comments
 (0)