2727from galaxy .tool_util .verify .asserts ._types import AssertionParameter as AssertionParameterAnnotation
2828from galaxy .util .commands import shell
2929
30- models_path = os .path .join (os .path .dirname (__file__ ), "assertion_models .py" )
30+ models_path = os .path .join (os .path .dirname (__file__ ), ".." , ".." , "tool_util_models" , "assertions .py" )
3131galaxy_xsd_path = os .path .join (os .path .dirname (__file__ ), ".." , "xsd" , "galaxy.xsd" )
3232
3333Children = Literal ["allowed" , "required" , "forbidden" ]
@@ -114,17 +114,19 @@ def check_non_negative_if_int(v: typing.Any):
114114
115115class base_{{assertion.name}}_model(AssertionModel):
116116 '''base model for {{assertion.name}} describing attributes.'''
117+ model_config = ConfigDict(extra="forbid", title="base_{{assertion.name}}_model")
117118{% for parameter in assertion.parameters %}
118119{% if not parameter.is_deprecated %}
119120 {{ parameter.name }}: {{ parameter.type_str }} = Field(
120121 {{ parameter.field_default_str }},
122+ title="{{ parameter.title }}",
121123 description={{ assertion.name }}_{{ parameter.name }}_description,
122124 )
123125{% endif %}
124126{% endfor %}
125127{% if assertion.children in ["required", "allowed"] %}
126- children: typing.Optional["assertion_list"] = None
127- asserts: typing.Optional["assertion_list"] = None
128+ children: typing.Optional["assertion_list"] = Field( None, title="Children")
129+ asserts: typing.Optional["assertion_list"] = Field( None, title="Asserts")
128130
129131{% if assertion.children == "required" %}
130132 @model_validator(mode='before')
@@ -139,17 +141,19 @@ def validate_children(self, data: typing.Any):
139141
140142class base_{{assertion.name}}_model_relaxed(AssertionModel):
141143 '''base model for {{assertion.name}} describing attributes.'''
144+ model_config = ConfigDict(extra="forbid", title="base_{{assertion.name}}_model_relaxed")
142145{% for parameter in assertion.parameters %}
143146{% if not parameter.is_deprecated %}
144147 {{ parameter.name }}: {{ parameter.lax_type_str }} = Field(
145148 {{ parameter.field_default_str }},
149+ title="{{ parameter.title }}",
146150 description={{ assertion.name }}_{{ parameter.name }}_description,
147151 )
148152{% endif %}
149153{% endfor %}
150154{% if assertion.children in ["required", "allowed"] %}
151- children: typing.Optional["assertion_list"] = None
152- asserts: typing.Optional["assertion_list"] = None
155+ children: typing.Optional["assertion_list"] = Field( None, title="Children")
156+ asserts: typing.Optional["assertion_list"] = Field( None, title="Asserts")
153157
154158{% if assertion.children == "required" %}
155159 @model_validator(mode='before')
@@ -164,15 +168,18 @@ def validate_children(self, data: typing.Any):
164168
165169class {{assertion.name}}_model(base_{{assertion.name}}_model):
166170 r\" \" \" {{ assertion.docstring }}\" \" \"
167- that: Literal["{{assertion.name}}"] = "{{assertion.name}}"
171+ model_config = ConfigDict(extra="forbid", title="{{ assertion.title }}")
172+ that: Literal["{{assertion.name}}"] = Field("{{assertion.name}}", title="That")
168173
169174class {{assertion.name}}_model_nested(AssertionModel):
170175 r\" \" \" Nested version of this assertion model.\" \" \"
171- {{assertion.name}}: base_{{assertion.name}}_model
176+ model_config = ConfigDict(extra="forbid", title="{{ assertion.title }} (Nested)")
177+ {{assertion.name}}: base_{{assertion.name}}_model = Field(..., title="{{ assertion.title }}")
172178
173179class {{assertion.name}}_model_relaxed(base_{{assertion.name}}_model_relaxed):
174180 r\" \" \" {{ assertion.docstring }}\" \" \"
175- that: Literal["{{assertion.name}}"] = "{{assertion.name}}"
181+ model_config = ConfigDict(extra="forbid", title="{{ assertion.title }} (Relaxed)")
182+ that: Literal["{{assertion.name}}"] = Field("{{assertion.name}}", title="That")
176183{% endfor %}
177184
178185any_assertion_model_flat = Annotated[typing.Union[
@@ -193,15 +200,19 @@ class {{assertion.name}}_model_relaxed(base_{{assertion.name}}_model_relaxed):
193200{% endfor %}
194201], Field(discriminator="that")]
195202
196- assertion_list = RootModel[typing.List[typing.Union[any_assertion_model_flat, any_assertion_model_nested]]]
203+ class assertion_list(RootModel[typing.List[typing.Union[any_assertion_model_flat, any_assertion_model_nested]]]):
204+ model_config = ConfigDict(title="assertion_list")
205+
197206
198207# used to model what the XML conversion should look like - not meant to be consumed outside of
199208# of Galaxy internals / linting.
200- relaxed_assertion_list = RootModel[typing.List[any_assertion_model_flat_relaxed]]
209+ class relaxed_assertion_list(RootModel[typing.List[any_assertion_model_flat_relaxed]]):
210+ model_config = ConfigDict(title="relaxed_assertion_list")
201211
202212class assertion_dict(AssertionModel):
213+ model_config = ConfigDict(extra="forbid", title="assertion_dict")
203214{% for assertion in assertions %}
204- {{assertion.name}}: typing.Optional[base_{{assertion.name}}_model] = None
215+ {{assertion.name}}: typing.Optional[base_{{assertion.name}}_model] = Field( None, title="{{ assertion.title }}")
205216{% endfor %}
206217
207218
@@ -338,6 +349,10 @@ def __init__(self, name: str, type: str, default_value):
338349 self .type = type
339350 self .default_value = default_value
340351
352+ @property
353+ def title (self ) -> str :
354+ return " " .join (w .capitalize () for w in self .name .split ("_" ))
355+
341356 @property
342357 def description (self ) -> str :
343358 type = self .type
@@ -490,6 +505,10 @@ def __init__(
490505 self .children = children
491506 self .module_and_function = module_and_function
492507
508+ @property
509+ def title (self ) -> str :
510+ return "Assert " + " " .join (w .capitalize () for w in self .name .split ("_" ))
511+
493512
494513def arg_parser () -> argparse .ArgumentParser :
495514 parser = argparse .ArgumentParser (description = DESCRIPTION )
0 commit comments