diff --git a/client/src/api/schema/schema.ts b/client/src/api/schema/schema.ts index 30706ea28737..3ebe345f4861 100644 --- a/client/src/api/schema/schema.ts +++ b/client/src/api/schema/schema.ts @@ -24816,7 +24816,7 @@ export interface components { help?: components["schemas"]["HelpContent"] | null; /** * id - * @description Unique identifier for the tool. Should be all lower-case and should not include whitespace. + * @description Unique identifier for the tool. Lowercase, must start with a letter, may contain letters, digits, '_' and '-'. * @example my-cool-tool */ id?: string | null; @@ -24915,7 +24915,7 @@ export interface components { help?: components["schemas"]["HelpContent"] | null; /** * id - * @description Unique identifier for the tool. Should be all lower-case and should not include whitespace. + * @description Unique identifier for the tool. Lowercase, must start with a letter, may contain letters, digits, '_' and '-'. * @example my-cool-tool */ id?: string | null; @@ -26622,7 +26622,7 @@ export interface components { help?: components["schemas"]["HelpContent"] | null; /** * id - * @description Unique identifier for the tool. Should be all lower-case and should not include whitespace. + * @description Unique identifier for the tool. Lowercase, must start with a letter, may contain letters, digits, '_' and '-'. * @example my-cool-tool */ id?: string | null; diff --git a/client/src/components/Tool/ToolSourceSchema.json b/client/src/components/Tool/ToolSourceSchema.json index 8425811fe2df..44a845bafafd 100644 --- a/client/src/components/Tool/ToolSourceSchema.json +++ b/client/src/components/Tool/ToolSourceSchema.json @@ -1 +1 @@ -{"$defs": {"Citation": {"properties": {"type": {"title": "type", "type": "string"}, "content": {"title": "content", "type": "string"}}, "required": ["type", "content"], "title": "Citation", "type": "object"}, "CollectionAttributes": {"additionalProperties": false, "properties": {"collection_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "collection_type"}}, "title": "CollectionAttributes", "type": "object"}, "Container": {"properties": {"type": {"enum": ["docker", "singularity"], "title": "type", "type": "string"}, "container_id": {"title": "container_id", "type": "string"}}, "required": ["type", "container_id"], "title": "Container", "type": "object"}, "ContainerRequirement": {"properties": {"type": {"const": "container", "title": "type", "type": "string"}, "container": {"$ref": "#/$defs/Container", "title": "container"}}, "required": ["type", "container"], "title": "ContainerRequirement", "type": "object"}, "EmptyFieldParameterValidatorModel": {"additionalProperties": false, "properties": {"type": {"const": "empty_field", "default": "empty_field", "title": "Type", "type": "string"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Message"}, "implicit": {"default": false, "title": "Implicit", "type": "boolean"}, "negate": {"default": false, "title": "Negate", "type": "boolean"}}, "title": "EmptyFieldParameterValidatorModel", "type": "object"}, "FilePatternDatasetCollectionDescription": {"properties": {"discover_via": {"const": "pattern", "title": "discover_via", "type": "string"}, "format": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "format"}, "visible": {"title": "visible", "type": "boolean"}, "assign_primary_output": {"title": "assign_primary_output", "type": "boolean"}, "directory": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "directory"}, "recurse": {"title": "recurse", "type": "boolean"}, "match_relative_path": {"title": "match_relative_path", "type": "boolean"}, "sort_key": {"enum": ["filename", "name", "designation", "dbkey"], "title": "sort_key", "type": "string"}, "sort_comp": {"enum": ["lexical", "numeric"], "title": "sort_comp", "type": "string"}, "sort_reverse": {"default": false, "title": "sort_reverse", "type": "boolean"}, "pattern": {"title": "pattern", "type": "string"}}, "required": ["discover_via", "format", "visible", "assign_primary_output", "directory", "recurse", "match_relative_path", "sort_key", "sort_comp", "pattern"], "title": "FilePatternDatasetCollectionDescription", "type": "object"}, "HelpContent": {"properties": {"format": {"enum": ["restructuredtext", "plain_text", "markdown"], "title": "format", "type": "string"}, "content": {"title": "content", "type": "string"}}, "required": ["format", "content"], "title": "HelpContent", "type": "object"}, "InRangeParameterValidatorModel": {"additionalProperties": false, "properties": {"type": {"const": "in_range", "default": "in_range", "title": "Type", "type": "string"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Message"}, "implicit": {"default": false, "title": "Implicit", "type": "boolean"}, "min": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "Min"}, "max": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "Max"}, "exclude_min": {"default": false, "title": "Exclude Min", "type": "boolean"}, "exclude_max": {"default": false, "title": "Exclude Max", "type": "boolean"}, "negate": {"default": false, "title": "Negate", "type": "boolean"}}, "title": "InRangeParameterValidatorModel", "type": "object"}, "IncomingToolOutputCollection": {"properties": {"name": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Parameter name. Used when referencing parameter in workflows.", "title": "name"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Output label. Will be used as dataset name in history.", "title": "label"}, "hidden": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "description": "If true, the output will not be shown in the history.", "title": "hidden"}, "type": {"const": "collection", "title": "type", "type": "string"}, "structure": {"$ref": "#/$defs/ToolOutputCollectionStructure", "title": "structure"}}, "required": ["type", "structure"], "title": "IncomingToolOutputCollection", "type": "object"}, "IncomingToolOutputDataset": {"properties": {"name": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Parameter name. Used when referencing parameter in workflows.", "title": "name"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Output label. Will be used as dataset name in history.", "title": "label"}, "hidden": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "description": "If true, the output will not be shown in the history.", "title": "hidden"}, "type": {"const": "data", "title": "type", "type": "string"}, "format": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "The short name for the output datatype.", "title": "format"}, "format_source": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "This sets the data type of the output dataset(s) to be the same format as that of the specified tool input.", "title": "format_source"}, "metadata_source": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "This copies the metadata information from the tool\u2019s input dataset to serve as default for information that cannot be detected from the output. One prominent use case is interval data with a non-standard column order that cannot be deduced from a header line, but which is known to be identical in the input and output datasets.", "title": "metadata_source"}, "discover_datasets": {"anyOf": [{"items": {"anyOf": [{"$ref": "#/$defs/FilePatternDatasetCollectionDescription"}, {"$ref": "#/$defs/ToolProvidedMetadataDatasetCollection"}]}, "type": "array"}, {"type": "null"}], "default": null, "title": "discover_datasets"}, "from_work_dir": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Relative path to a file produced by the tool in its working directory. Output\u2019s contents are set to this file\u2019s contents.", "title": "from_work_dir"}, "precreate_directory": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "precreate_directory"}}, "required": ["type"], "title": "IncomingToolOutputDataset", "type": "object"}, "JavascriptRequirement": {"properties": {"type": {"const": "javascript", "title": "type", "type": "string"}, "expression_lib": {"anyOf": [{"items": {"description": "Provide Javascript/ECMAScript 5.1 code here that will be available for expressions inside the `shell_command` field.", "examples": ["function pickValue() {\n if (inputs.conditional_parameter.test_parameter == \"a\") {\n return inputs.conditional_parameter.integer_parameter\n } else {\n return inputs.conditional_parameter.boolean_parameter\n }\n}"], "title": "expression_lib", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "expression_lib"}}, "required": ["type", "expression_lib"], "title": "JavascriptRequirement", "type": "object"}, "LengthParameterValidatorModel": {"additionalProperties": false, "properties": {"type": {"const": "length", "default": "length", "title": "Type", "type": "string"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Message"}, "implicit": {"default": false, "title": "Implicit", "type": "boolean"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Max"}, "negate": {"default": false, "title": "Negate", "type": "boolean"}}, "title": "LengthParameterValidatorModel", "type": "object"}, "NoOptionsParameterValidatorModel": {"additionalProperties": false, "properties": {"type": {"const": "no_options", "default": "no_options", "title": "Type", "type": "string"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Message"}, "implicit": {"default": false, "title": "Implicit", "type": "boolean"}, "negate": {"default": false, "title": "Negate", "type": "boolean"}}, "title": "NoOptionsParameterValidatorModel", "type": "object"}, "OutputCompareType": {"enum": ["diff", "re_match", "sim_size", "re_match_multiline", "contains", "image_diff"], "title": "OutputCompareType", "type": "string"}, "RegexParameterValidatorModel": {"additionalProperties": false, "description": "Check if a regular expression **matches** the value, i.e. appears\nat the beginning of the value. To enforce a match of the complete value use\n``$`` at the end of the expression. The expression is given is the content\nof the validator tag. Note that for ``selects`` each option is checked\nseparately.", "properties": {"type": {"const": "regex", "default": "regex", "title": "Type", "type": "string"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Message"}, "implicit": {"default": false, "title": "Implicit", "type": "boolean"}, "negate": {"default": false, "title": "Negate", "type": "boolean"}, "expression": {"title": "Expression", "type": "string"}}, "required": ["expression"], "title": "RegexParameterValidatorModel", "type": "object"}, "ResourceRequirement": {"properties": {"type": {"const": "resource", "title": "type", "type": "string"}, "cores_min": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": 1, "description": "Minimum reserved number of CPU cores.\nMay be a fractional value to indicate to a scheduling algorithm that one core can be allocated to multiple jobs. For example, a value of 0.25 indicates that up to 4 jobs may run in parallel on 1 core. A value of 1.25 means that up to 3 jobs can run on a 4 core system (4/1.25 \u2248 3).\nThe reported number of CPU cores reserved for the process is a non-zero integer calculated by rounding up the cores request to the next whole number.\n", "title": "cores_min"}, "cores_max": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "Maximum reserved number of CPU cores.\nMay be a fractional value to indicate to a scheduling algorithm that one core can be allocated to multiple jobs. For example, a value of 0.25 indicates that up to 4 jobs may run in parallel on 1 core. A value of 1.25 means that up to 3 jobs can run on a 4 core system (4/1.25 \u2248 3).\nThe reported number of CPU cores reserved for the process is a non-zero integer calculated by rounding up the cores request to the next whole number.\n", "title": "cores_max"}, "ram_min": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": 256, "description": "Minimum reserved RAM in mebibytes (2**20).\nMay be a fractional value. If so, the actual RAM request is rounded up to the next whole number. The reported amount of RAM reserved for the process is a non-zero integer.", "title": "ram_min"}, "ram_max": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "Maximum reserved RAM in mebibytes (2**20).\nMay be a fractional value. If so, the actual RAM request is rounded up to the next whole number. The reported amount of RAM reserved for the process is a non-zero integer.", "title": "ram_max"}, "tmpdir_min": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "tmpdir_min"}, "tmpdir_max": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "tmpdir_max"}, "cuda_version_min": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "cuda_version_min"}, "cuda_compute_capability": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "cuda_compute_capability"}, "gpu_memory_min": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "gpu_memory_min"}, "cuda_device_count_min": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "cuda_device_count_min"}, "cuda_device_count_max": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "cuda_device_count_max"}, "shm_size": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "shm_size"}, "timelimit": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "Maximum time in seconds the tool is allowed to run. Job will be terminated if exceeded.", "title": "timelimit"}}, "required": ["type"], "title": "ResourceRequirement", "type": "object"}, "RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___": {"items": {"anyOf": [{"discriminator": {"mapping": {"attribute_is": "#/$defs/attribute_is_model", "attribute_matches": "#/$defs/attribute_matches_model", "element_text": "#/$defs/element_text_model", "element_text_is": "#/$defs/element_text_is_model", "element_text_matches": "#/$defs/element_text_matches_model", "has_archive_member": "#/$defs/has_archive_member_model", "has_element_with_path": "#/$defs/has_element_with_path_model", "has_h5_attribute": "#/$defs/has_h5_attribute_model", "has_h5_keys": "#/$defs/has_h5_keys_model", "has_image_center_of_mass": "#/$defs/has_image_center_of_mass_model", "has_image_channels": "#/$defs/has_image_channels_model", "has_image_depth": "#/$defs/has_image_depth_model", "has_image_frames": "#/$defs/has_image_frames_model", "has_image_height": "#/$defs/has_image_height_model", "has_image_mean_intensity": "#/$defs/has_image_mean_intensity_model", "has_image_mean_object_size": "#/$defs/has_image_mean_object_size_model", "has_image_n_labels": "#/$defs/has_image_n_labels_model", "has_image_width": "#/$defs/has_image_width_model", "has_json_property_with_text": "#/$defs/has_json_property_with_text_model", "has_json_property_with_value": "#/$defs/has_json_property_with_value_model", "has_line": "#/$defs/has_line_model", "has_line_matching": "#/$defs/has_line_matching_model", "has_n_columns": "#/$defs/has_n_columns_model", "has_n_elements_with_path": "#/$defs/has_n_elements_with_path_model", "has_n_lines": "#/$defs/has_n_lines_model", "has_size": "#/$defs/has_size_model", "has_text": "#/$defs/has_text_model", "has_text_matching": "#/$defs/has_text_matching_model", "is_valid_xml": "#/$defs/is_valid_xml_model", "not_has_text": "#/$defs/not_has_text_model", "xml_element": "#/$defs/xml_element_model"}, "propertyName": "that"}, "oneOf": [{"$ref": "#/$defs/has_line_model"}, {"$ref": "#/$defs/has_line_matching_model"}, {"$ref": "#/$defs/has_n_lines_model"}, {"$ref": "#/$defs/has_text_model"}, {"$ref": "#/$defs/has_text_matching_model"}, {"$ref": "#/$defs/not_has_text_model"}, {"$ref": "#/$defs/has_n_columns_model"}, {"$ref": "#/$defs/attribute_is_model"}, {"$ref": "#/$defs/attribute_matches_model"}, {"$ref": "#/$defs/element_text_model"}, {"$ref": "#/$defs/element_text_is_model"}, {"$ref": "#/$defs/element_text_matches_model"}, {"$ref": "#/$defs/has_element_with_path_model"}, {"$ref": "#/$defs/has_n_elements_with_path_model"}, {"$ref": "#/$defs/is_valid_xml_model"}, {"$ref": "#/$defs/xml_element_model"}, {"$ref": "#/$defs/has_json_property_with_text_model"}, {"$ref": "#/$defs/has_json_property_with_value_model"}, {"$ref": "#/$defs/has_h5_attribute_model"}, {"$ref": "#/$defs/has_h5_keys_model"}, {"$ref": "#/$defs/has_archive_member_model"}, {"$ref": "#/$defs/has_size_model"}, {"$ref": "#/$defs/has_image_center_of_mass_model"}, {"$ref": "#/$defs/has_image_channels_model"}, {"$ref": "#/$defs/has_image_depth_model"}, {"$ref": "#/$defs/has_image_frames_model"}, {"$ref": "#/$defs/has_image_height_model"}, {"$ref": "#/$defs/has_image_mean_intensity_model"}, {"$ref": "#/$defs/has_image_mean_object_size_model"}, {"$ref": "#/$defs/has_image_n_labels_model"}, {"$ref": "#/$defs/has_image_width_model"}]}, {"$ref": "#/$defs/has_line_model_nested"}, {"$ref": "#/$defs/has_line_matching_model_nested"}, {"$ref": "#/$defs/has_n_lines_model_nested"}, {"$ref": "#/$defs/has_text_model_nested"}, {"$ref": "#/$defs/has_text_matching_model_nested"}, {"$ref": "#/$defs/not_has_text_model_nested"}, {"$ref": "#/$defs/has_n_columns_model_nested"}, {"$ref": "#/$defs/attribute_is_model_nested"}, {"$ref": "#/$defs/attribute_matches_model_nested"}, {"$ref": "#/$defs/element_text_model_nested"}, {"$ref": "#/$defs/element_text_is_model_nested"}, {"$ref": "#/$defs/element_text_matches_model_nested"}, {"$ref": "#/$defs/has_element_with_path_model_nested"}, {"$ref": "#/$defs/has_n_elements_with_path_model_nested"}, {"$ref": "#/$defs/is_valid_xml_model_nested"}, {"$ref": "#/$defs/xml_element_model_nested"}, {"$ref": "#/$defs/has_json_property_with_text_model_nested"}, {"$ref": "#/$defs/has_json_property_with_value_model_nested"}, {"$ref": "#/$defs/has_h5_attribute_model_nested"}, {"$ref": "#/$defs/has_h5_keys_model_nested"}, {"$ref": "#/$defs/has_archive_member_model_nested"}, {"$ref": "#/$defs/has_size_model_nested"}, {"$ref": "#/$defs/has_image_center_of_mass_model_nested"}, {"$ref": "#/$defs/has_image_channels_model_nested"}, {"$ref": "#/$defs/has_image_depth_model_nested"}, {"$ref": "#/$defs/has_image_frames_model_nested"}, {"$ref": "#/$defs/has_image_height_model_nested"}, {"$ref": "#/$defs/has_image_mean_intensity_model_nested"}, {"$ref": "#/$defs/has_image_mean_object_size_model_nested"}, {"$ref": "#/$defs/has_image_n_labels_model_nested"}, {"$ref": "#/$defs/has_image_width_model_nested"}]}, "title": "RootModel[List[Union[Annotated[Union[has_line_model, has_line_matching_model, has_n_lines_model, has_text_model, has_text_matching_model, not_has_text_model, has_n_columns_model, attribute_is_model, attribute_matches_model, element_text_model, element_text_is_model, element_text_matches_model, has_element_with_path_model, has_n_elements_with_path_model, is_valid_xml_model, xml_element_model, has_json_property_with_text_model, has_json_property_with_value_model, has_h5_attribute_model, has_h5_keys_model, has_archive_member_model, has_size_model, has_image_center_of_mass_model, has_image_channels_model, has_image_depth_model, has_image_frames_model, has_image_height_model, has_image_mean_intensity_model, has_image_mean_object_size_model, has_image_n_labels_model, has_image_width_model], FieldInfo(annotation=NoneType, required=True, discriminator='that')], has_line_model_nested, has_line_matching_model_nested, has_n_lines_model_nested, has_text_model_nested, has_text_matching_model_nested, not_has_text_model_nested, has_n_columns_model_nested, attribute_is_model_nested, attribute_matches_model_nested, element_text_model_nested, element_text_is_model_nested, element_text_matches_model_nested, has_element_with_path_model_nested, has_n_elements_with_path_model_nested, is_valid_xml_model_nested, xml_element_model_nested, has_json_property_with_text_model_nested, has_json_property_with_value_model_nested, has_h5_attribute_model_nested, has_h5_keys_model_nested, has_archive_member_model_nested, has_size_model_nested, has_image_center_of_mass_model_nested, has_image_channels_model_nested, has_image_depth_model_nested, has_image_frames_model_nested, has_image_height_model_nested, has_image_mean_intensity_model_nested, has_image_mean_object_size_model_nested, has_image_n_labels_model_nested, has_image_width_model_nested]]]", "type": "array"}, "TestCollectionCollectionElementAssertions": {"additionalProperties": false, "properties": {"elements": {"anyOf": [{"additionalProperties": {"anyOf": [{"$ref": "#/$defs/TestCollectionDatasetElementAssertions"}, {"$ref": "#/$defs/TestCollectionCollectionElementAssertions"}]}, "type": "object"}, {"type": "null"}], "default": null, "title": "elements"}, "element_tests": {"anyOf": [{"additionalProperties": {"anyOf": [{"$ref": "#/$defs/TestCollectionDatasetElementAssertions"}, {"$ref": "#/$defs/TestCollectionCollectionElementAssertions"}]}, "type": "object"}, {"type": "null"}], "default": null, "title": "element_tests"}}, "title": "TestCollectionCollectionElementAssertions", "type": "object"}, "TestCollectionDatasetElementAssertions": {"additionalProperties": false, "properties": {"file": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "file"}, "path": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "path"}, "location": {"anyOf": [{"format": "uri", "minLength": 1, "type": "string"}, {"type": "null"}], "default": null, "title": "location"}, "ftype": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "ftype"}, "sort": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "title": "sort"}, "compare": {"anyOf": [{"$ref": "#/$defs/OutputCompareType"}, {"type": "null"}], "default": null, "title": "compare"}, "checksum": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "checksum"}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "default": null, "title": "metadata"}, "asserts": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"$ref": "#/$defs/assertion_dict"}, {"type": "null"}], "default": null, "title": "asserts"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "delta"}, "delta_frac": {"anyOf": [{"type": "number"}, {"type": "null"}], "default": null, "title": "delta_frac"}, "lines_diff": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "lines_diff"}, "decompress": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "title": "decompress"}}, "title": "TestCollectionDatasetElementAssertions", "type": "object"}, "TestCollectionOutputAssertions": {"additionalProperties": false, "properties": {"class": {"anyOf": [{"const": "Collection", "type": "string"}, {"type": "null"}], "default": "Collection", "title": "class_"}, "elements": {"anyOf": [{"additionalProperties": {"anyOf": [{"$ref": "#/$defs/TestCollectionDatasetElementAssertions"}, {"$ref": "#/$defs/TestCollectionCollectionElementAssertions"}]}, "type": "object"}, {"type": "null"}], "default": null, "title": "elements"}, "element_tests": {"anyOf": [{"additionalProperties": {"anyOf": [{"$ref": "#/$defs/TestCollectionDatasetElementAssertions"}, {"$ref": "#/$defs/TestCollectionCollectionElementAssertions"}]}, "type": "object"}, {"type": "null"}], "default": null, "title": "element_tests"}, "element_count": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "element_count"}, "attributes": {"anyOf": [{"$ref": "#/$defs/CollectionAttributes"}, {"type": "null"}], "default": null, "title": "attributes"}, "collection_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "collection_type"}}, "title": "TestCollectionOutputAssertions", "type": "object"}, "TestDataOutputAssertions": {"additionalProperties": false, "properties": {"file": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "file"}, "path": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "path"}, "location": {"anyOf": [{"format": "uri", "minLength": 1, "type": "string"}, {"type": "null"}], "default": null, "title": "location"}, "ftype": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "ftype"}, "sort": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "title": "sort"}, "compare": {"anyOf": [{"$ref": "#/$defs/OutputCompareType"}, {"type": "null"}], "default": null, "title": "compare"}, "checksum": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "checksum"}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "default": null, "title": "metadata"}, "asserts": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"$ref": "#/$defs/assertion_dict"}, {"type": "null"}], "default": null, "title": "asserts"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "delta"}, "delta_frac": {"anyOf": [{"type": "number"}, {"type": "null"}], "default": null, "title": "delta_frac"}, "lines_diff": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "lines_diff"}, "decompress": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "title": "decompress"}, "class": {"anyOf": [{"const": "File", "type": "string"}, {"type": "null"}], "default": "File", "title": "class_"}}, "title": "TestDataOutputAssertions", "type": "object"}, "ToolOutputBoolean": {"properties": {"name": {"description": "Parameter name. Used when referencing parameter in workflows.", "title": "name"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Output label. Will be used as dataset name in history.", "title": "label"}, "hidden": {"description": "If true, the output will not be shown in the history.", "title": "hidden"}, "type": {"const": "boolean", "title": "type", "type": "string"}}, "required": ["name", "hidden", "type"], "title": "ToolOutputBoolean", "type": "object"}, "ToolOutputCollectionStructure": {"properties": {"collection_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "collection_type"}, "collection_type_source": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "collection_type_source"}, "collection_type_from_rules": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "collection_type_from_rules"}, "structured_like": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "structured_like"}, "discover_datasets": {"anyOf": [{"items": {"anyOf": [{"$ref": "#/$defs/FilePatternDatasetCollectionDescription"}, {"$ref": "#/$defs/ToolProvidedMetadataDatasetCollection"}]}, "type": "array"}, {"type": "null"}], "default": null, "title": "discover_datasets"}}, "title": "ToolOutputCollectionStructure", "type": "object"}, "ToolOutputFloat": {"properties": {"name": {"description": "Parameter name. Used when referencing parameter in workflows.", "title": "name"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Output label. Will be used as dataset name in history.", "title": "label"}, "hidden": {"description": "If true, the output will not be shown in the history.", "title": "hidden"}, "type": {"const": "float", "title": "type", "type": "string"}}, "required": ["name", "hidden", "type"], "title": "ToolOutputFloat", "type": "object"}, "ToolOutputInteger": {"properties": {"name": {"description": "Parameter name. Used when referencing parameter in workflows.", "title": "name"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Output label. Will be used as dataset name in history.", "title": "label"}, "hidden": {"description": "If true, the output will not be shown in the history.", "title": "hidden"}, "type": {"const": "integer", "title": "type", "type": "string"}}, "required": ["name", "hidden", "type"], "title": "ToolOutputInteger", "type": "object"}, "ToolOutputText": {"properties": {"name": {"description": "Parameter name. Used when referencing parameter in workflows.", "title": "name"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Output label. Will be used as dataset name in history.", "title": "label"}, "hidden": {"description": "If true, the output will not be shown in the history.", "title": "hidden"}, "type": {"const": "text", "title": "type", "type": "string"}}, "required": ["name", "hidden", "type"], "title": "ToolOutputText", "type": "object"}, "ToolProvidedMetadataDatasetCollection": {"properties": {"discover_via": {"const": "tool_provided_metadata", "title": "discover_via", "type": "string"}, "format": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "format"}, "visible": {"title": "visible", "type": "boolean"}, "assign_primary_output": {"title": "assign_primary_output", "type": "boolean"}, "directory": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "directory"}, "recurse": {"title": "recurse", "type": "boolean"}, "match_relative_path": {"title": "match_relative_path", "type": "boolean"}}, "required": ["discover_via", "format", "visible", "assign_primary_output", "directory", "recurse", "match_relative_path"], "title": "ToolProvidedMetadataDatasetCollection", "type": "object"}, "XrefDict": {"additionalProperties": false, "properties": {"value": {"title": "value", "type": "string"}, "type": {"title": "type", "type": "string"}}, "required": ["value", "type"], "title": "XrefDict", "type": "object"}, "YamlBooleanParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "boolean", "title": "Type", "type": "string"}, "value": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "Value"}}, "required": ["name", "type"], "title": "YamlBooleanParameter", "type": "object"}, "YamlColorParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "color", "title": "Type", "type": "string"}, "value": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Value"}}, "required": ["name", "type"], "title": "YamlColorParameter", "type": "object"}, "YamlConditionalParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "conditional", "title": "Type", "type": "string"}, "test_parameter": {"discriminator": {"mapping": {"boolean": "#/$defs/YamlBooleanParameter", "select": "#/$defs/YamlSelectParameter"}, "propertyName": "type"}, "oneOf": [{"$ref": "#/$defs/YamlBooleanParameter"}, {"$ref": "#/$defs/YamlSelectParameter"}], "title": "Test Parameter"}, "whens": {"items": {"$ref": "#/$defs/YamlConditionalWhen"}, "minItems": 1, "title": "Whens", "type": "array"}}, "required": ["name", "type", "test_parameter", "whens"], "title": "YamlConditionalParameter", "type": "object"}, "YamlConditionalWhen": {"additionalProperties": false, "properties": {"discriminator": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "title": "Discriminator"}, "parameters": {"default": [], "items": {"$ref": "#/$defs/YamlGalaxyToolParameter"}, "title": "Parameters", "type": "array"}}, "required": ["discriminator"], "title": "YamlConditionalWhen", "type": "object"}, "YamlDataCollectionParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "data_collection", "title": "Type", "type": "string"}, "collection_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Collection Type"}, "format": {"default": ["data"], "items": {"type": "string"}, "title": "Format", "type": "array"}}, "required": ["name", "type"], "title": "YamlDataCollectionParameter", "type": "object"}, "YamlDataParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "data", "title": "Type", "type": "string"}, "format": {"default": ["data"], "items": {"type": "string"}, "title": "Format", "type": "array"}, "multiple": {"default": false, "title": "Multiple", "type": "boolean"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Max"}}, "required": ["name", "type"], "title": "YamlDataParameter", "type": "object"}, "YamlFloatParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "float", "title": "Type", "type": "string"}, "value": {"anyOf": [{"type": "number"}, {"type": "null"}], "default": null, "title": "Value"}, "min": {"anyOf": [{"type": "number"}, {"type": "null"}], "default": null, "title": "Min"}, "max": {"anyOf": [{"type": "number"}, {"type": "null"}], "default": null, "title": "Max"}, "validators": {"default": [], "items": {"$ref": "#/$defs/InRangeParameterValidatorModel"}, "title": "Validators", "type": "array"}}, "required": ["name", "type"], "title": "YamlFloatParameter", "type": "object"}, "YamlGalaxyToolParameter": {"discriminator": {"mapping": {"boolean": "#/$defs/YamlBooleanParameter", "color": "#/$defs/YamlColorParameter", "conditional": "#/$defs/YamlConditionalParameter", "data": "#/$defs/YamlDataParameter", "data_collection": "#/$defs/YamlDataCollectionParameter", "float": "#/$defs/YamlFloatParameter", "integer": "#/$defs/YamlIntegerParameter", "repeat": "#/$defs/YamlRepeatParameter", "section": "#/$defs/YamlSectionParameter", "select": "#/$defs/YamlSelectParameter", "text": "#/$defs/YamlTextParameter"}, "propertyName": "type"}, "oneOf": [{"$ref": "#/$defs/YamlBooleanParameter"}, {"$ref": "#/$defs/YamlIntegerParameter"}, {"$ref": "#/$defs/YamlFloatParameter"}, {"$ref": "#/$defs/YamlTextParameter"}, {"$ref": "#/$defs/YamlSelectParameter"}, {"$ref": "#/$defs/YamlColorParameter"}, {"$ref": "#/$defs/YamlDataParameter"}, {"$ref": "#/$defs/YamlDataCollectionParameter"}, {"$ref": "#/$defs/YamlConditionalParameter"}, {"$ref": "#/$defs/YamlRepeatParameter"}, {"$ref": "#/$defs/YamlSectionParameter"}], "title": "YamlGalaxyToolParameter"}, "YamlIntegerParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "integer", "title": "Type", "type": "string"}, "value": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Value"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Max"}, "validators": {"default": [], "items": {"$ref": "#/$defs/InRangeParameterValidatorModel"}, "title": "Validators", "type": "array"}}, "required": ["name", "type"], "title": "YamlIntegerParameter", "type": "object"}, "YamlLabelValue": {"description": "YAML-friendly option model \u2014 ``selected`` defaults to ``False``.", "properties": {"label": {"title": "Label", "type": "string"}, "value": {"title": "Value", "type": "string"}, "selected": {"default": false, "title": "Selected", "type": "boolean"}}, "required": ["label", "value"], "title": "YamlLabelValue", "type": "object"}, "YamlRepeatParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "repeat", "title": "Type", "type": "string"}, "parameters": {"default": [], "items": {"$ref": "#/$defs/YamlGalaxyToolParameter"}, "title": "Parameters", "type": "array"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Max"}}, "required": ["name", "type"], "title": "YamlRepeatParameter", "type": "object"}, "YamlSectionParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "section", "title": "Type", "type": "string"}, "parameters": {"default": [], "items": {"$ref": "#/$defs/YamlGalaxyToolParameter"}, "title": "Parameters", "type": "array"}}, "required": ["name", "type"], "title": "YamlSectionParameter", "type": "object"}, "YamlSelectParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "select", "title": "Type", "type": "string"}, "options": {"items": {"$ref": "#/$defs/YamlLabelValue"}, "minItems": 1, "title": "Options", "type": "array"}, "multiple": {"default": false, "title": "Multiple", "type": "boolean"}, "validators": {"default": [], "items": {"$ref": "#/$defs/NoOptionsParameterValidatorModel"}, "title": "Validators", "type": "array"}}, "required": ["name", "type", "options"], "title": "YamlSelectParameter", "type": "object"}, "YamlTemplateConfigFile": {"properties": {"content": {"title": "content", "type": "string"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "name"}, "filename": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "filename"}, "eval_engine": {"const": "ecmascript", "default": "ecmascript", "title": "eval_engine", "type": "string"}}, "required": ["content"], "title": "YamlTemplateConfigFile", "type": "object"}, "YamlTestCredential": {"additionalProperties": false, "properties": {"name": {"description": "Name of the credentials group.", "title": "name", "type": "string"}, "variables": {"default": [], "description": "Variables exposed to the tool environment.", "items": {"$ref": "#/$defs/YamlTestCredentialValue"}, "title": "variables", "type": "array"}, "secrets": {"default": [], "description": "Secrets exposed to the tool environment.", "items": {"$ref": "#/$defs/YamlTestCredentialValue"}, "title": "secrets", "type": "array"}, "version": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Version of the credential definition.", "title": "version"}}, "required": ["name"], "title": "YamlTestCredential", "type": "object"}, "YamlTestCredentialValue": {"additionalProperties": false, "properties": {"name": {"description": "Name of the credential variable or secret.", "title": "name", "type": "string"}, "value": {"description": "Value of the credential variable or secret.", "title": "value", "type": "string"}}, "required": ["name", "value"], "title": "YamlTestCredentialValue", "type": "object"}, "YamlTextParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "text", "title": "Type", "type": "string"}, "value": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Value"}, "area": {"default": false, "title": "Area", "type": "boolean"}, "validators": {"default": [], "items": {"anyOf": [{"$ref": "#/$defs/LengthParameterValidatorModel"}, {"$ref": "#/$defs/RegexParameterValidatorModel"}, {"$ref": "#/$defs/EmptyFieldParameterValidatorModel"}]}, "title": "Validators", "type": "array"}}, "required": ["name", "type"], "title": "YamlTextParameter", "type": "object"}, "YamlToolTest": {"additionalProperties": false, "description": "In-tool test case as authored in YAML tool fixtures.", "properties": {"doc": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Human-readable description of this test case.", "title": "Doc"}, "inputs": {"anyOf": [{"additionalProperties": {"anyOf": [{"type": "boolean"}, {"type": "integer"}, {"type": "number"}, {"type": "string"}, {"items": {}, "type": "array"}, {"additionalProperties": true, "type": "object"}]}, "type": "object"}, {"type": "null"}], "default": null, "description": "Mapping of input parameter names to test values.", "title": "Inputs"}, "outputs": {"additionalProperties": {"anyOf": [{"$ref": "#/$defs/TestCollectionOutputAssertions"}, {"$ref": "#/$defs/TestDataOutputAssertions"}, {"type": "boolean"}, {"type": "integer"}, {"type": "number"}, {"type": "string"}]}, "default": {}, "description": "Mapping of output names to expected values or assertions.", "title": "Outputs", "type": "object"}, "assert_stdout": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"$ref": "#/$defs/assertion_dict"}, {"type": "null"}], "default": null, "description": "Assertions to apply against the tool's standard output.", "title": "Assert Stdout"}, "assert_stderr": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"$ref": "#/$defs/assertion_dict"}, {"type": "null"}], "default": null, "description": "Assertions to apply against the tool's standard error.", "title": "Assert Stderr"}, "command": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"$ref": "#/$defs/assertion_dict"}, {"type": "null"}], "default": null, "description": "Assertions to apply against the executed command line.", "title": "Command"}, "expect_exit_code": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected process exit code.", "title": "Expect Exit Code"}, "expect_failure": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "description": "If true, the tool is expected to produce an error.", "title": "Expect Failure"}, "expect_test_failure": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "description": "If true, the test itself is expected to fail.", "title": "Expect Test Failure"}, "credentials": {"anyOf": [{"items": {"$ref": "#/$defs/YamlTestCredential"}, "type": "array"}, {"type": "null"}], "default": null, "description": "Credentials to inject for this test case.", "title": "Credentials"}}, "title": "YamlToolTest", "type": "object"}, "assertion_dict": {"additionalProperties": false, "properties": {"has_line": {"anyOf": [{"$ref": "#/$defs/base_has_line_model"}, {"type": "null"}], "default": null}, "has_line_matching": {"anyOf": [{"$ref": "#/$defs/base_has_line_matching_model"}, {"type": "null"}], "default": null}, "has_n_lines": {"anyOf": [{"$ref": "#/$defs/base_has_n_lines_model"}, {"type": "null"}], "default": null}, "has_text": {"anyOf": [{"$ref": "#/$defs/base_has_text_model"}, {"type": "null"}], "default": null}, "has_text_matching": {"anyOf": [{"$ref": "#/$defs/base_has_text_matching_model"}, {"type": "null"}], "default": null}, "not_has_text": {"anyOf": [{"$ref": "#/$defs/base_not_has_text_model"}, {"type": "null"}], "default": null}, "has_n_columns": {"anyOf": [{"$ref": "#/$defs/base_has_n_columns_model"}, {"type": "null"}], "default": null}, "attribute_is": {"anyOf": [{"$ref": "#/$defs/base_attribute_is_model"}, {"type": "null"}], "default": null}, "attribute_matches": {"anyOf": [{"$ref": "#/$defs/base_attribute_matches_model"}, {"type": "null"}], "default": null}, "element_text": {"anyOf": [{"$ref": "#/$defs/base_element_text_model"}, {"type": "null"}], "default": null}, "element_text_is": {"anyOf": [{"$ref": "#/$defs/base_element_text_is_model"}, {"type": "null"}], "default": null}, "element_text_matches": {"anyOf": [{"$ref": "#/$defs/base_element_text_matches_model"}, {"type": "null"}], "default": null}, "has_element_with_path": {"anyOf": [{"$ref": "#/$defs/base_has_element_with_path_model"}, {"type": "null"}], "default": null}, "has_n_elements_with_path": {"anyOf": [{"$ref": "#/$defs/base_has_n_elements_with_path_model"}, {"type": "null"}], "default": null}, "is_valid_xml": {"anyOf": [{"$ref": "#/$defs/base_is_valid_xml_model"}, {"type": "null"}], "default": null}, "xml_element": {"anyOf": [{"$ref": "#/$defs/base_xml_element_model"}, {"type": "null"}], "default": null}, "has_json_property_with_text": {"anyOf": [{"$ref": "#/$defs/base_has_json_property_with_text_model"}, {"type": "null"}], "default": null}, "has_json_property_with_value": {"anyOf": [{"$ref": "#/$defs/base_has_json_property_with_value_model"}, {"type": "null"}], "default": null}, "has_h5_attribute": {"anyOf": [{"$ref": "#/$defs/base_has_h5_attribute_model"}, {"type": "null"}], "default": null}, "has_h5_keys": {"anyOf": [{"$ref": "#/$defs/base_has_h5_keys_model"}, {"type": "null"}], "default": null}, "has_archive_member": {"anyOf": [{"$ref": "#/$defs/base_has_archive_member_model"}, {"type": "null"}], "default": null}, "has_size": {"anyOf": [{"$ref": "#/$defs/base_has_size_model"}, {"type": "null"}], "default": null}, "has_image_center_of_mass": {"anyOf": [{"$ref": "#/$defs/base_has_image_center_of_mass_model"}, {"type": "null"}], "default": null}, "has_image_channels": {"anyOf": [{"$ref": "#/$defs/base_has_image_channels_model"}, {"type": "null"}], "default": null}, "has_image_depth": {"anyOf": [{"$ref": "#/$defs/base_has_image_depth_model"}, {"type": "null"}], "default": null}, "has_image_frames": {"anyOf": [{"$ref": "#/$defs/base_has_image_frames_model"}, {"type": "null"}], "default": null}, "has_image_height": {"anyOf": [{"$ref": "#/$defs/base_has_image_height_model"}, {"type": "null"}], "default": null}, "has_image_mean_intensity": {"anyOf": [{"$ref": "#/$defs/base_has_image_mean_intensity_model"}, {"type": "null"}], "default": null}, "has_image_mean_object_size": {"anyOf": [{"$ref": "#/$defs/base_has_image_mean_object_size_model"}, {"type": "null"}], "default": null}, "has_image_n_labels": {"anyOf": [{"$ref": "#/$defs/base_has_image_n_labels_model"}, {"type": "null"}], "default": null}, "has_image_width": {"anyOf": [{"$ref": "#/$defs/base_has_image_width_model"}, {"type": "null"}], "default": null}}, "title": "assertion_dict", "type": "object"}, "attribute_is_model": {"additionalProperties": false, "description": "Asserts the XML ``attribute`` for the element (or tag) with the specified\nXPath-like ``path`` is the specified ``text``.\n\nFor example:\n\n```xml\n\n```\n\nThe assertion implicitly also asserts that an element matching ``path`` exists.\nWith ``negate`` the result of the assertion (on the equality) can be inverted (the\nimplicit assertion on the existence of the path is not affected).", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "attribute": {"description": "The XML attribute name to test against from the target XML element.", "title": "Attribute", "type": "string"}, "text": {"description": "The expected attribute value to test against on the target XML element", "title": "Text", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "attribute_is", "default": "attribute_is", "title": "That", "type": "string"}}, "required": ["path", "attribute", "text"], "title": "attribute_is_model", "type": "object"}, "attribute_is_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"attribute_is": {"$ref": "#/$defs/base_attribute_is_model"}}, "required": ["attribute_is"], "title": "attribute_is_model_nested", "type": "object"}, "attribute_matches_model": {"additionalProperties": false, "description": "Asserts the XML ``attribute`` for the element (or tag) with the specified\nXPath-like ``path`` matches the regular expression specified by ``expression``.\n\nFor example:\n\n```xml\n\n```\n\nThe assertion implicitly also asserts that an element matching ``path`` exists.\nWith ``negate`` the result of the assertion (on the matching) can be inverted (the\nimplicit assertion on the existence of the path is not affected).", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "attribute": {"description": "The XML attribute name to test against from the target XML element.", "title": "Attribute", "type": "string"}, "expression": {"description": "The regular expressions to apply against the named attribute on the target XML element.", "title": "Expression", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "attribute_matches", "default": "attribute_matches", "title": "That", "type": "string"}}, "required": ["path", "attribute", "expression"], "title": "attribute_matches_model", "type": "object"}, "attribute_matches_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"attribute_matches": {"$ref": "#/$defs/base_attribute_matches_model"}}, "required": ["attribute_matches"], "title": "attribute_matches_model_nested", "type": "object"}, "base_attribute_is_model": {"additionalProperties": false, "description": "base model for attribute_is describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "attribute": {"description": "The XML attribute name to test against from the target XML element.", "title": "Attribute", "type": "string"}, "text": {"description": "The expected attribute value to test against on the target XML element", "title": "Text", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["path", "attribute", "text"], "title": "base_attribute_is_model", "type": "object"}, "base_attribute_matches_model": {"additionalProperties": false, "description": "base model for attribute_matches describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "attribute": {"description": "The XML attribute name to test against from the target XML element.", "title": "Attribute", "type": "string"}, "expression": {"description": "The regular expressions to apply against the named attribute on the target XML element.", "title": "Expression", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["path", "attribute", "expression"], "title": "base_attribute_matches_model", "type": "object"}, "base_element_text_is_model": {"additionalProperties": false, "description": "base model for element_text_is describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "text": {"description": "The expected element text (body of the XML tag) to test against on the target XML element", "title": "Text", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["path", "text"], "title": "base_element_text_is_model", "type": "object"}, "base_element_text_matches_model": {"additionalProperties": false, "description": "base model for element_text_matches describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "expression": {"description": "The regular expressions to apply against the target element.", "title": "Expression", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["path", "expression"], "title": "base_element_text_matches_model", "type": "object"}, "base_element_text_model": {"additionalProperties": false, "description": "base model for element_text describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "children": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"type": "null"}], "default": null}, "asserts": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"type": "null"}], "default": null}}, "required": ["path"], "title": "base_element_text_model", "type": "object"}, "base_has_archive_member_model": {"additionalProperties": false, "description": "base model for has_archive_member describing attributes.", "properties": {"path": {"description": "The regular expression specifying the archive member.", "title": "Path", "type": "string"}, "all": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "Check the sub-assertions for all paths matching the path. Default: false, i.e. only the first", "title": "All"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "children": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"type": "null"}], "default": null}, "asserts": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"type": "null"}], "default": null}}, "required": ["path"], "title": "base_has_archive_member_model", "type": "object"}, "base_has_element_with_path_model": {"additionalProperties": false, "description": "base model for has_element_with_path describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["path"], "title": "base_has_element_with_path_model", "type": "object"}, "base_has_h5_attribute_model": {"additionalProperties": false, "description": "base model for has_h5_attribute describing attributes.", "properties": {"key": {"description": "HDF5 attribute to check value of.", "title": "Key", "type": "string"}, "value": {"description": "Expected value of HDF5 attribute to check.", "title": "Value", "type": "string"}}, "required": ["key", "value"], "title": "base_has_h5_attribute_model", "type": "object"}, "base_has_h5_keys_model": {"additionalProperties": false, "description": "base model for has_h5_keys describing attributes.", "properties": {"keys": {"description": "HDF5 attributes to check value of as a comma-separated string.", "title": "Keys", "type": "string"}}, "required": ["keys"], "title": "base_has_h5_keys_model", "type": "object"}, "base_has_image_center_of_mass_model": {"additionalProperties": false, "description": "base model for has_image_center_of_mass describing attributes.", "properties": {"center_of_mass": {"description": "The required center of mass of the image intensities (horizontal and vertical coordinate, separated by a comma).", "title": "Center Of Mass", "type": "string"}, "channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "eps": {"anyOf": [{"type": "integer"}, {"type": "number"}], "default": 0.01, "description": "The maximum allowed Euclidean distance to the required center of mass (defaults to ``0.01``).", "title": "Eps"}}, "required": ["center_of_mass"], "title": "base_has_image_center_of_mass_model", "type": "object"}, "base_has_image_channels_model": {"additionalProperties": false, "description": "base model for has_image_channels describing attributes.", "properties": {"channels": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected number of channels of the image.", "title": "Channels"}, "delta": {"default": 0, "description": "Maximum allowed difference of the number of channels (default is 0). The observed number of channels has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed number of channels.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed number of channels.", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_image_channels_model", "type": "object"}, "base_has_image_depth_model": {"additionalProperties": false, "description": "base model for has_image_depth describing attributes.", "properties": {"depth": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected depth of the image (number of slices).", "title": "Depth"}, "delta": {"default": 0, "description": "Maximum allowed difference of the image depth (number of slices, default is 0). The observed depth has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed depth of the image (number of slices).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed depth of the image (number of slices).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_image_depth_model", "type": "object"}, "base_has_image_frames_model": {"additionalProperties": false, "description": "base model for has_image_frames describing attributes.", "properties": {"frames": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected number of frames in the image sequence (number of time steps).", "title": "Frames"}, "delta": {"default": 0, "description": "Maximum allowed difference of the number of frames in the image sequence (number of time steps, default is 0). The observed number of frames has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed number of frames in the image sequence (number of time steps).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed number of frames in the image sequence (number of time steps).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_image_frames_model", "type": "object"}, "base_has_image_height_model": {"additionalProperties": false, "description": "base model for has_image_height describing attributes.", "properties": {"height": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected height of the image (in pixels).", "title": "Height"}, "delta": {"default": 0, "description": "Maximum allowed difference of the image height (in pixels, default is 0). The observed height has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed height of the image (in pixels).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed height of the image (in pixels).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_image_height_model", "type": "object"}, "base_has_image_mean_intensity_model": {"additionalProperties": false, "description": "base model for has_image_mean_intensity describing attributes.", "properties": {"channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "mean_intensity": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "The required mean value of the image intensities.", "title": "Mean Intensity"}, "eps": {"anyOf": [{"type": "integer"}, {"type": "number"}], "default": 0.01, "description": "The absolute tolerance to be used for ``value`` (defaults to ``0.01``). The observed mean value of the image intensities has to be in the range ``value +- eps``.", "title": "Eps"}, "min": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "A lower bound of the required mean value of the image intensities.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "An upper bound of the required mean value of the image intensities.", "title": "Max"}}, "title": "base_has_image_mean_intensity_model", "type": "object"}, "base_has_image_mean_object_size_model": {"additionalProperties": false, "description": "base model for has_image_mean_object_size describing attributes.", "properties": {"channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "labels": {"anyOf": [{"items": {"type": "integer"}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels, separated by a comma. Labels *not* on this list will be excluded from consideration. Cannot be used in combination with ``exclude_labels``.", "title": "Labels"}, "exclude_labels": {"anyOf": [{"items": {"type": "integer"}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels to be excluded from consideration, separated by a comma. The primary usage of this attribute is to exclude the background of a label image. Cannot be used in combination with ``labels``.", "title": "Exclude Labels"}, "mean_object_size": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "The required mean size of the uniquely labeled objects.", "title": "Mean Object Size"}, "eps": {"anyOf": [{"type": "integer"}, {"type": "number"}], "default": 0.01, "description": "The absolute tolerance to be used for ``value`` (defaults to ``0.01``). The observed mean size of the uniquely labeled objects has to be in the range ``value +- eps``.", "title": "Eps"}, "min": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "A lower bound of the required mean size of the uniquely labeled objects.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "An upper bound of the required mean size of the uniquely labeled objects.", "title": "Max"}}, "title": "base_has_image_mean_object_size_model", "type": "object"}, "base_has_image_n_labels_model": {"additionalProperties": false, "description": "base model for has_image_n_labels describing attributes.", "properties": {"channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "labels": {"anyOf": [{"items": {"type": "integer"}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels, separated by a comma. Labels *not* on this list will be excluded from consideration. Cannot be used in combination with ``exclude_labels``.", "title": "Labels"}, "exclude_labels": {"anyOf": [{"items": {"type": "integer"}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels to be excluded from consideration, separated by a comma. The primary usage of this attribute is to exclude the background of a label image. Cannot be used in combination with ``labels``.", "title": "Exclude Labels"}, "n": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected number of labels.", "title": "N"}, "delta": {"default": 0, "description": "Maximum allowed difference of the number of labels (default is 0). The observed number of labels has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed number of labels.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed number of labels.", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_image_n_labels_model", "type": "object"}, "base_has_image_width_model": {"additionalProperties": false, "description": "base model for has_image_width describing attributes.", "properties": {"width": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected width of the image (in pixels).", "title": "Width"}, "delta": {"default": 0, "description": "Maximum allowed difference of the image width (in pixels, default is 0). The observed width has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed width of the image (in pixels).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed width of the image (in pixels).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_image_width_model", "type": "object"}, "base_has_json_property_with_text_model": {"additionalProperties": false, "description": "base model for has_json_property_with_text describing attributes.", "properties": {"property": {"description": "The property name to search the JSON document for.", "title": "Property", "type": "string"}, "text": {"description": "The expected text value of the target JSON attribute.", "title": "Text", "type": "string"}}, "required": ["property", "text"], "title": "base_has_json_property_with_text_model", "type": "object"}, "base_has_json_property_with_value_model": {"additionalProperties": false, "description": "base model for has_json_property_with_value describing attributes.", "properties": {"property": {"description": "The property name to search the JSON document for.", "title": "Property", "type": "string"}, "value": {"description": "The expected JSON value of the target JSON attribute (as a JSON encoded string).", "title": "Value", "type": "string"}}, "required": ["property", "value"], "title": "base_has_json_property_with_value_model", "type": "object"}, "base_has_line_matching_model": {"additionalProperties": false, "description": "base model for has_line_matching describing attributes.", "properties": {"expression": {"description": "The regular expressions to attempt match in the output.", "title": "Expression", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["expression"], "title": "base_has_line_matching_model", "type": "object"}, "base_has_line_model": {"additionalProperties": false, "description": "base model for has_line describing attributes.", "properties": {"line": {"description": "The full line of text to search for in the output.", "title": "Line", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["line"], "title": "base_has_line_model", "type": "object"}, "base_has_n_columns_model": {"additionalProperties": false, "description": "base model for has_n_columns describing attributes.", "properties": {"n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "sep": {"default": "\t", "description": "Separator defining columns, default: tab", "title": "Sep", "type": "string"}, "comment": {"default": "", "description": "Comment character(s) used to skip comment lines (which should not be used for counting columns)", "title": "Comment", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_n_columns_model", "type": "object"}, "base_has_n_elements_with_path_model": {"additionalProperties": false, "description": "base model for has_n_elements_with_path describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["path"], "title": "base_has_n_elements_with_path_model", "type": "object"}, "base_has_n_lines_model": {"additionalProperties": false, "description": "base model for has_n_lines describing attributes.", "properties": {"n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_n_lines_model", "type": "object"}, "base_has_size_model": {"additionalProperties": false, "description": "base model for has_size describing attributes.", "properties": {"value": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Deprecated alias for `size`", "title": "Value"}, "size": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired size of the output (in bytes), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Size"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_size_model", "type": "object"}, "base_has_text_matching_model": {"additionalProperties": false, "description": "base model for has_text_matching describing attributes.", "properties": {"expression": {"description": "The regular expressions to attempt match in the output.", "title": "Expression", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["expression"], "title": "base_has_text_matching_model", "type": "object"}, "base_has_text_model": {"additionalProperties": false, "description": "base model for has_text describing attributes.", "properties": {"text": {"description": "The text to search for in the output.", "title": "Text", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["text"], "title": "base_has_text_model", "type": "object"}, "base_is_valid_xml_model": {"additionalProperties": false, "description": "base model for is_valid_xml describing attributes.", "properties": {}, "title": "base_is_valid_xml_model", "type": "object"}, "base_not_has_text_model": {"additionalProperties": false, "description": "base model for not_has_text describing attributes.", "properties": {"text": {"description": "The text to search for in the output.", "title": "Text", "type": "string"}}, "required": ["text"], "title": "base_not_has_text_model", "type": "object"}, "base_xml_element_model": {"additionalProperties": false, "description": "base model for xml_element describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "attribute": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "The XML attribute name to test against from the target XML element.", "title": "Attribute"}, "all": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "Check the sub-assertions for all paths matching the path. Default: false, i.e. only the first ", "title": "All"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "children": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"type": "null"}], "default": null}, "asserts": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"type": "null"}], "default": null}}, "required": ["path"], "title": "base_xml_element_model", "type": "object"}, "element_text_is_model": {"additionalProperties": false, "description": "Asserts the text of the XML element with the specified XPath-like ``path`` is\nthe specified ``text``.\n\nFor example:\n\n```xml\n\n```\n\nThe assertion implicitly also asserts that an element matching ``path`` exists.\nWith ``negate`` the result of the assertion (on the equality) can be inverted (the\nimplicit assertion on the existence of the path is not affected).", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "text": {"description": "The expected element text (body of the XML tag) to test against on the target XML element", "title": "Text", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "element_text_is", "default": "element_text_is", "title": "That", "type": "string"}}, "required": ["path", "text"], "title": "element_text_is_model", "type": "object"}, "element_text_is_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"element_text_is": {"$ref": "#/$defs/base_element_text_is_model"}}, "required": ["element_text_is"], "title": "element_text_is_model_nested", "type": "object"}, "element_text_matches_model": {"additionalProperties": false, "description": "Asserts the text of the XML element with the specified XPath-like ``path``\nmatches the regular expression defined by ``expression``.\n\nFor example:\n\n```xml\n\n```\n\nThe assertion implicitly also asserts that an element matching ``path`` exists.\nWith ``negate`` the result of the assertion (on the matching) can be inverted (the\nimplicit assertion on the existence of the path is not affected).", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "expression": {"description": "The regular expressions to apply against the target element.", "title": "Expression", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "element_text_matches", "default": "element_text_matches", "title": "That", "type": "string"}}, "required": ["path", "expression"], "title": "element_text_matches_model", "type": "object"}, "element_text_matches_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"element_text_matches": {"$ref": "#/$defs/base_element_text_matches_model"}}, "required": ["element_text_matches"], "title": "element_text_matches_model_nested", "type": "object"}, "element_text_model": {"additionalProperties": false, "description": "This tag allows the developer to recurisively specify additional assertions as\nchild elements about just the text contained in the element specified by the\nXPath-like ``path``, e.g.\n\n```xml\n\n \n\n```\n\nThe assertion implicitly also asserts that an element matching ``path`` exists.\nWith ``negate`` the result of the implicit assertions can be inverted.\nThe sub-assertions, which have their own ``negate`` attribute, are not affected\nby ``negate``.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "children": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"type": "null"}], "default": null}, "asserts": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"type": "null"}], "default": null}, "that": {"const": "element_text", "default": "element_text", "title": "That", "type": "string"}}, "required": ["path"], "title": "element_text_model", "type": "object"}, "element_text_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"element_text": {"$ref": "#/$defs/base_element_text_model"}}, "required": ["element_text"], "title": "element_text_model_nested", "type": "object"}, "has_archive_member_model": {"additionalProperties": false, "description": "This tag allows to check if ``path`` is contained in a compressed file.\n\nThe path is a regular expression that is matched against the full paths of the objects in\nthe compressed file (remember that \"matching\" means it is checked if a prefix of\nthe full path of an archive member is described by the regular expression).\nValid archive formats include ``.zip``, ``.tar``, and ``.tar.gz``. Note that\ndepending on the archive creation method:\n\n- full paths of the members may be prefixed with ``./``\n- directories may be treated as empty files\n\n```xml\n\n```\n\nWith ``n`` and ``delta`` (or ``min`` and ``max``) assertions on the number of\narchive members matching ``path`` can be expressed. The following could be used,\ne.g., to assert an archive containing n±1 elements out of which at least\n4 need to have a ``txt`` extension.\n\n```xml\n\n\n```\n\nIn addition the tag can contain additional assertions as child elements about\nthe first member in the archive matching the regular expression ``path``. For\ninstance\n\n```xml\n\n \n\n```\n\nIf the ``all`` attribute is set to ``true`` then all archive members are subject\nto the assertions. Note that, archive members matching the ``path`` are sorted\nalphabetically.\n\nThe ``negate`` attribute of the ``has_archive_member`` assertion only affects\nthe asserts on the presence and number of matching archive members, but not any\nsub-assertions (which can offer the ``negate`` attribute on their own). The\ncheck if the file is an archive at all, which is also done by the function, is\nnot affected.", "properties": {"path": {"description": "The regular expression specifying the archive member.", "title": "Path", "type": "string"}, "all": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "Check the sub-assertions for all paths matching the path. Default: false, i.e. only the first", "title": "All"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "children": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"type": "null"}], "default": null}, "asserts": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"type": "null"}], "default": null}, "that": {"const": "has_archive_member", "default": "has_archive_member", "title": "That", "type": "string"}}, "required": ["path"], "title": "has_archive_member_model", "type": "object"}, "has_archive_member_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_archive_member": {"$ref": "#/$defs/base_has_archive_member_model"}}, "required": ["has_archive_member"], "title": "has_archive_member_model_nested", "type": "object"}, "has_element_with_path_model": {"additionalProperties": false, "description": "Asserts the XML output contains at least one element (or tag) with the specified\nXPath-like ``path``, e.g.\n\n```xml\n\n```\n\nWith ``negate`` the result of the assertion can be inverted.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_element_with_path", "default": "has_element_with_path", "title": "That", "type": "string"}}, "required": ["path"], "title": "has_element_with_path_model", "type": "object"}, "has_element_with_path_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_element_with_path": {"$ref": "#/$defs/base_has_element_with_path_model"}}, "required": ["has_element_with_path"], "title": "has_element_with_path_model_nested", "type": "object"}, "has_h5_attribute_model": {"additionalProperties": false, "description": "Asserts HDF5 output contains the specified ``value`` for an attribute (``key``), e.g.\n\n```xml\n\n```", "properties": {"key": {"description": "HDF5 attribute to check value of.", "title": "Key", "type": "string"}, "value": {"description": "Expected value of HDF5 attribute to check.", "title": "Value", "type": "string"}, "that": {"const": "has_h5_attribute", "default": "has_h5_attribute", "title": "That", "type": "string"}}, "required": ["key", "value"], "title": "has_h5_attribute_model", "type": "object"}, "has_h5_attribute_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_h5_attribute": {"$ref": "#/$defs/base_has_h5_attribute_model"}}, "required": ["has_h5_attribute"], "title": "has_h5_attribute_model_nested", "type": "object"}, "has_h5_keys_model": {"additionalProperties": false, "description": "Asserts the specified HDF5 output has the given keys.", "properties": {"keys": {"description": "HDF5 attributes to check value of as a comma-separated string.", "title": "Keys", "type": "string"}, "that": {"const": "has_h5_keys", "default": "has_h5_keys", "title": "That", "type": "string"}}, "required": ["keys"], "title": "has_h5_keys_model", "type": "object"}, "has_h5_keys_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_h5_keys": {"$ref": "#/$defs/base_has_h5_keys_model"}}, "required": ["has_h5_keys"], "title": "has_h5_keys_model_nested", "type": "object"}, "has_image_center_of_mass_model": {"additionalProperties": false, "description": "Asserts the specified output is an image and has the specified center of mass.\n\nAsserts the output is an image and has a specific center of mass,\nor has an Euclidean distance of ``eps`` or less to that point (e.g.,\n````).", "properties": {"center_of_mass": {"description": "The required center of mass of the image intensities (horizontal and vertical coordinate, separated by a comma).", "title": "Center Of Mass", "type": "string"}, "channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "eps": {"anyOf": [{"type": "integer"}, {"type": "number"}], "default": 0.01, "description": "The maximum allowed Euclidean distance to the required center of mass (defaults to ``0.01``).", "title": "Eps"}, "that": {"const": "has_image_center_of_mass", "default": "has_image_center_of_mass", "title": "That", "type": "string"}}, "required": ["center_of_mass"], "title": "has_image_center_of_mass_model", "type": "object"}, "has_image_center_of_mass_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_center_of_mass": {"$ref": "#/$defs/base_has_image_center_of_mass_model"}}, "required": ["has_image_center_of_mass"], "title": "has_image_center_of_mass_model_nested", "type": "object"}, "has_image_channels_model": {"additionalProperties": false, "description": "Asserts the output is an image and has a specific number of channels.\n\nThe number of channels is plus/minus ``delta`` (e.g., ````).\n\nAlternatively the range of the expected number of channels can be specified by ``min`` and/or ``max``.", "properties": {"channels": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected number of channels of the image.", "title": "Channels"}, "delta": {"default": 0, "description": "Maximum allowed difference of the number of channels (default is 0). The observed number of channels has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed number of channels.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed number of channels.", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_image_channels", "default": "has_image_channels", "title": "That", "type": "string"}}, "title": "has_image_channels_model", "type": "object"}, "has_image_channels_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_channels": {"$ref": "#/$defs/base_has_image_channels_model"}}, "required": ["has_image_channels"], "title": "has_image_channels_model_nested", "type": "object"}, "has_image_depth_model": {"additionalProperties": false, "description": "Asserts the output is an image and has a specific depth (number of slices).\n\nThe depth is plus/minus ``delta`` (e.g., ````).\nAlternatively the range of the expected depth can be specified by ``min`` and/or ``max``.", "properties": {"depth": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected depth of the image (number of slices).", "title": "Depth"}, "delta": {"default": 0, "description": "Maximum allowed difference of the image depth (number of slices, default is 0). The observed depth has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed depth of the image (number of slices).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed depth of the image (number of slices).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_image_depth", "default": "has_image_depth", "title": "That", "type": "string"}}, "title": "has_image_depth_model", "type": "object"}, "has_image_depth_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_depth": {"$ref": "#/$defs/base_has_image_depth_model"}}, "required": ["has_image_depth"], "title": "has_image_depth_model_nested", "type": "object"}, "has_image_frames_model": {"additionalProperties": false, "description": "Asserts the output is an image and has a specific number of frames (number of time steps).\n\nThe number of frames is plus/minus ``delta`` (e.g., ````).\nAlternatively the range of the expected number of frames can be specified by ``min`` and/or ``max``.", "properties": {"frames": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected number of frames in the image sequence (number of time steps).", "title": "Frames"}, "delta": {"default": 0, "description": "Maximum allowed difference of the number of frames in the image sequence (number of time steps, default is 0). The observed number of frames has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed number of frames in the image sequence (number of time steps).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed number of frames in the image sequence (number of time steps).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_image_frames", "default": "has_image_frames", "title": "That", "type": "string"}}, "title": "has_image_frames_model", "type": "object"}, "has_image_frames_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_frames": {"$ref": "#/$defs/base_has_image_frames_model"}}, "required": ["has_image_frames"], "title": "has_image_frames_model_nested", "type": "object"}, "has_image_height_model": {"additionalProperties": false, "description": "Asserts the output is an image and has a specific height (in pixels).\n\nThe height is plus/minus ``delta`` (e.g., ````).\nAlternatively the range of the expected height can be specified by ``min`` and/or ``max``.", "properties": {"height": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected height of the image (in pixels).", "title": "Height"}, "delta": {"default": 0, "description": "Maximum allowed difference of the image height (in pixels, default is 0). The observed height has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed height of the image (in pixels).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed height of the image (in pixels).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_image_height", "default": "has_image_height", "title": "That", "type": "string"}}, "title": "has_image_height_model", "type": "object"}, "has_image_height_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_height": {"$ref": "#/$defs/base_has_image_height_model"}}, "required": ["has_image_height"], "title": "has_image_height_model_nested", "type": "object"}, "has_image_mean_intensity_model": {"additionalProperties": false, "description": "Asserts the output is an image and has a specific mean intensity value.\n\nThe mean intensity value is plus/minus ``eps`` (e.g., ````).\nAlternatively the range of the expected mean intensity value can be specified by ``min`` and/or ``max``.", "properties": {"channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "mean_intensity": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "The required mean value of the image intensities.", "title": "Mean Intensity"}, "eps": {"anyOf": [{"type": "integer"}, {"type": "number"}], "default": 0.01, "description": "The absolute tolerance to be used for ``value`` (defaults to ``0.01``). The observed mean value of the image intensities has to be in the range ``value +- eps``.", "title": "Eps"}, "min": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "A lower bound of the required mean value of the image intensities.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "An upper bound of the required mean value of the image intensities.", "title": "Max"}, "that": {"const": "has_image_mean_intensity", "default": "has_image_mean_intensity", "title": "That", "type": "string"}}, "title": "has_image_mean_intensity_model", "type": "object"}, "has_image_mean_intensity_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_mean_intensity": {"$ref": "#/$defs/base_has_image_mean_intensity_model"}}, "required": ["has_image_mean_intensity"], "title": "has_image_mean_intensity_model_nested", "type": "object"}, "has_image_mean_object_size_model": {"additionalProperties": false, "description": "Asserts the output is an image with labeled objects which have the specified mean size (number of pixels),\n\nThe mean size is plus/minus ``eps`` (e.g., ````).\n\nThe labels must be unique.", "properties": {"channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "labels": {"anyOf": [{"items": {"type": "integer"}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels, separated by a comma. Labels *not* on this list will be excluded from consideration. Cannot be used in combination with ``exclude_labels``.", "title": "Labels"}, "exclude_labels": {"anyOf": [{"items": {"type": "integer"}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels to be excluded from consideration, separated by a comma. The primary usage of this attribute is to exclude the background of a label image. Cannot be used in combination with ``labels``.", "title": "Exclude Labels"}, "mean_object_size": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "The required mean size of the uniquely labeled objects.", "title": "Mean Object Size"}, "eps": {"anyOf": [{"type": "integer"}, {"type": "number"}], "default": 0.01, "description": "The absolute tolerance to be used for ``value`` (defaults to ``0.01``). The observed mean size of the uniquely labeled objects has to be in the range ``value +- eps``.", "title": "Eps"}, "min": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "A lower bound of the required mean size of the uniquely labeled objects.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "An upper bound of the required mean size of the uniquely labeled objects.", "title": "Max"}, "that": {"const": "has_image_mean_object_size", "default": "has_image_mean_object_size", "title": "That", "type": "string"}}, "title": "has_image_mean_object_size_model", "type": "object"}, "has_image_mean_object_size_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_mean_object_size": {"$ref": "#/$defs/base_has_image_mean_object_size_model"}}, "required": ["has_image_mean_object_size"], "title": "has_image_mean_object_size_model_nested", "type": "object"}, "has_image_n_labels_model": {"additionalProperties": false, "description": "Asserts the output is an image and has the specified labels.\n\nLabels can be a number of labels or unique values (e.g.,\n````).\n\nThe primary usage of this assertion is to verify the number of objects in images with uniquely labeled objects.", "properties": {"channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "labels": {"anyOf": [{"items": {"type": "integer"}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels, separated by a comma. Labels *not* on this list will be excluded from consideration. Cannot be used in combination with ``exclude_labels``.", "title": "Labels"}, "exclude_labels": {"anyOf": [{"items": {"type": "integer"}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels to be excluded from consideration, separated by a comma. The primary usage of this attribute is to exclude the background of a label image. Cannot be used in combination with ``labels``.", "title": "Exclude Labels"}, "n": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected number of labels.", "title": "N"}, "delta": {"default": 0, "description": "Maximum allowed difference of the number of labels (default is 0). The observed number of labels has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed number of labels.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed number of labels.", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_image_n_labels", "default": "has_image_n_labels", "title": "That", "type": "string"}}, "title": "has_image_n_labels_model", "type": "object"}, "has_image_n_labels_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_n_labels": {"$ref": "#/$defs/base_has_image_n_labels_model"}}, "required": ["has_image_n_labels"], "title": "has_image_n_labels_model_nested", "type": "object"}, "has_image_width_model": {"additionalProperties": false, "description": "Asserts the output is an image and has a specific width (in pixels).\n\nThe width is plus/minus ``delta`` (e.g., ````).\nAlternatively the range of the expected width can be specified by ``min`` and/or ``max``.", "properties": {"width": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected width of the image (in pixels).", "title": "Width"}, "delta": {"default": 0, "description": "Maximum allowed difference of the image width (in pixels, default is 0). The observed width has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed width of the image (in pixels).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed width of the image (in pixels).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_image_width", "default": "has_image_width", "title": "That", "type": "string"}}, "title": "has_image_width_model", "type": "object"}, "has_image_width_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_width": {"$ref": "#/$defs/base_has_image_width_model"}}, "required": ["has_image_width"], "title": "has_image_width_model_nested", "type": "object"}, "has_json_property_with_text_model": {"additionalProperties": false, "description": "Asserts the JSON document contains a property or key with the specified text (i.e. string) value.\n\n```xml\n\n```", "properties": {"property": {"description": "The property name to search the JSON document for.", "title": "Property", "type": "string"}, "text": {"description": "The expected text value of the target JSON attribute.", "title": "Text", "type": "string"}, "that": {"const": "has_json_property_with_text", "default": "has_json_property_with_text", "title": "That", "type": "string"}}, "required": ["property", "text"], "title": "has_json_property_with_text_model", "type": "object"}, "has_json_property_with_text_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_json_property_with_text": {"$ref": "#/$defs/base_has_json_property_with_text_model"}}, "required": ["has_json_property_with_text"], "title": "has_json_property_with_text_model_nested", "type": "object"}, "has_json_property_with_value_model": {"additionalProperties": false, "description": "Asserts the JSON document contains a property or key with the specified JSON value.\n\n```xml\n\n```", "properties": {"property": {"description": "The property name to search the JSON document for.", "title": "Property", "type": "string"}, "value": {"description": "The expected JSON value of the target JSON attribute (as a JSON encoded string).", "title": "Value", "type": "string"}, "that": {"const": "has_json_property_with_value", "default": "has_json_property_with_value", "title": "That", "type": "string"}}, "required": ["property", "value"], "title": "has_json_property_with_value_model", "type": "object"}, "has_json_property_with_value_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_json_property_with_value": {"$ref": "#/$defs/base_has_json_property_with_value_model"}}, "required": ["has_json_property_with_value"], "title": "has_json_property_with_value_model_nested", "type": "object"}, "has_line_matching_model": {"additionalProperties": false, "description": "Asserts the specified output contains a line matching the\nregular expression specified by the argument expression. If n is given\nthe assertion checks for exactly n occurrences.", "properties": {"expression": {"description": "The regular expressions to attempt match in the output.", "title": "Expression", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_line_matching", "default": "has_line_matching", "title": "That", "type": "string"}}, "required": ["expression"], "title": "has_line_matching_model", "type": "object"}, "has_line_matching_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_line_matching": {"$ref": "#/$defs/base_has_line_matching_model"}}, "required": ["has_line_matching"], "title": "has_line_matching_model_nested", "type": "object"}, "has_line_model": {"additionalProperties": false, "description": "Asserts the specified output contains the line specified by the\nargument line. The exact number of occurrences can be optionally\nspecified by the argument n", "properties": {"line": {"description": "The full line of text to search for in the output.", "title": "Line", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_line", "default": "has_line", "title": "That", "type": "string"}}, "required": ["line"], "title": "has_line_model", "type": "object"}, "has_line_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_line": {"$ref": "#/$defs/base_has_line_model"}}, "required": ["has_line"], "title": "has_line_model_nested", "type": "object"}, "has_n_columns_model": {"additionalProperties": false, "description": "Asserts tabular output contains the specified\nnumber (``n``) of columns.\n\nFor instance, ````. The assertion tests only the first line.\nNumber of columns can optionally also be specified with ``delta``. Alternatively the\nrange of expected occurrences can be specified by ``min`` and/or ``max``.\n\nOptionally a column separator (``sep``, default is `` ``) `and comment character(s)\ncan be specified (``comment``, default is empty string). The first non-comment\nline is used for determining the number of columns.", "properties": {"n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "sep": {"default": "\t", "description": "Separator defining columns, default: tab", "title": "Sep", "type": "string"}, "comment": {"default": "", "description": "Comment character(s) used to skip comment lines (which should not be used for counting columns)", "title": "Comment", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_n_columns", "default": "has_n_columns", "title": "That", "type": "string"}}, "title": "has_n_columns_model", "type": "object"}, "has_n_columns_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_n_columns": {"$ref": "#/$defs/base_has_n_columns_model"}}, "required": ["has_n_columns"], "title": "has_n_columns_model_nested", "type": "object"}, "has_n_elements_with_path_model": {"additionalProperties": false, "description": "Asserts the XML output contains the specified number (``n``, optionally with ``delta``) of elements (or\ntags) with the specified XPath-like ``path``.\n\nFor example:\n\n```xml\n\n```\n\nAlternatively to ``n`` and ``delta`` also the ``min`` and ``max`` attributes\ncan be used to specify the range of the expected number of occurrences.\nWith ``negate`` the result of the assertion can be inverted.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_n_elements_with_path", "default": "has_n_elements_with_path", "title": "That", "type": "string"}}, "required": ["path"], "title": "has_n_elements_with_path_model", "type": "object"}, "has_n_elements_with_path_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_n_elements_with_path": {"$ref": "#/$defs/base_has_n_elements_with_path_model"}}, "required": ["has_n_elements_with_path"], "title": "has_n_elements_with_path_model_nested", "type": "object"}, "has_n_lines_model": {"additionalProperties": false, "description": "Asserts the specified output contains ``n`` lines allowing\nfor a difference in the number of lines (delta)\nor relative differebce in the number of lines", "properties": {"n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_n_lines", "default": "has_n_lines", "title": "That", "type": "string"}}, "title": "has_n_lines_model", "type": "object"}, "has_n_lines_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_n_lines": {"$ref": "#/$defs/base_has_n_lines_model"}}, "required": ["has_n_lines"], "title": "has_n_lines_model_nested", "type": "object"}, "has_size_model": {"additionalProperties": false, "description": "Asserts the specified output has a size of the specified value\n\nAttributes size and value or synonyms though value is considered deprecated.\nThe size optionally allows for absolute (``delta``) difference.", "properties": {"value": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Deprecated alias for `size`", "title": "Value"}, "size": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired size of the output (in bytes), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Size"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_size", "default": "has_size", "title": "That", "type": "string"}}, "title": "has_size_model", "type": "object"}, "has_size_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_size": {"$ref": "#/$defs/base_has_size_model"}}, "required": ["has_size"], "title": "has_size_model_nested", "type": "object"}, "has_text_matching_model": {"additionalProperties": false, "description": "Asserts the specified output contains text matching the\nregular expression specified by the argument expression.\nIf n is given the assertion checks for exactly n (nonoverlapping)\noccurrences.", "properties": {"expression": {"description": "The regular expressions to attempt match in the output.", "title": "Expression", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_text_matching", "default": "has_text_matching", "title": "That", "type": "string"}}, "required": ["expression"], "title": "has_text_matching_model", "type": "object"}, "has_text_matching_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_text_matching": {"$ref": "#/$defs/base_has_text_matching_model"}}, "required": ["has_text_matching"], "title": "has_text_matching_model_nested", "type": "object"}, "has_text_model": {"additionalProperties": false, "description": "Asserts specified output contains the substring specified by\nthe argument text. The exact number of occurrences can be\noptionally specified by the argument n", "properties": {"text": {"description": "The text to search for in the output.", "title": "Text", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_text", "default": "has_text", "title": "That", "type": "string"}}, "required": ["text"], "title": "has_text_model", "type": "object"}, "has_text_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_text": {"$ref": "#/$defs/base_has_text_model"}}, "required": ["has_text"], "title": "has_text_model_nested", "type": "object"}, "is_valid_xml_model": {"additionalProperties": false, "description": "Asserts the output is a valid XML file (e.g. ````).", "properties": {"that": {"const": "is_valid_xml", "default": "is_valid_xml", "title": "That", "type": "string"}}, "title": "is_valid_xml_model", "type": "object"}, "is_valid_xml_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"is_valid_xml": {"$ref": "#/$defs/base_is_valid_xml_model"}}, "required": ["is_valid_xml"], "title": "is_valid_xml_model_nested", "type": "object"}, "not_has_text_model": {"additionalProperties": false, "description": "Asserts specified output does not contain the substring\nspecified by the argument text", "properties": {"text": {"description": "The text to search for in the output.", "title": "Text", "type": "string"}, "that": {"const": "not_has_text", "default": "not_has_text", "title": "That", "type": "string"}}, "required": ["text"], "title": "not_has_text_model", "type": "object"}, "not_has_text_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"not_has_text": {"$ref": "#/$defs/base_not_has_text_model"}}, "required": ["not_has_text"], "title": "not_has_text_model_nested", "type": "object"}, "xml_element_model": {"additionalProperties": false, "description": "Assert if the XML file contains element(s) or tag(s) with the specified\n[XPath-like ``path``](https://lxml.de/xpathxslt.html). If ``n`` and ``delta``\nor ``min`` and ``max`` are given also the number of occurrences is checked.\n\n```xml\n\n \n \n \n\n```\n\nWith ``negate=\"true\"`` the outcome of the assertions wrt the presence and number\nof ``path`` can be negated. If there are any sub assertions then check them against\n\n- the content of the attribute ``attribute``\n- the element's text if no attribute is given\n\n```xml\n\n \n \n \n\n```\n\nSub-assertions are not subject to the ``negate`` attribute of ``xml_element``.\nIf ``all`` is ``true`` then the sub assertions are checked for all occurrences.\n\nNote that all other XML assertions can be expressed by this assertion (Galaxy\nalso implements the other assertions by calling this one).", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "attribute": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "The XML attribute name to test against from the target XML element.", "title": "Attribute"}, "all": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "Check the sub-assertions for all paths matching the path. Default: false, i.e. only the first ", "title": "All"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "children": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"type": "null"}], "default": null}, "asserts": {"anyOf": [{"$ref": "#/$defs/RootModel_List_Union_Annotated_Union_has_line_model__has_line_matching_model__has_n_lines_model__has_text_model__has_text_matching_model__not_has_text_model__has_n_columns_model__attribute_is_model__attribute_matches_model__element_text_model__element_text_is_model__element_text_matches_model__has_element_with_path_model__has_n_elements_with_path_model__is_valid_xml_model__xml_element_model__has_json_property_with_text_model__has_json_property_with_value_model__has_h5_attribute_model__has_h5_keys_model__has_archive_member_model__has_size_model__has_image_center_of_mass_model__has_image_channels_model__has_image_depth_model__has_image_frames_model__has_image_height_model__has_image_mean_intensity_model__has_image_mean_object_size_model__has_image_n_labels_model__has_image_width_model___FieldInfo_annotation_NoneType__required_True__discriminator__that_____has_line_model_nested__has_line_matching_model_nested__has_n_lines_model_nested__has_text_model_nested__has_text_matching_model_nested__not_has_text_model_nested__has_n_columns_model_nested__attribute_is_model_nested__attribute_matches_model_nested__element_text_model_nested__element_text_is_model_nested__element_text_matches_model_nested__has_element_with_path_model_nested__has_n_elements_with_path_model_nested__is_valid_xml_model_nested__xml_element_model_nested__has_json_property_with_text_model_nested__has_json_property_with_value_model_nested__has_h5_attribute_model_nested__has_h5_keys_model_nested__has_archive_member_model_nested__has_size_model_nested__has_image_center_of_mass_model_nested__has_image_channels_model_nested__has_image_depth_model_nested__has_image_frames_model_nested__has_image_height_model_nested__has_image_mean_intensity_model_nested__has_image_mean_object_size_model_nested__has_image_n_labels_model_nested__has_image_width_model_nested___"}, {"type": "null"}], "default": null}, "that": {"const": "xml_element", "default": "xml_element", "title": "That", "type": "string"}}, "required": ["path"], "title": "xml_element_model", "type": "object"}, "xml_element_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"xml_element": {"$ref": "#/$defs/base_xml_element_model"}}, "required": ["xml_element"], "title": "xml_element_model_nested", "type": "object"}}, "additionalProperties": false, "properties": {"id": {"anyOf": [{"maxLength": 255, "minLength": 3, "type": "string"}, {"type": "null"}], "default": null, "description": "Unique identifier for the tool. Should be all lower-case and should not include whitespace.", "examples": ["my-cool-tool"], "title": "id"}, "version": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Version for the tool.", "examples": ["0.1.0"], "title": "version"}, "name": {"description": "The name of the tool, displayed in the tool menu. This is not the same as the tool id, which is a unique identifier for the tool.", "title": "name", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "The description is displayed in the tool menu immediately following the hyperlink for the tool.", "title": "description"}, "configfiles": {"anyOf": [{"items": {"$ref": "#/$defs/YamlTemplateConfigFile"}, "type": "array"}, {"type": "null"}], "default": null, "description": "A list of config files for this tool.", "title": "configfiles"}, "requirements": {"anyOf": [{"items": {"anyOf": [{"$ref": "#/$defs/JavascriptRequirement"}, {"$ref": "#/$defs/ResourceRequirement"}, {"$ref": "#/$defs/ContainerRequirement"}]}, "type": "array"}, {"type": "null"}], "default": [], "description": "A list of requirements needed to execute this tool. These can be javascript expressions, resource requirements or container images.", "title": "requirements"}, "shell_command": {"description": "A string that contains the command to be executed. Parameters can be referenced inside $().", "examples": ["head -n '$(inputs.n_lines)' '$(inputs.data_input.path)'"], "title": "shell_command", "type": "string"}, "inputs": {"default": [], "items": {"$ref": "#/$defs/YamlGalaxyToolParameter"}, "title": "inputs", "type": "array"}, "outputs": {"default": [], "items": {"discriminator": {"mapping": {"boolean": "#/$defs/ToolOutputBoolean", "collection": "#/$defs/IncomingToolOutputCollection", "data": "#/$defs/IncomingToolOutputDataset", "float": "#/$defs/ToolOutputFloat", "integer": "#/$defs/ToolOutputInteger", "text": "#/$defs/ToolOutputText"}, "propertyName": "type"}, "oneOf": [{"$ref": "#/$defs/IncomingToolOutputDataset"}, {"$ref": "#/$defs/IncomingToolOutputCollection"}, {"$ref": "#/$defs/ToolOutputText"}, {"$ref": "#/$defs/ToolOutputInteger"}, {"$ref": "#/$defs/ToolOutputFloat"}, {"$ref": "#/$defs/ToolOutputBoolean"}]}, "title": "outputs", "type": "array"}, "citations": {"anyOf": [{"items": {"$ref": "#/$defs/Citation"}, "type": "array"}, {"type": "null"}], "default": null, "title": "citations"}, "license": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "A full URI or a a short [SPDX](https://spdx.org/licenses/) identifier for a license for this tool wrapper. The tool wrapper license can be independent of the underlying tool license. This license covers the tool yaml and associated scripts shipped with the tool.", "examples": ["MIT"], "title": "license"}, "edam_operations": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "default": null, "title": "edam_operations"}, "edam_topics": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "default": null, "title": "edam_topics"}, "xrefs": {"anyOf": [{"items": {"$ref": "#/$defs/XrefDict"}, "type": "array"}, {"type": "null"}], "default": null, "title": "xrefs"}, "profile": {"anyOf": [{"type": "number"}, {"type": "null"}], "default": null, "title": "profile"}, "help": {"anyOf": [{"$ref": "#/$defs/HelpContent"}, {"type": "null"}], "default": null, "description": "Help text shown below the tool interface.", "title": "help"}, "tests": {"anyOf": [{"items": {"$ref": "#/$defs/YamlToolTest"}, "type": "array"}, {"type": "null"}], "default": null, "title": "tests"}, "class": {"const": "GalaxyUserTool", "title": "class_", "type": "string"}, "container": {"description": "Container image to use for this tool.", "examples": ["quay.io/biocontainers/python:3.13"], "title": "container", "type": "string"}}, "required": ["name", "shell_command", "class", "container"], "title": "UserToolSource", "type": "object"} +{"$defs": {"Citation": {"properties": {"type": {"title": "Type", "type": "string"}, "content": {"title": "Content", "type": "string"}}, "required": ["type", "content"], "title": "Citation", "type": "object"}, "CollectionAttributes": {"additionalProperties": false, "properties": {"collection_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Collection Type"}}, "title": "CollectionAttributes", "type": "object"}, "Container": {"properties": {"type": {"enum": ["docker", "singularity"], "title": "Type", "type": "string"}, "container_id": {"title": "Container Id", "type": "string"}}, "required": ["type", "container_id"], "title": "Container", "type": "object"}, "ContainerRequirement": {"properties": {"type": {"const": "container", "title": "Type", "type": "string"}, "container": {"$ref": "#/$defs/Container"}}, "required": ["type", "container"], "title": "ContainerRequirement", "type": "object"}, "EmptyFieldParameterValidatorModel": {"additionalProperties": false, "properties": {"type": {"const": "empty_field", "default": "empty_field", "title": "Type", "type": "string"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Message"}, "implicit": {"default": false, "title": "Implicit", "type": "boolean"}, "negate": {"default": false, "title": "Negate", "type": "boolean"}}, "title": "EmptyFieldParameterValidatorModel", "type": "object"}, "FilePatternDatasetCollectionDescription": {"properties": {"discover_via": {"const": "pattern", "title": "Discover Via", "type": "string"}, "format": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Format"}, "visible": {"title": "Visible", "type": "boolean"}, "assign_primary_output": {"title": "Assign Primary Output", "type": "boolean"}, "directory": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Directory"}, "recurse": {"title": "Recurse", "type": "boolean"}, "match_relative_path": {"title": "Match Relative Path", "type": "boolean"}, "sort_key": {"enum": ["filename", "name", "designation", "dbkey"], "title": "Sort Key", "type": "string"}, "sort_comp": {"enum": ["lexical", "numeric"], "title": "Sort Comp", "type": "string"}, "sort_reverse": {"default": false, "title": "Sort Reverse", "type": "boolean"}, "pattern": {"title": "Pattern", "type": "string"}}, "required": ["discover_via", "format", "visible", "assign_primary_output", "directory", "recurse", "match_relative_path", "sort_key", "sort_comp", "pattern"], "title": "FilePatternDatasetCollectionDescription", "type": "object"}, "HelpContent": {"properties": {"format": {"enum": ["restructuredtext", "plain_text", "markdown"], "title": "Format", "type": "string"}, "content": {"title": "Content", "type": "string"}}, "required": ["format", "content"], "title": "HelpContent", "type": "object"}, "InRangeParameterValidatorModel": {"additionalProperties": false, "properties": {"type": {"const": "in_range", "default": "in_range", "title": "Type", "type": "string"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Message"}, "implicit": {"default": false, "title": "Implicit", "type": "boolean"}, "min": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "Min"}, "max": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "Max"}, "exclude_min": {"default": false, "title": "Exclude Min", "type": "boolean"}, "exclude_max": {"default": false, "title": "Exclude Max", "type": "boolean"}, "negate": {"default": false, "title": "Negate", "type": "boolean"}}, "title": "InRangeParameterValidatorModel", "type": "object"}, "IncomingToolOutputCollection": {"properties": {"name": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Parameter name. Used when referencing parameter in workflows.", "title": "Name"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Output label. Will be used as dataset name in history.", "title": "Label"}, "hidden": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "description": "If true, the output will not be shown in the history.", "title": "Hidden"}, "type": {"const": "collection", "title": "Type", "type": "string"}, "structure": {"$ref": "#/$defs/ToolOutputCollectionStructure"}}, "required": ["type", "structure"], "title": "IncomingToolOutputCollection", "type": "object"}, "IncomingToolOutputDataset": {"properties": {"name": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Parameter name. Used when referencing parameter in workflows.", "title": "Name"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Output label. Will be used as dataset name in history.", "title": "Label"}, "hidden": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "description": "If true, the output will not be shown in the history.", "title": "Hidden"}, "type": {"const": "data", "title": "Type", "type": "string"}, "format": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "The short name for the output datatype.", "title": "Format"}, "format_source": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "This sets the data type of the output dataset(s) to be the same format as that of the specified tool input.", "title": "Format Source"}, "metadata_source": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "This copies the metadata information from the tool\u2019s input dataset to serve as default for information that cannot be detected from the output. One prominent use case is interval data with a non-standard column order that cannot be deduced from a header line, but which is known to be identical in the input and output datasets.", "title": "Metadata Source"}, "discover_datasets": {"anyOf": [{"items": {"anyOf": [{"$ref": "#/$defs/FilePatternDatasetCollectionDescription"}, {"$ref": "#/$defs/ToolProvidedMetadataDatasetCollection"}]}, "type": "array"}, {"type": "null"}], "default": null, "title": "Discover Datasets"}, "from_work_dir": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Relative path to a file produced by the tool in its working directory. Output\u2019s contents are set to this file\u2019s contents.", "title": "from_work_dir"}, "precreate_directory": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "Precreate Directory"}}, "required": ["type"], "title": "IncomingToolOutputDataset", "type": "object"}, "JavascriptRequirement": {"properties": {"type": {"const": "javascript", "title": "Type", "type": "string"}, "expression_lib": {"anyOf": [{"items": {"description": "Provide Javascript/ECMAScript 5.1 code here that will be available for expressions inside the `shell_command` field.", "examples": ["function pickValue() {\n if (inputs.conditional_parameter.test_parameter == \"a\") {\n return inputs.conditional_parameter.integer_parameter\n } else {\n return inputs.conditional_parameter.boolean_parameter\n }\n}"], "title": "expression_lib", "type": "string"}, "type": "array"}, {"type": "null"}], "title": "Expression Lib"}}, "required": ["type", "expression_lib"], "title": "JavascriptRequirement", "type": "object"}, "LengthParameterValidatorModel": {"additionalProperties": false, "properties": {"type": {"const": "length", "default": "length", "title": "Type", "type": "string"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Message"}, "implicit": {"default": false, "title": "Implicit", "type": "boolean"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Max"}, "negate": {"default": false, "title": "Negate", "type": "boolean"}}, "title": "LengthParameterValidatorModel", "type": "object"}, "NoOptionsParameterValidatorModel": {"additionalProperties": false, "properties": {"type": {"const": "no_options", "default": "no_options", "title": "Type", "type": "string"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Message"}, "implicit": {"default": false, "title": "Implicit", "type": "boolean"}, "negate": {"default": false, "title": "Negate", "type": "boolean"}}, "title": "NoOptionsParameterValidatorModel", "type": "object"}, "OutputCompareType": {"enum": ["diff", "re_match", "sim_size", "re_match_multiline", "contains", "image_diff"], "title": "OutputCompareType", "type": "string"}, "RegexParameterValidatorModel": {"additionalProperties": false, "description": "Check if a regular expression **matches** the value, i.e. appears\nat the beginning of the value. To enforce a match of the complete value use\n``$`` at the end of the expression. The expression is given is the content\nof the validator tag. Note that for ``selects`` each option is checked\nseparately.", "properties": {"type": {"const": "regex", "default": "regex", "title": "Type", "type": "string"}, "message": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Message"}, "implicit": {"default": false, "title": "Implicit", "type": "boolean"}, "negate": {"default": false, "title": "Negate", "type": "boolean"}, "expression": {"title": "Expression", "type": "string"}}, "required": ["expression"], "title": "RegexParameterValidatorModel", "type": "object"}, "ResourceRequirement": {"properties": {"type": {"const": "resource", "title": "Type", "type": "string"}, "cores_min": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": 1, "description": "Minimum reserved number of CPU cores.\nMay be a fractional value to indicate to a scheduling algorithm that one core can be allocated to multiple jobs. For example, a value of 0.25 indicates that up to 4 jobs may run in parallel on 1 core. A value of 1.25 means that up to 3 jobs can run on a 4 core system (4/1.25 \u2248 3).\nThe reported number of CPU cores reserved for the process is a non-zero integer calculated by rounding up the cores request to the next whole number.\n", "title": "Cores Min"}, "cores_max": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "Maximum reserved number of CPU cores.\nMay be a fractional value to indicate to a scheduling algorithm that one core can be allocated to multiple jobs. For example, a value of 0.25 indicates that up to 4 jobs may run in parallel on 1 core. A value of 1.25 means that up to 3 jobs can run on a 4 core system (4/1.25 \u2248 3).\nThe reported number of CPU cores reserved for the process is a non-zero integer calculated by rounding up the cores request to the next whole number.\n", "title": "Cores Max"}, "ram_min": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": 256, "description": "Minimum reserved RAM in mebibytes (2**20).\nMay be a fractional value. If so, the actual RAM request is rounded up to the next whole number. The reported amount of RAM reserved for the process is a non-zero integer.", "title": "Ram Min"}, "ram_max": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "Maximum reserved RAM in mebibytes (2**20).\nMay be a fractional value. If so, the actual RAM request is rounded up to the next whole number. The reported amount of RAM reserved for the process is a non-zero integer.", "title": "Ram Max"}, "tmpdir_min": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "Tmpdir Min"}, "tmpdir_max": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "Tmpdir Max"}, "cuda_version_min": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "Cuda Version Min"}, "cuda_compute_capability": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "Cuda Compute Capability"}, "gpu_memory_min": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "Gpu Memory Min"}, "cuda_device_count_min": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "Cuda Device Count Min"}, "cuda_device_count_max": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "Cuda Device Count Max"}, "shm_size": {"anyOf": [{"type": "number"}, {"type": "integer"}, {"type": "null"}], "default": null, "title": "Shm Size"}, "timelimit": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "Maximum time in seconds the tool is allowed to run. Job will be terminated if exceeded.", "title": "Timelimit"}}, "required": ["type"], "title": "ResourceRequirement", "type": "object"}, "TestCollectionCollectionElementAssertions": {"additionalProperties": false, "properties": {"class": {"anyOf": [{"const": "Collection", "type": "string"}, {"type": "null"}], "default": "Collection", "title": "Class"}, "elements": {"anyOf": [{"additionalProperties": {"oneOf": [{"$ref": "#/$defs/TestCollectionDatasetElementAssertions"}, {"$ref": "#/$defs/TestCollectionCollectionElementAssertions"}]}, "type": "object"}, {"type": "null"}], "default": null, "title": "Elements"}, "element_tests": {"anyOf": [{"additionalProperties": {"oneOf": [{"$ref": "#/$defs/TestCollectionDatasetElementAssertions"}, {"$ref": "#/$defs/TestCollectionCollectionElementAssertions"}]}, "type": "object"}, {"type": "null"}], "default": null, "title": "Element Tests"}}, "title": "TestCollectionCollectionElementAssertions", "type": "object"}, "TestCollectionDatasetElementAssertions": {"additionalProperties": false, "properties": {"file": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Name of the output file stored in the target `test-data` directory that will be used to compare against the results of executing the tool via the functional test framework.", "title": "File"}, "path": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Filesystem path to a local output file used for comparison.", "title": "Path"}, "location": {"anyOf": [{"format": "uri", "minLength": 1, "type": "string"}, {"type": "null"}], "default": null, "description": "URL that points to a remote output file that will be downloaded and used for output comparison. Use only when the file cannot be included in the `test-data` folder. May be combined with `file` (downloads when missing on disk) or used alone (filename inferred from the URL). A `checksum` is also used to verify the download when provided.", "title": "Location"}, "ftype": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "If specified, this value is checked against the corresponding output's data type. If these do not match, the test will fail.", "title": "File Type"}, "sort": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "description": "Applies only if `compare` is `diff`, `re_match` or `re_match_multiline`. Sorts the lines of the history data set before comparison; for `diff` and `re_match` the local file is also sorted. Useful for non-deterministic output.", "title": "Sort"}, "compare": {"anyOf": [{"$ref": "#/$defs/OutputCompareType"}, {"type": "null"}], "default": null, "description": "Comparison mode used when matching the output against the reference file.", "title": "Compare"}, "checksum": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "The target output's checksum should match the value specified here, in the form `hash_type$hash_value` (e.g. `sha1$8156d7ca0f46ed7abac98f82e36cfaddb2aca041`). Useful for large static files where uploading the whole file is inconvenient.", "title": "Checksum"}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "default": null, "description": "Mapping of metadata keys to expected values for this output.", "title": "Metadata"}, "asserts": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"$ref": "#/$defs/assertion_dict"}, {"type": "null"}], "default": null, "description": "Assertions about the content of the output.", "title": "Asserts"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "If `compare` is set to `sim_size`, the maximum allowed absolute size difference (in bytes) between the generated data set and the reference file in `test-data/`. Default is 10000 bytes. Can be combined with `delta_frac`.", "title": "Delta"}, "delta_frac": {"anyOf": [{"type": "number"}, {"type": "null"}], "default": null, "description": "If `compare` is set to `sim_size`, the maximum allowed relative size difference between the generated data set and the reference file in `test-data/`. 0.1 means the generated file can differ by at most 10%. Default is not to check for relative size difference. Can be combined with `delta`.", "title": "Delta Frac"}, "lines_diff": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Applies when `compare` is set to `diff`, `re_match`, or `contains`. For `diff`, the number of lines of difference to allow (a modified line counts as two: one added, one removed).", "title": "Lines Diff"}, "decompress": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "description": "If true, decompress files before comparison. Applies to assertions expressed with `assert_contents` or `compare` set to anything but `sim_size`. Useful for testing compressed outputs that are non-deterministic despite having deterministic decompressed contents. By default, only files compressed with bz2, gzip and zip are automatically decompressed.", "title": "Decompress"}, "class": {"anyOf": [{"const": "File", "type": "string"}, {"type": "null"}], "default": "File", "title": "Class"}}, "title": "TestCollectionDatasetElementAssertions", "type": "object"}, "TestCollectionOutputAssertions": {"additionalProperties": false, "properties": {"class": {"anyOf": [{"const": "Collection", "type": "string"}, {"type": "null"}], "default": "Collection", "title": "Class"}, "elements": {"anyOf": [{"additionalProperties": {"oneOf": [{"$ref": "#/$defs/TestCollectionDatasetElementAssertions"}, {"$ref": "#/$defs/TestCollectionCollectionElementAssertions"}]}, "type": "object"}, {"type": "null"}], "default": null, "title": "Elements"}, "element_tests": {"anyOf": [{"additionalProperties": {"oneOf": [{"$ref": "#/$defs/TestCollectionDatasetElementAssertions"}, {"$ref": "#/$defs/TestCollectionCollectionElementAssertions"}]}, "type": "object"}, {"type": "null"}], "default": null, "title": "Element Tests"}, "element_count": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Element Count"}, "attributes": {"anyOf": [{"$ref": "#/$defs/CollectionAttributes"}, {"type": "null"}], "default": null, "title": "Attributes"}, "collection_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Collection Type"}}, "title": "TestCollectionOutputAssertions", "type": "object"}, "TestDataOutputAssertions": {"additionalProperties": false, "properties": {"file": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Name of the output file stored in the target `test-data` directory that will be used to compare against the results of executing the tool via the functional test framework.", "title": "File"}, "path": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Filesystem path to a local output file used for comparison.", "title": "Path"}, "location": {"anyOf": [{"format": "uri", "minLength": 1, "type": "string"}, {"type": "null"}], "default": null, "description": "URL that points to a remote output file that will be downloaded and used for output comparison. Use only when the file cannot be included in the `test-data` folder. May be combined with `file` (downloads when missing on disk) or used alone (filename inferred from the URL). A `checksum` is also used to verify the download when provided.", "title": "Location"}, "ftype": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "If specified, this value is checked against the corresponding output's data type. If these do not match, the test will fail.", "title": "File Type"}, "sort": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "description": "Applies only if `compare` is `diff`, `re_match` or `re_match_multiline`. Sorts the lines of the history data set before comparison; for `diff` and `re_match` the local file is also sorted. Useful for non-deterministic output.", "title": "Sort"}, "compare": {"anyOf": [{"$ref": "#/$defs/OutputCompareType"}, {"type": "null"}], "default": null, "description": "Comparison mode used when matching the output against the reference file.", "title": "Compare"}, "checksum": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "The target output's checksum should match the value specified here, in the form `hash_type$hash_value` (e.g. `sha1$8156d7ca0f46ed7abac98f82e36cfaddb2aca041`). Useful for large static files where uploading the whole file is inconvenient.", "title": "Checksum"}, "metadata": {"anyOf": [{"additionalProperties": true, "type": "object"}, {"type": "null"}], "default": null, "description": "Mapping of metadata keys to expected values for this output.", "title": "Metadata"}, "asserts": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"$ref": "#/$defs/assertion_dict"}, {"type": "null"}], "default": null, "description": "Assertions about the content of the output.", "title": "Asserts"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "If `compare` is set to `sim_size`, the maximum allowed absolute size difference (in bytes) between the generated data set and the reference file in `test-data/`. Default is 10000 bytes. Can be combined with `delta_frac`.", "title": "Delta"}, "delta_frac": {"anyOf": [{"type": "number"}, {"type": "null"}], "default": null, "description": "If `compare` is set to `sim_size`, the maximum allowed relative size difference between the generated data set and the reference file in `test-data/`. 0.1 means the generated file can differ by at most 10%. Default is not to check for relative size difference. Can be combined with `delta`.", "title": "Delta Frac"}, "lines_diff": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Applies when `compare` is set to `diff`, `re_match`, or `contains`. For `diff`, the number of lines of difference to allow (a modified line counts as two: one added, one removed).", "title": "Lines Diff"}, "decompress": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "description": "If true, decompress files before comparison. Applies to assertions expressed with `assert_contents` or `compare` set to anything but `sim_size`. Useful for testing compressed outputs that are non-deterministic despite having deterministic decompressed contents. By default, only files compressed with bz2, gzip and zip are automatically decompressed.", "title": "Decompress"}, "class": {"anyOf": [{"const": "File", "type": "string"}, {"type": "null"}], "default": "File", "title": "Class"}}, "title": "TestDataOutputAssertions", "type": "object"}, "ToolOutputBoolean": {"properties": {"name": {"description": "Parameter name. Used when referencing parameter in workflows.", "title": "Name"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Output label. Will be used as dataset name in history.", "title": "Label"}, "hidden": {"description": "If true, the output will not be shown in the history.", "title": "Hidden"}, "type": {"const": "boolean", "title": "Type", "type": "string"}}, "required": ["name", "hidden", "type"], "title": "ToolOutputBoolean", "type": "object"}, "ToolOutputCollectionStructure": {"properties": {"collection_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Collection Type"}, "collection_type_source": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Collection Type Source"}, "collection_type_from_rules": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Collection Type From Rules"}, "structured_like": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Structured Like"}, "discover_datasets": {"anyOf": [{"items": {"anyOf": [{"$ref": "#/$defs/FilePatternDatasetCollectionDescription"}, {"$ref": "#/$defs/ToolProvidedMetadataDatasetCollection"}]}, "type": "array"}, {"type": "null"}], "default": null, "title": "Discover Datasets"}}, "title": "ToolOutputCollectionStructure", "type": "object"}, "ToolOutputFloat": {"properties": {"name": {"description": "Parameter name. Used when referencing parameter in workflows.", "title": "Name"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Output label. Will be used as dataset name in history.", "title": "Label"}, "hidden": {"description": "If true, the output will not be shown in the history.", "title": "Hidden"}, "type": {"const": "float", "title": "Type", "type": "string"}}, "required": ["name", "hidden", "type"], "title": "ToolOutputFloat", "type": "object"}, "ToolOutputInteger": {"properties": {"name": {"description": "Parameter name. Used when referencing parameter in workflows.", "title": "Name"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Output label. Will be used as dataset name in history.", "title": "Label"}, "hidden": {"description": "If true, the output will not be shown in the history.", "title": "Hidden"}, "type": {"const": "integer", "title": "Type", "type": "string"}}, "required": ["name", "hidden", "type"], "title": "ToolOutputInteger", "type": "object"}, "ToolOutputText": {"properties": {"name": {"description": "Parameter name. Used when referencing parameter in workflows.", "title": "Name"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Output label. Will be used as dataset name in history.", "title": "Label"}, "hidden": {"description": "If true, the output will not be shown in the history.", "title": "Hidden"}, "type": {"const": "text", "title": "Type", "type": "string"}}, "required": ["name", "hidden", "type"], "title": "ToolOutputText", "type": "object"}, "ToolProvidedMetadataDatasetCollection": {"properties": {"discover_via": {"const": "tool_provided_metadata", "title": "Discover Via", "type": "string"}, "format": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Format"}, "visible": {"title": "Visible", "type": "boolean"}, "assign_primary_output": {"title": "Assign Primary Output", "type": "boolean"}, "directory": {"anyOf": [{"type": "string"}, {"type": "null"}], "title": "Directory"}, "recurse": {"title": "Recurse", "type": "boolean"}, "match_relative_path": {"title": "Match Relative Path", "type": "boolean"}}, "required": ["discover_via", "format", "visible", "assign_primary_output", "directory", "recurse", "match_relative_path"], "title": "ToolProvidedMetadataDatasetCollection", "type": "object"}, "XrefDict": {"additionalProperties": false, "properties": {"value": {"title": "value", "type": "string"}, "type": {"title": "type", "type": "string"}}, "required": ["value", "type"], "title": "XrefDict", "type": "object"}, "YamlBooleanParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "boolean", "title": "Type", "type": "string"}, "value": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": false, "title": "Value"}}, "required": ["name", "type"], "title": "YamlBooleanParameter", "type": "object"}, "YamlColorParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "color", "title": "Type", "type": "string"}, "value": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Value"}}, "required": ["name", "type"], "title": "YamlColorParameter", "type": "object"}, "YamlConditionalParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "conditional", "title": "Type", "type": "string"}, "test_parameter": {"discriminator": {"mapping": {"boolean": "#/$defs/YamlBooleanParameter", "select": "#/$defs/YamlSelectParameter"}, "propertyName": "type"}, "oneOf": [{"$ref": "#/$defs/YamlBooleanParameter"}, {"$ref": "#/$defs/YamlSelectParameter"}], "title": "Test Parameter"}, "whens": {"items": {"$ref": "#/$defs/YamlConditionalWhen"}, "minItems": 1, "title": "Whens", "type": "array"}}, "required": ["name", "type", "test_parameter", "whens"], "title": "YamlConditionalParameter", "type": "object"}, "YamlConditionalWhen": {"additionalProperties": false, "properties": {"discriminator": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "title": "Discriminator"}, "parameters": {"default": [], "items": {"$ref": "#/$defs/YamlGalaxyToolParameter"}, "title": "Parameters", "type": "array"}}, "required": ["discriminator"], "title": "YamlConditionalWhen", "type": "object"}, "YamlDataCollectionParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "data_collection", "title": "Type", "type": "string"}, "collection_type": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Collection Type"}, "format": {"default": ["data"], "items": {"type": "string"}, "title": "Format", "type": "array"}}, "required": ["name", "type"], "title": "YamlDataCollectionParameter", "type": "object"}, "YamlDataParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "data", "title": "Type", "type": "string"}, "format": {"default": ["data"], "items": {"type": "string"}, "title": "Format", "type": "array"}, "multiple": {"default": false, "title": "Multiple", "type": "boolean"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Max"}}, "required": ["name", "type"], "title": "YamlDataParameter", "type": "object"}, "YamlFloatParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "float", "title": "Type", "type": "string"}, "value": {"anyOf": [{"type": "number"}, {"type": "null"}], "default": null, "title": "Value"}, "min": {"anyOf": [{"type": "number"}, {"type": "null"}], "default": null, "title": "Min"}, "max": {"anyOf": [{"type": "number"}, {"type": "null"}], "default": null, "title": "Max"}, "validators": {"default": [], "items": {"$ref": "#/$defs/InRangeParameterValidatorModel"}, "title": "Validators", "type": "array"}}, "required": ["name", "type"], "title": "YamlFloatParameter", "type": "object"}, "YamlGalaxyToolParameter": {"discriminator": {"mapping": {"boolean": "#/$defs/YamlBooleanParameter", "color": "#/$defs/YamlColorParameter", "conditional": "#/$defs/YamlConditionalParameter", "data": "#/$defs/YamlDataParameter", "data_collection": "#/$defs/YamlDataCollectionParameter", "float": "#/$defs/YamlFloatParameter", "integer": "#/$defs/YamlIntegerParameter", "repeat": "#/$defs/YamlRepeatParameter", "section": "#/$defs/YamlSectionParameter", "select": "#/$defs/YamlSelectParameter", "text": "#/$defs/YamlTextParameter"}, "propertyName": "type"}, "oneOf": [{"$ref": "#/$defs/YamlBooleanParameter"}, {"$ref": "#/$defs/YamlIntegerParameter"}, {"$ref": "#/$defs/YamlFloatParameter"}, {"$ref": "#/$defs/YamlTextParameter"}, {"$ref": "#/$defs/YamlSelectParameter"}, {"$ref": "#/$defs/YamlColorParameter"}, {"$ref": "#/$defs/YamlDataParameter"}, {"$ref": "#/$defs/YamlDataCollectionParameter"}, {"$ref": "#/$defs/YamlConditionalParameter"}, {"$ref": "#/$defs/YamlRepeatParameter"}, {"$ref": "#/$defs/YamlSectionParameter"}], "title": "YamlGalaxyToolParameter"}, "YamlIntegerParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "integer", "title": "Type", "type": "string"}, "value": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Value"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Max"}, "validators": {"default": [], "items": {"$ref": "#/$defs/InRangeParameterValidatorModel"}, "title": "Validators", "type": "array"}}, "required": ["name", "type"], "title": "YamlIntegerParameter", "type": "object"}, "YamlLabelValue": {"description": "YAML-friendly option model \u2014 ``selected`` defaults to ``False``.", "properties": {"label": {"title": "Label", "type": "string"}, "value": {"title": "Value", "type": "string"}, "selected": {"default": false, "title": "Selected", "type": "boolean"}}, "required": ["label", "value"], "title": "YamlLabelValue", "type": "object"}, "YamlRepeatParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "repeat", "title": "Type", "type": "string"}, "parameters": {"default": [], "items": {"$ref": "#/$defs/YamlGalaxyToolParameter"}, "title": "Parameters", "type": "array"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "title": "Max"}}, "required": ["name", "type"], "title": "YamlRepeatParameter", "type": "object"}, "YamlSectionParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "section", "title": "Type", "type": "string"}, "parameters": {"default": [], "items": {"$ref": "#/$defs/YamlGalaxyToolParameter"}, "title": "Parameters", "type": "array"}}, "required": ["name", "type"], "title": "YamlSectionParameter", "type": "object"}, "YamlSelectParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "select", "title": "Type", "type": "string"}, "options": {"items": {"$ref": "#/$defs/YamlLabelValue"}, "minItems": 1, "title": "Options", "type": "array"}, "multiple": {"default": false, "title": "Multiple", "type": "boolean"}, "validators": {"default": [], "items": {"$ref": "#/$defs/NoOptionsParameterValidatorModel"}, "title": "Validators", "type": "array"}}, "required": ["name", "type", "options"], "title": "YamlSelectParameter", "type": "object"}, "YamlTemplateConfigFile": {"properties": {"content": {"title": "Content", "type": "string"}, "name": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Name"}, "filename": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Filename"}, "eval_engine": {"const": "ecmascript", "default": "ecmascript", "title": "Eval Engine", "type": "string"}}, "required": ["content"], "title": "YamlTemplateConfigFile", "type": "object"}, "YamlTestCredential": {"additionalProperties": false, "properties": {"name": {"description": "Name of the credentials group.", "title": "Name", "type": "string"}, "variables": {"default": [], "description": "Variables exposed to the tool environment.", "items": {"$ref": "#/$defs/YamlTestCredentialValue"}, "title": "Variables", "type": "array"}, "secrets": {"default": [], "description": "Secrets exposed to the tool environment.", "items": {"$ref": "#/$defs/YamlTestCredentialValue"}, "title": "Secrets", "type": "array"}, "version": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Version of the credential definition.", "title": "Version"}}, "required": ["name"], "title": "YamlTestCredential", "type": "object"}, "YamlTestCredentialValue": {"additionalProperties": false, "properties": {"name": {"description": "Name of the credential variable or secret.", "title": "Name", "type": "string"}, "value": {"description": "Value of the credential variable or secret.", "title": "Value", "type": "string"}}, "required": ["name", "value"], "title": "YamlTestCredentialValue", "type": "object"}, "YamlTextParameter": {"additionalProperties": false, "properties": {"name": {"title": "Name", "type": "string"}, "label": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Label"}, "help": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Help"}, "optional": {"default": false, "title": "Optional", "type": "boolean"}, "type": {"const": "text", "title": "Type", "type": "string"}, "value": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "title": "Value"}, "area": {"default": false, "title": "Area", "type": "boolean"}, "validators": {"default": [], "items": {"anyOf": [{"$ref": "#/$defs/LengthParameterValidatorModel"}, {"$ref": "#/$defs/RegexParameterValidatorModel"}, {"$ref": "#/$defs/EmptyFieldParameterValidatorModel"}]}, "title": "Validators", "type": "array"}}, "required": ["name", "type"], "title": "YamlTextParameter", "type": "object"}, "YamlToolTest": {"additionalProperties": false, "description": "In-tool test case as authored in YAML tool fixtures.", "properties": {"doc": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Human-readable description of this test case.", "title": "Doc"}, "inputs": {"anyOf": [{"additionalProperties": {"anyOf": [{"type": "boolean"}, {"type": "integer"}, {"type": "number"}, {"type": "string"}, {"items": {}, "type": "array"}, {"additionalProperties": true, "type": "object"}]}, "type": "object"}, {"type": "null"}], "default": null, "description": "Mapping of input parameter names to test values.", "title": "Inputs"}, "outputs": {"additionalProperties": {"oneOf": [{"$ref": "#/$defs/TestCollectionOutputAssertions"}, {"$ref": "#/$defs/TestDataOutputAssertions"}, {"anyOf": [{"type": "boolean"}, {"type": "integer"}, {"type": "number"}, {"type": "string"}]}]}, "default": {}, "description": "Mapping of output names to expected values or assertions.", "title": "Outputs", "type": "object"}, "assert_stdout": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"$ref": "#/$defs/assertion_dict"}, {"type": "null"}], "default": null, "description": "Assertions to apply against the tool's standard output.", "title": "Assert Stdout"}, "assert_stderr": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"$ref": "#/$defs/assertion_dict"}, {"type": "null"}], "default": null, "description": "Assertions to apply against the tool's standard error.", "title": "Assert Stderr"}, "command": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"$ref": "#/$defs/assertion_dict"}, {"type": "null"}], "default": null, "description": "Assertions to apply against the executed command line.", "title": "Command"}, "expect_exit_code": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected process exit code.", "title": "Expect Exit Code"}, "expect_failure": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "description": "If true, the tool is expected to produce an error.", "title": "Expect Failure"}, "expect_test_failure": {"anyOf": [{"type": "boolean"}, {"type": "null"}], "default": null, "description": "If true, the test itself is expected to fail.", "title": "Expect Test Failure"}, "credentials": {"anyOf": [{"items": {"$ref": "#/$defs/YamlTestCredential"}, "type": "array"}, {"type": "null"}], "default": null, "description": "Credentials to inject for this test case.", "title": "Credentials"}}, "title": "YamlToolTest", "type": "object"}, "assertion_dict": {"additionalProperties": false, "properties": {"has_line": {"anyOf": [{"$ref": "#/$defs/base_has_line_model"}, {"type": "null"}], "default": null, "title": "Assert Has Line"}, "has_line_matching": {"anyOf": [{"$ref": "#/$defs/base_has_line_matching_model"}, {"type": "null"}], "default": null, "title": "Assert Has Line Matching"}, "has_n_lines": {"anyOf": [{"$ref": "#/$defs/base_has_n_lines_model"}, {"type": "null"}], "default": null, "title": "Assert Has N Lines"}, "has_text": {"anyOf": [{"$ref": "#/$defs/base_has_text_model"}, {"type": "null"}], "default": null, "title": "Assert Has Text"}, "has_text_matching": {"anyOf": [{"$ref": "#/$defs/base_has_text_matching_model"}, {"type": "null"}], "default": null, "title": "Assert Has Text Matching"}, "not_has_text": {"anyOf": [{"$ref": "#/$defs/base_not_has_text_model"}, {"type": "null"}], "default": null, "title": "Assert Not Has Text"}, "has_n_columns": {"anyOf": [{"$ref": "#/$defs/base_has_n_columns_model"}, {"type": "null"}], "default": null, "title": "Assert Has N Columns"}, "attribute_is": {"anyOf": [{"$ref": "#/$defs/base_attribute_is_model"}, {"type": "null"}], "default": null, "title": "Assert Attribute Is"}, "attribute_matches": {"anyOf": [{"$ref": "#/$defs/base_attribute_matches_model"}, {"type": "null"}], "default": null, "title": "Assert Attribute Matches"}, "element_text": {"anyOf": [{"$ref": "#/$defs/base_element_text_model"}, {"type": "null"}], "default": null, "title": "Assert Element Text"}, "element_text_is": {"anyOf": [{"$ref": "#/$defs/base_element_text_is_model"}, {"type": "null"}], "default": null, "title": "Assert Element Text Is"}, "element_text_matches": {"anyOf": [{"$ref": "#/$defs/base_element_text_matches_model"}, {"type": "null"}], "default": null, "title": "Assert Element Text Matches"}, "has_element_with_path": {"anyOf": [{"$ref": "#/$defs/base_has_element_with_path_model"}, {"type": "null"}], "default": null, "title": "Assert Has Element With Path"}, "has_n_elements_with_path": {"anyOf": [{"$ref": "#/$defs/base_has_n_elements_with_path_model"}, {"type": "null"}], "default": null, "title": "Assert Has N Elements With Path"}, "is_valid_xml": {"anyOf": [{"$ref": "#/$defs/base_is_valid_xml_model"}, {"type": "null"}], "default": null, "title": "Assert Is Valid Xml"}, "xml_element": {"anyOf": [{"$ref": "#/$defs/base_xml_element_model"}, {"type": "null"}], "default": null, "title": "Assert Xml Element"}, "has_json_property_with_text": {"anyOf": [{"$ref": "#/$defs/base_has_json_property_with_text_model"}, {"type": "null"}], "default": null, "title": "Assert Has Json Property With Text"}, "has_json_property_with_value": {"anyOf": [{"$ref": "#/$defs/base_has_json_property_with_value_model"}, {"type": "null"}], "default": null, "title": "Assert Has Json Property With Value"}, "has_h5_attribute": {"anyOf": [{"$ref": "#/$defs/base_has_h5_attribute_model"}, {"type": "null"}], "default": null, "title": "Assert Has H5 Attribute"}, "has_h5_keys": {"anyOf": [{"$ref": "#/$defs/base_has_h5_keys_model"}, {"type": "null"}], "default": null, "title": "Assert Has H5 Keys"}, "has_archive_member": {"anyOf": [{"$ref": "#/$defs/base_has_archive_member_model"}, {"type": "null"}], "default": null, "title": "Assert Has Archive Member"}, "has_size": {"anyOf": [{"$ref": "#/$defs/base_has_size_model"}, {"type": "null"}], "default": null, "title": "Assert Has Size"}, "has_image_center_of_mass": {"anyOf": [{"$ref": "#/$defs/base_has_image_center_of_mass_model"}, {"type": "null"}], "default": null, "title": "Assert Has Image Center Of Mass"}, "has_image_channels": {"anyOf": [{"$ref": "#/$defs/base_has_image_channels_model"}, {"type": "null"}], "default": null, "title": "Assert Has Image Channels"}, "has_image_depth": {"anyOf": [{"$ref": "#/$defs/base_has_image_depth_model"}, {"type": "null"}], "default": null, "title": "Assert Has Image Depth"}, "has_image_frames": {"anyOf": [{"$ref": "#/$defs/base_has_image_frames_model"}, {"type": "null"}], "default": null, "title": "Assert Has Image Frames"}, "has_image_height": {"anyOf": [{"$ref": "#/$defs/base_has_image_height_model"}, {"type": "null"}], "default": null, "title": "Assert Has Image Height"}, "has_image_mean_intensity": {"anyOf": [{"$ref": "#/$defs/base_has_image_mean_intensity_model"}, {"type": "null"}], "default": null, "title": "Assert Has Image Mean Intensity"}, "has_image_mean_object_size": {"anyOf": [{"$ref": "#/$defs/base_has_image_mean_object_size_model"}, {"type": "null"}], "default": null, "title": "Assert Has Image Mean Object Size"}, "has_image_n_labels": {"anyOf": [{"$ref": "#/$defs/base_has_image_n_labels_model"}, {"type": "null"}], "default": null, "title": "Assert Has Image N Labels"}, "has_image_width": {"anyOf": [{"$ref": "#/$defs/base_has_image_width_model"}, {"type": "null"}], "default": null, "title": "Assert Has Image Width"}}, "title": "assertion_dict", "type": "object"}, "assertion_list": {"items": {"anyOf": [{"discriminator": {"mapping": {"attribute_is": "#/$defs/attribute_is_model", "attribute_matches": "#/$defs/attribute_matches_model", "element_text": "#/$defs/element_text_model", "element_text_is": "#/$defs/element_text_is_model", "element_text_matches": "#/$defs/element_text_matches_model", "has_archive_member": "#/$defs/has_archive_member_model", "has_element_with_path": "#/$defs/has_element_with_path_model", "has_h5_attribute": "#/$defs/has_h5_attribute_model", "has_h5_keys": "#/$defs/has_h5_keys_model", "has_image_center_of_mass": "#/$defs/has_image_center_of_mass_model", "has_image_channels": "#/$defs/has_image_channels_model", "has_image_depth": "#/$defs/has_image_depth_model", "has_image_frames": "#/$defs/has_image_frames_model", "has_image_height": "#/$defs/has_image_height_model", "has_image_mean_intensity": "#/$defs/has_image_mean_intensity_model", "has_image_mean_object_size": "#/$defs/has_image_mean_object_size_model", "has_image_n_labels": "#/$defs/has_image_n_labels_model", "has_image_width": "#/$defs/has_image_width_model", "has_json_property_with_text": "#/$defs/has_json_property_with_text_model", "has_json_property_with_value": "#/$defs/has_json_property_with_value_model", "has_line": "#/$defs/has_line_model", "has_line_matching": "#/$defs/has_line_matching_model", "has_n_columns": "#/$defs/has_n_columns_model", "has_n_elements_with_path": "#/$defs/has_n_elements_with_path_model", "has_n_lines": "#/$defs/has_n_lines_model", "has_size": "#/$defs/has_size_model", "has_text": "#/$defs/has_text_model", "has_text_matching": "#/$defs/has_text_matching_model", "is_valid_xml": "#/$defs/is_valid_xml_model", "not_has_text": "#/$defs/not_has_text_model", "xml_element": "#/$defs/xml_element_model"}, "propertyName": "that"}, "oneOf": [{"$ref": "#/$defs/has_line_model"}, {"$ref": "#/$defs/has_line_matching_model"}, {"$ref": "#/$defs/has_n_lines_model"}, {"$ref": "#/$defs/has_text_model"}, {"$ref": "#/$defs/has_text_matching_model"}, {"$ref": "#/$defs/not_has_text_model"}, {"$ref": "#/$defs/has_n_columns_model"}, {"$ref": "#/$defs/attribute_is_model"}, {"$ref": "#/$defs/attribute_matches_model"}, {"$ref": "#/$defs/element_text_model"}, {"$ref": "#/$defs/element_text_is_model"}, {"$ref": "#/$defs/element_text_matches_model"}, {"$ref": "#/$defs/has_element_with_path_model"}, {"$ref": "#/$defs/has_n_elements_with_path_model"}, {"$ref": "#/$defs/is_valid_xml_model"}, {"$ref": "#/$defs/xml_element_model"}, {"$ref": "#/$defs/has_json_property_with_text_model"}, {"$ref": "#/$defs/has_json_property_with_value_model"}, {"$ref": "#/$defs/has_h5_attribute_model"}, {"$ref": "#/$defs/has_h5_keys_model"}, {"$ref": "#/$defs/has_archive_member_model"}, {"$ref": "#/$defs/has_size_model"}, {"$ref": "#/$defs/has_image_center_of_mass_model"}, {"$ref": "#/$defs/has_image_channels_model"}, {"$ref": "#/$defs/has_image_depth_model"}, {"$ref": "#/$defs/has_image_frames_model"}, {"$ref": "#/$defs/has_image_height_model"}, {"$ref": "#/$defs/has_image_mean_intensity_model"}, {"$ref": "#/$defs/has_image_mean_object_size_model"}, {"$ref": "#/$defs/has_image_n_labels_model"}, {"$ref": "#/$defs/has_image_width_model"}]}, {"$ref": "#/$defs/has_line_model_nested"}, {"$ref": "#/$defs/has_line_matching_model_nested"}, {"$ref": "#/$defs/has_n_lines_model_nested"}, {"$ref": "#/$defs/has_text_model_nested"}, {"$ref": "#/$defs/has_text_matching_model_nested"}, {"$ref": "#/$defs/not_has_text_model_nested"}, {"$ref": "#/$defs/has_n_columns_model_nested"}, {"$ref": "#/$defs/attribute_is_model_nested"}, {"$ref": "#/$defs/attribute_matches_model_nested"}, {"$ref": "#/$defs/element_text_model_nested"}, {"$ref": "#/$defs/element_text_is_model_nested"}, {"$ref": "#/$defs/element_text_matches_model_nested"}, {"$ref": "#/$defs/has_element_with_path_model_nested"}, {"$ref": "#/$defs/has_n_elements_with_path_model_nested"}, {"$ref": "#/$defs/is_valid_xml_model_nested"}, {"$ref": "#/$defs/xml_element_model_nested"}, {"$ref": "#/$defs/has_json_property_with_text_model_nested"}, {"$ref": "#/$defs/has_json_property_with_value_model_nested"}, {"$ref": "#/$defs/has_h5_attribute_model_nested"}, {"$ref": "#/$defs/has_h5_keys_model_nested"}, {"$ref": "#/$defs/has_archive_member_model_nested"}, {"$ref": "#/$defs/has_size_model_nested"}, {"$ref": "#/$defs/has_image_center_of_mass_model_nested"}, {"$ref": "#/$defs/has_image_channels_model_nested"}, {"$ref": "#/$defs/has_image_depth_model_nested"}, {"$ref": "#/$defs/has_image_frames_model_nested"}, {"$ref": "#/$defs/has_image_height_model_nested"}, {"$ref": "#/$defs/has_image_mean_intensity_model_nested"}, {"$ref": "#/$defs/has_image_mean_object_size_model_nested"}, {"$ref": "#/$defs/has_image_n_labels_model_nested"}, {"$ref": "#/$defs/has_image_width_model_nested"}]}, "title": "assertion_list", "type": "array"}, "attribute_is_model": {"additionalProperties": false, "description": "Asserts the XML ``attribute`` for the element (or tag) with the specified\nXPath-like ``path`` is the specified ``text``.\n\nFor example:\n\n```xml\n\n```\n\nThe assertion implicitly also asserts that an element matching ``path`` exists.\nWith ``negate`` the result of the assertion (on the equality) can be inverted (the\nimplicit assertion on the existence of the path is not affected).", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "attribute": {"description": "The XML attribute name to test against from the target XML element.", "title": "Attribute", "type": "string"}, "text": {"description": "The expected attribute value to test against on the target XML element", "title": "Text", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "attribute_is", "default": "attribute_is", "title": "That", "type": "string"}}, "required": ["path", "attribute", "text"], "title": "Assert Attribute Is", "type": "object"}, "attribute_is_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"attribute_is": {"$ref": "#/$defs/base_attribute_is_model", "title": "Assert Attribute Is"}}, "required": ["attribute_is"], "title": "Assert Attribute Is (Nested)", "type": "object"}, "attribute_matches_model": {"additionalProperties": false, "description": "Asserts the XML ``attribute`` for the element (or tag) with the specified\nXPath-like ``path`` matches the regular expression specified by ``expression``.\n\nFor example:\n\n```xml\n\n```\n\nThe assertion implicitly also asserts that an element matching ``path`` exists.\nWith ``negate`` the result of the assertion (on the matching) can be inverted (the\nimplicit assertion on the existence of the path is not affected).", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "attribute": {"description": "The XML attribute name to test against from the target XML element.", "title": "Attribute", "type": "string"}, "expression": {"description": "The regular expressions to apply against the named attribute on the target XML element.", "title": "Expression", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "attribute_matches", "default": "attribute_matches", "title": "That", "type": "string"}}, "required": ["path", "attribute", "expression"], "title": "Assert Attribute Matches", "type": "object"}, "attribute_matches_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"attribute_matches": {"$ref": "#/$defs/base_attribute_matches_model", "title": "Assert Attribute Matches"}}, "required": ["attribute_matches"], "title": "Assert Attribute Matches (Nested)", "type": "object"}, "base_attribute_is_model": {"additionalProperties": false, "description": "base model for attribute_is describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "attribute": {"description": "The XML attribute name to test against from the target XML element.", "title": "Attribute", "type": "string"}, "text": {"description": "The expected attribute value to test against on the target XML element", "title": "Text", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["path", "attribute", "text"], "title": "base_attribute_is_model", "type": "object"}, "base_attribute_matches_model": {"additionalProperties": false, "description": "base model for attribute_matches describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "attribute": {"description": "The XML attribute name to test against from the target XML element.", "title": "Attribute", "type": "string"}, "expression": {"description": "The regular expressions to apply against the named attribute on the target XML element.", "title": "Expression", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["path", "attribute", "expression"], "title": "base_attribute_matches_model", "type": "object"}, "base_element_text_is_model": {"additionalProperties": false, "description": "base model for element_text_is describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "text": {"description": "The expected element text (body of the XML tag) to test against on the target XML element", "title": "Text", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["path", "text"], "title": "base_element_text_is_model", "type": "object"}, "base_element_text_matches_model": {"additionalProperties": false, "description": "base model for element_text_matches describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "expression": {"description": "The regular expressions to apply against the target element.", "title": "Expression", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["path", "expression"], "title": "base_element_text_matches_model", "type": "object"}, "base_element_text_model": {"additionalProperties": false, "description": "base model for element_text describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "children": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"type": "null"}], "default": null, "title": "Children"}, "asserts": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"type": "null"}], "default": null, "title": "Asserts"}}, "required": ["path"], "title": "base_element_text_model", "type": "object"}, "base_has_archive_member_model": {"additionalProperties": false, "description": "base model for has_archive_member describing attributes.", "properties": {"path": {"description": "The regular expression specifying the archive member.", "title": "Path", "type": "string"}, "all": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "Check the sub-assertions for all paths matching the path. Default: false, i.e. only the first", "title": "All"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "children": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"type": "null"}], "default": null, "title": "Children"}, "asserts": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"type": "null"}], "default": null, "title": "Asserts"}}, "required": ["path"], "title": "base_has_archive_member_model", "type": "object"}, "base_has_element_with_path_model": {"additionalProperties": false, "description": "base model for has_element_with_path describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["path"], "title": "base_has_element_with_path_model", "type": "object"}, "base_has_h5_attribute_model": {"additionalProperties": false, "description": "base model for has_h5_attribute describing attributes.", "properties": {"key": {"description": "HDF5 attribute to check value of.", "title": "Key", "type": "string"}, "value": {"description": "Expected value of HDF5 attribute to check.", "title": "Value", "type": "string"}}, "required": ["key", "value"], "title": "base_has_h5_attribute_model", "type": "object"}, "base_has_h5_keys_model": {"additionalProperties": false, "description": "base model for has_h5_keys describing attributes.", "properties": {"keys": {"description": "HDF5 attributes to check value of as a comma-separated string.", "title": "Keys", "type": "string"}}, "required": ["keys"], "title": "base_has_h5_keys_model", "type": "object"}, "base_has_image_center_of_mass_model": {"additionalProperties": false, "description": "base model for has_image_center_of_mass describing attributes.", "properties": {"center_of_mass": {"description": "The required center of mass of the image intensities (horizontal and vertical coordinate, separated by a comma).", "title": "Center Of Mass", "type": "string"}, "channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "eps": {"anyOf": [{"type": "integer"}, {"type": "number"}], "default": 0.01, "description": "The maximum allowed Euclidean distance to the required center of mass (defaults to ``0.01``).", "title": "Eps"}}, "required": ["center_of_mass"], "title": "base_has_image_center_of_mass_model", "type": "object"}, "base_has_image_channels_model": {"additionalProperties": false, "description": "base model for has_image_channels describing attributes.", "properties": {"channels": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected number of channels of the image.", "title": "Channels"}, "delta": {"default": 0, "description": "Maximum allowed difference of the number of channels (default is 0). The observed number of channels has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed number of channels.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed number of channels.", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_image_channels_model", "type": "object"}, "base_has_image_depth_model": {"additionalProperties": false, "description": "base model for has_image_depth describing attributes.", "properties": {"depth": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected depth of the image (number of slices).", "title": "Depth"}, "delta": {"default": 0, "description": "Maximum allowed difference of the image depth (number of slices, default is 0). The observed depth has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed depth of the image (number of slices).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed depth of the image (number of slices).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_image_depth_model", "type": "object"}, "base_has_image_frames_model": {"additionalProperties": false, "description": "base model for has_image_frames describing attributes.", "properties": {"frames": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected number of frames in the image sequence (number of time steps).", "title": "Frames"}, "delta": {"default": 0, "description": "Maximum allowed difference of the number of frames in the image sequence (number of time steps, default is 0). The observed number of frames has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed number of frames in the image sequence (number of time steps).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed number of frames in the image sequence (number of time steps).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_image_frames_model", "type": "object"}, "base_has_image_height_model": {"additionalProperties": false, "description": "base model for has_image_height describing attributes.", "properties": {"height": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected height of the image (in pixels).", "title": "Height"}, "delta": {"default": 0, "description": "Maximum allowed difference of the image height (in pixels, default is 0). The observed height has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed height of the image (in pixels).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed height of the image (in pixels).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_image_height_model", "type": "object"}, "base_has_image_mean_intensity_model": {"additionalProperties": false, "description": "base model for has_image_mean_intensity describing attributes.", "properties": {"channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "mean_intensity": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "The required mean value of the image intensities.", "title": "Mean Intensity"}, "eps": {"anyOf": [{"type": "integer"}, {"type": "number"}], "default": 0.01, "description": "The absolute tolerance to be used for ``value`` (defaults to ``0.01``). The observed mean value of the image intensities has to be in the range ``value +- eps``.", "title": "Eps"}, "min": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "A lower bound of the required mean value of the image intensities.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "An upper bound of the required mean value of the image intensities.", "title": "Max"}}, "title": "base_has_image_mean_intensity_model", "type": "object"}, "base_has_image_mean_object_size_model": {"additionalProperties": false, "description": "base model for has_image_mean_object_size describing attributes.", "properties": {"channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "labels": {"anyOf": [{"items": {"anyOf": [{"type": "integer"}, {"type": "number"}]}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels, separated by a comma. Labels *not* on this list will be excluded from consideration. Cannot be used in combination with ``exclude_labels``.", "title": "Labels"}, "exclude_labels": {"anyOf": [{"items": {"anyOf": [{"type": "integer"}, {"type": "number"}]}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels to be excluded from consideration, separated by a comma. The primary usage of this attribute is to exclude the background of a label image. Cannot be used in combination with ``labels``.", "title": "Exclude Labels"}, "mean_object_size": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "The required mean size of the uniquely labeled objects.", "title": "Mean Object Size"}, "eps": {"anyOf": [{"type": "integer"}, {"type": "number"}], "default": 0.01, "description": "The absolute tolerance to be used for ``value`` (defaults to ``0.01``). The observed mean size of the uniquely labeled objects has to be in the range ``value +- eps``.", "title": "Eps"}, "min": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "A lower bound of the required mean size of the uniquely labeled objects.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "An upper bound of the required mean size of the uniquely labeled objects.", "title": "Max"}}, "title": "base_has_image_mean_object_size_model", "type": "object"}, "base_has_image_n_labels_model": {"additionalProperties": false, "description": "base model for has_image_n_labels describing attributes.", "properties": {"channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "labels": {"anyOf": [{"items": {"anyOf": [{"type": "integer"}, {"type": "number"}]}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels, separated by a comma. Labels *not* on this list will be excluded from consideration. Cannot be used in combination with ``exclude_labels``.", "title": "Labels"}, "exclude_labels": {"anyOf": [{"items": {"anyOf": [{"type": "integer"}, {"type": "number"}]}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels to be excluded from consideration, separated by a comma. The primary usage of this attribute is to exclude the background of a label image. Cannot be used in combination with ``labels``.", "title": "Exclude Labels"}, "n": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected number of labels.", "title": "N"}, "delta": {"default": 0, "description": "Maximum allowed difference of the number of labels (default is 0). The observed number of labels has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed number of labels.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed number of labels.", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_image_n_labels_model", "type": "object"}, "base_has_image_width_model": {"additionalProperties": false, "description": "base model for has_image_width describing attributes.", "properties": {"width": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected width of the image (in pixels).", "title": "Width"}, "delta": {"default": 0, "description": "Maximum allowed difference of the image width (in pixels, default is 0). The observed width has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed width of the image (in pixels).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed width of the image (in pixels).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_image_width_model", "type": "object"}, "base_has_json_property_with_text_model": {"additionalProperties": false, "description": "base model for has_json_property_with_text describing attributes.", "properties": {"property": {"description": "The property name to search the JSON document for.", "title": "Property", "type": "string"}, "text": {"description": "The expected text value of the target JSON attribute.", "title": "Text", "type": "string"}}, "required": ["property", "text"], "title": "base_has_json_property_with_text_model", "type": "object"}, "base_has_json_property_with_value_model": {"additionalProperties": false, "description": "base model for has_json_property_with_value describing attributes.", "properties": {"property": {"description": "The property name to search the JSON document for.", "title": "Property", "type": "string"}, "value": {"description": "The expected JSON value of the target JSON attribute (as a JSON encoded string).", "title": "Value", "type": "string"}}, "required": ["property", "value"], "title": "base_has_json_property_with_value_model", "type": "object"}, "base_has_line_matching_model": {"additionalProperties": false, "description": "base model for has_line_matching describing attributes.", "properties": {"expression": {"description": "The regular expressions to attempt match in the output.", "title": "Expression", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["expression"], "title": "base_has_line_matching_model", "type": "object"}, "base_has_line_model": {"additionalProperties": false, "description": "base model for has_line describing attributes.", "properties": {"line": {"description": "The full line of text to search for in the output.", "title": "Line", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["line"], "title": "base_has_line_model", "type": "object"}, "base_has_n_columns_model": {"additionalProperties": false, "description": "base model for has_n_columns describing attributes.", "properties": {"n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "sep": {"default": "\t", "description": "Separator defining columns, default: tab", "title": "Sep", "type": "string"}, "comment": {"default": "", "description": "Comment character(s) used to skip comment lines (which should not be used for counting columns)", "title": "Comment", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_n_columns_model", "type": "object"}, "base_has_n_elements_with_path_model": {"additionalProperties": false, "description": "base model for has_n_elements_with_path describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["path"], "title": "base_has_n_elements_with_path_model", "type": "object"}, "base_has_n_lines_model": {"additionalProperties": false, "description": "base model for has_n_lines describing attributes.", "properties": {"n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_n_lines_model", "type": "object"}, "base_has_size_model": {"additionalProperties": false, "description": "base model for has_size describing attributes.", "properties": {"value": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Deprecated alias for `size`", "title": "Value"}, "size": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired size of the output (in bytes), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Size"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "title": "base_has_size_model", "type": "object"}, "base_has_text_matching_model": {"additionalProperties": false, "description": "base model for has_text_matching describing attributes.", "properties": {"expression": {"description": "The regular expressions to attempt match in the output.", "title": "Expression", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["expression"], "title": "base_has_text_matching_model", "type": "object"}, "base_has_text_model": {"additionalProperties": false, "description": "base model for has_text describing attributes.", "properties": {"text": {"description": "The text to search for in the output.", "title": "Text", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}}, "required": ["text"], "title": "base_has_text_model", "type": "object"}, "base_is_valid_xml_model": {"additionalProperties": false, "description": "base model for is_valid_xml describing attributes.", "properties": {}, "title": "base_is_valid_xml_model", "type": "object"}, "base_not_has_text_model": {"additionalProperties": false, "description": "base model for not_has_text describing attributes.", "properties": {"text": {"description": "The text to search for in the output.", "title": "Text", "type": "string"}}, "required": ["text"], "title": "base_not_has_text_model", "type": "object"}, "base_xml_element_model": {"additionalProperties": false, "description": "base model for xml_element describing attributes.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "attribute": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "The XML attribute name to test against from the target XML element.", "title": "Attribute"}, "all": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "Check the sub-assertions for all paths matching the path. Default: false, i.e. only the first ", "title": "All"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "children": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"type": "null"}], "default": null, "title": "Children"}, "asserts": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"type": "null"}], "default": null, "title": "Asserts"}}, "required": ["path"], "title": "base_xml_element_model", "type": "object"}, "element_text_is_model": {"additionalProperties": false, "description": "Asserts the text of the XML element with the specified XPath-like ``path`` is\nthe specified ``text``.\n\nFor example:\n\n```xml\n\n```\n\nThe assertion implicitly also asserts that an element matching ``path`` exists.\nWith ``negate`` the result of the assertion (on the equality) can be inverted (the\nimplicit assertion on the existence of the path is not affected).", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "text": {"description": "The expected element text (body of the XML tag) to test against on the target XML element", "title": "Text", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "element_text_is", "default": "element_text_is", "title": "That", "type": "string"}}, "required": ["path", "text"], "title": "Assert Element Text Is", "type": "object"}, "element_text_is_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"element_text_is": {"$ref": "#/$defs/base_element_text_is_model", "title": "Assert Element Text Is"}}, "required": ["element_text_is"], "title": "Assert Element Text Is (Nested)", "type": "object"}, "element_text_matches_model": {"additionalProperties": false, "description": "Asserts the text of the XML element with the specified XPath-like ``path``\nmatches the regular expression defined by ``expression``.\n\nFor example:\n\n```xml\n\n```\n\nThe assertion implicitly also asserts that an element matching ``path`` exists.\nWith ``negate`` the result of the assertion (on the matching) can be inverted (the\nimplicit assertion on the existence of the path is not affected).", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "expression": {"description": "The regular expressions to apply against the target element.", "title": "Expression", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "element_text_matches", "default": "element_text_matches", "title": "That", "type": "string"}}, "required": ["path", "expression"], "title": "Assert Element Text Matches", "type": "object"}, "element_text_matches_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"element_text_matches": {"$ref": "#/$defs/base_element_text_matches_model", "title": "Assert Element Text Matches"}}, "required": ["element_text_matches"], "title": "Assert Element Text Matches (Nested)", "type": "object"}, "element_text_model": {"additionalProperties": false, "description": "This tag allows the developer to recurisively specify additional assertions as\nchild elements about just the text contained in the element specified by the\nXPath-like ``path``, e.g.\n\n```xml\n\n \n\n```\n\nThe assertion implicitly also asserts that an element matching ``path`` exists.\nWith ``negate`` the result of the implicit assertions can be inverted.\nThe sub-assertions, which have their own ``negate`` attribute, are not affected\nby ``negate``.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "children": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"type": "null"}], "default": null, "title": "Children"}, "asserts": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"type": "null"}], "default": null, "title": "Asserts"}, "that": {"const": "element_text", "default": "element_text", "title": "That", "type": "string"}}, "required": ["path"], "title": "Assert Element Text", "type": "object"}, "element_text_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"element_text": {"$ref": "#/$defs/base_element_text_model", "title": "Assert Element Text"}}, "required": ["element_text"], "title": "Assert Element Text (Nested)", "type": "object"}, "has_archive_member_model": {"additionalProperties": false, "description": "This tag allows to check if ``path`` is contained in a compressed file.\n\nThe path is a regular expression that is matched against the full paths of the objects in\nthe compressed file (remember that \"matching\" means it is checked if a prefix of\nthe full path of an archive member is described by the regular expression).\nValid archive formats include ``.zip``, ``.tar``, and ``.tar.gz``. Note that\ndepending on the archive creation method:\n\n- full paths of the members may be prefixed with ``./``\n- directories may be treated as empty files\n\n```xml\n\n```\n\nWith ``n`` and ``delta`` (or ``min`` and ``max``) assertions on the number of\narchive members matching ``path`` can be expressed. The following could be used,\ne.g., to assert an archive containing n±1 elements out of which at least\n4 need to have a ``txt`` extension.\n\n```xml\n\n\n```\n\nIn addition the tag can contain additional assertions as child elements about\nthe first member in the archive matching the regular expression ``path``. For\ninstance\n\n```xml\n\n \n\n```\n\nIf the ``all`` attribute is set to ``true`` then all archive members are subject\nto the assertions. Note that, archive members matching the ``path`` are sorted\nalphabetically.\n\nThe ``negate`` attribute of the ``has_archive_member`` assertion only affects\nthe asserts on the presence and number of matching archive members, but not any\nsub-assertions (which can offer the ``negate`` attribute on their own). The\ncheck if the file is an archive at all, which is also done by the function, is\nnot affected.", "properties": {"path": {"description": "The regular expression specifying the archive member.", "title": "Path", "type": "string"}, "all": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "Check the sub-assertions for all paths matching the path. Default: false, i.e. only the first", "title": "All"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "children": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"type": "null"}], "default": null, "title": "Children"}, "asserts": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"type": "null"}], "default": null, "title": "Asserts"}, "that": {"const": "has_archive_member", "default": "has_archive_member", "title": "That", "type": "string"}}, "required": ["path"], "title": "Assert Has Archive Member", "type": "object"}, "has_archive_member_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_archive_member": {"$ref": "#/$defs/base_has_archive_member_model", "title": "Assert Has Archive Member"}}, "required": ["has_archive_member"], "title": "Assert Has Archive Member (Nested)", "type": "object"}, "has_element_with_path_model": {"additionalProperties": false, "description": "Asserts the XML output contains at least one element (or tag) with the specified\nXPath-like ``path``, e.g.\n\n```xml\n\n```\n\nWith ``negate`` the result of the assertion can be inverted.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_element_with_path", "default": "has_element_with_path", "title": "That", "type": "string"}}, "required": ["path"], "title": "Assert Has Element With Path", "type": "object"}, "has_element_with_path_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_element_with_path": {"$ref": "#/$defs/base_has_element_with_path_model", "title": "Assert Has Element With Path"}}, "required": ["has_element_with_path"], "title": "Assert Has Element With Path (Nested)", "type": "object"}, "has_h5_attribute_model": {"additionalProperties": false, "description": "Asserts HDF5 output contains the specified ``value`` for an attribute (``key``), e.g.\n\n```xml\n\n```", "properties": {"key": {"description": "HDF5 attribute to check value of.", "title": "Key", "type": "string"}, "value": {"description": "Expected value of HDF5 attribute to check.", "title": "Value", "type": "string"}, "that": {"const": "has_h5_attribute", "default": "has_h5_attribute", "title": "That", "type": "string"}}, "required": ["key", "value"], "title": "Assert Has H5 Attribute", "type": "object"}, "has_h5_attribute_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_h5_attribute": {"$ref": "#/$defs/base_has_h5_attribute_model", "title": "Assert Has H5 Attribute"}}, "required": ["has_h5_attribute"], "title": "Assert Has H5 Attribute (Nested)", "type": "object"}, "has_h5_keys_model": {"additionalProperties": false, "description": "Asserts the specified HDF5 output has the given keys.", "properties": {"keys": {"description": "HDF5 attributes to check value of as a comma-separated string.", "title": "Keys", "type": "string"}, "that": {"const": "has_h5_keys", "default": "has_h5_keys", "title": "That", "type": "string"}}, "required": ["keys"], "title": "Assert Has H5 Keys", "type": "object"}, "has_h5_keys_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_h5_keys": {"$ref": "#/$defs/base_has_h5_keys_model", "title": "Assert Has H5 Keys"}}, "required": ["has_h5_keys"], "title": "Assert Has H5 Keys (Nested)", "type": "object"}, "has_image_center_of_mass_model": {"additionalProperties": false, "description": "Asserts the specified output is an image and has the specified center of mass.\n\nAsserts the output is an image and has a specific center of mass,\nor has an Euclidean distance of ``eps`` or less to that point (e.g.,\n````).", "properties": {"center_of_mass": {"description": "The required center of mass of the image intensities (horizontal and vertical coordinate, separated by a comma).", "title": "Center Of Mass", "type": "string"}, "channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "eps": {"anyOf": [{"type": "integer"}, {"type": "number"}], "default": 0.01, "description": "The maximum allowed Euclidean distance to the required center of mass (defaults to ``0.01``).", "title": "Eps"}, "that": {"const": "has_image_center_of_mass", "default": "has_image_center_of_mass", "title": "That", "type": "string"}}, "required": ["center_of_mass"], "title": "Assert Has Image Center Of Mass", "type": "object"}, "has_image_center_of_mass_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_center_of_mass": {"$ref": "#/$defs/base_has_image_center_of_mass_model", "title": "Assert Has Image Center Of Mass"}}, "required": ["has_image_center_of_mass"], "title": "Assert Has Image Center Of Mass (Nested)", "type": "object"}, "has_image_channels_model": {"additionalProperties": false, "description": "Asserts the output is an image and has a specific number of channels.\n\nThe number of channels is plus/minus ``delta`` (e.g., ````).\n\nAlternatively the range of the expected number of channels can be specified by ``min`` and/or ``max``.", "properties": {"channels": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected number of channels of the image.", "title": "Channels"}, "delta": {"default": 0, "description": "Maximum allowed difference of the number of channels (default is 0). The observed number of channels has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed number of channels.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed number of channels.", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_image_channels", "default": "has_image_channels", "title": "That", "type": "string"}}, "title": "Assert Has Image Channels", "type": "object"}, "has_image_channels_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_channels": {"$ref": "#/$defs/base_has_image_channels_model", "title": "Assert Has Image Channels"}}, "required": ["has_image_channels"], "title": "Assert Has Image Channels (Nested)", "type": "object"}, "has_image_depth_model": {"additionalProperties": false, "description": "Asserts the output is an image and has a specific depth (number of slices).\n\nThe depth is plus/minus ``delta`` (e.g., ````).\nAlternatively the range of the expected depth can be specified by ``min`` and/or ``max``.", "properties": {"depth": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected depth of the image (number of slices).", "title": "Depth"}, "delta": {"default": 0, "description": "Maximum allowed difference of the image depth (number of slices, default is 0). The observed depth has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed depth of the image (number of slices).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed depth of the image (number of slices).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_image_depth", "default": "has_image_depth", "title": "That", "type": "string"}}, "title": "Assert Has Image Depth", "type": "object"}, "has_image_depth_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_depth": {"$ref": "#/$defs/base_has_image_depth_model", "title": "Assert Has Image Depth"}}, "required": ["has_image_depth"], "title": "Assert Has Image Depth (Nested)", "type": "object"}, "has_image_frames_model": {"additionalProperties": false, "description": "Asserts the output is an image and has a specific number of frames (number of time steps).\n\nThe number of frames is plus/minus ``delta`` (e.g., ````).\nAlternatively the range of the expected number of frames can be specified by ``min`` and/or ``max``.", "properties": {"frames": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected number of frames in the image sequence (number of time steps).", "title": "Frames"}, "delta": {"default": 0, "description": "Maximum allowed difference of the number of frames in the image sequence (number of time steps, default is 0). The observed number of frames has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed number of frames in the image sequence (number of time steps).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed number of frames in the image sequence (number of time steps).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_image_frames", "default": "has_image_frames", "title": "That", "type": "string"}}, "title": "Assert Has Image Frames", "type": "object"}, "has_image_frames_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_frames": {"$ref": "#/$defs/base_has_image_frames_model", "title": "Assert Has Image Frames"}}, "required": ["has_image_frames"], "title": "Assert Has Image Frames (Nested)", "type": "object"}, "has_image_height_model": {"additionalProperties": false, "description": "Asserts the output is an image and has a specific height (in pixels).\n\nThe height is plus/minus ``delta`` (e.g., ````).\nAlternatively the range of the expected height can be specified by ``min`` and/or ``max``.", "properties": {"height": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected height of the image (in pixels).", "title": "Height"}, "delta": {"default": 0, "description": "Maximum allowed difference of the image height (in pixels, default is 0). The observed height has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed height of the image (in pixels).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed height of the image (in pixels).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_image_height", "default": "has_image_height", "title": "That", "type": "string"}}, "title": "Assert Has Image Height", "type": "object"}, "has_image_height_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_height": {"$ref": "#/$defs/base_has_image_height_model", "title": "Assert Has Image Height"}}, "required": ["has_image_height"], "title": "Assert Has Image Height (Nested)", "type": "object"}, "has_image_mean_intensity_model": {"additionalProperties": false, "description": "Asserts the output is an image and has a specific mean intensity value.\n\nThe mean intensity value is plus/minus ``eps`` (e.g., ````).\nAlternatively the range of the expected mean intensity value can be specified by ``min`` and/or ``max``.", "properties": {"channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "mean_intensity": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "The required mean value of the image intensities.", "title": "Mean Intensity"}, "eps": {"anyOf": [{"type": "integer"}, {"type": "number"}], "default": 0.01, "description": "The absolute tolerance to be used for ``value`` (defaults to ``0.01``). The observed mean value of the image intensities has to be in the range ``value +- eps``.", "title": "Eps"}, "min": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "A lower bound of the required mean value of the image intensities.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "An upper bound of the required mean value of the image intensities.", "title": "Max"}, "that": {"const": "has_image_mean_intensity", "default": "has_image_mean_intensity", "title": "That", "type": "string"}}, "title": "Assert Has Image Mean Intensity", "type": "object"}, "has_image_mean_intensity_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_mean_intensity": {"$ref": "#/$defs/base_has_image_mean_intensity_model", "title": "Assert Has Image Mean Intensity"}}, "required": ["has_image_mean_intensity"], "title": "Assert Has Image Mean Intensity (Nested)", "type": "object"}, "has_image_mean_object_size_model": {"additionalProperties": false, "description": "Asserts the output is an image with labeled objects which have the specified mean size (number of pixels),\n\nThe mean size is plus/minus ``eps`` (e.g., ````).\n\nThe labels must be unique.", "properties": {"channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "labels": {"anyOf": [{"items": {"anyOf": [{"type": "integer"}, {"type": "number"}]}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels, separated by a comma. Labels *not* on this list will be excluded from consideration. Cannot be used in combination with ``exclude_labels``.", "title": "Labels"}, "exclude_labels": {"anyOf": [{"items": {"anyOf": [{"type": "integer"}, {"type": "number"}]}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels to be excluded from consideration, separated by a comma. The primary usage of this attribute is to exclude the background of a label image. Cannot be used in combination with ``labels``.", "title": "Exclude Labels"}, "mean_object_size": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "The required mean size of the uniquely labeled objects.", "title": "Mean Object Size"}, "eps": {"anyOf": [{"type": "integer"}, {"type": "number"}], "default": 0.01, "description": "The absolute tolerance to be used for ``value`` (defaults to ``0.01``). The observed mean size of the uniquely labeled objects has to be in the range ``value +- eps``.", "title": "Eps"}, "min": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "A lower bound of the required mean size of the uniquely labeled objects.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "number"}, {"type": "null"}], "default": null, "description": "An upper bound of the required mean size of the uniquely labeled objects.", "title": "Max"}, "that": {"const": "has_image_mean_object_size", "default": "has_image_mean_object_size", "title": "That", "type": "string"}}, "title": "Assert Has Image Mean Object Size", "type": "object"}, "has_image_mean_object_size_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_mean_object_size": {"$ref": "#/$defs/base_has_image_mean_object_size_model", "title": "Assert Has Image Mean Object Size"}}, "required": ["has_image_mean_object_size"], "title": "Assert Has Image Mean Object Size (Nested)", "type": "object"}, "has_image_n_labels_model": {"additionalProperties": false, "description": "Asserts the output is an image and has the specified labels.\n\nLabels can be a number of labels or unique values (e.g.,\n````).\n\nThe primary usage of this assertion is to verify the number of objects in images with uniquely labeled objects.", "properties": {"channel": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific channel of the image (where ``0`` corresponds to the first image channel).", "title": "Channel"}, "slice": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific slice of the image (where ``0`` corresponds to the first image slice).", "title": "Slice"}, "frame": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Restricts the assertion to a specific frame of the image sequence (where ``0`` corresponds to the first image frame).", "title": "Frame"}, "labels": {"anyOf": [{"items": {"anyOf": [{"type": "integer"}, {"type": "number"}]}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels, separated by a comma. Labels *not* on this list will be excluded from consideration. Cannot be used in combination with ``exclude_labels``.", "title": "Labels"}, "exclude_labels": {"anyOf": [{"items": {"anyOf": [{"type": "integer"}, {"type": "number"}]}, "type": "array"}, {"type": "null"}], "default": null, "description": "List of labels to be excluded from consideration, separated by a comma. The primary usage of this attribute is to exclude the background of a label image. Cannot be used in combination with ``labels``.", "title": "Exclude Labels"}, "n": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected number of labels.", "title": "N"}, "delta": {"default": 0, "description": "Maximum allowed difference of the number of labels (default is 0). The observed number of labels has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed number of labels.", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed number of labels.", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_image_n_labels", "default": "has_image_n_labels", "title": "That", "type": "string"}}, "title": "Assert Has Image N Labels", "type": "object"}, "has_image_n_labels_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_n_labels": {"$ref": "#/$defs/base_has_image_n_labels_model", "title": "Assert Has Image N Labels"}}, "required": ["has_image_n_labels"], "title": "Assert Has Image N Labels (Nested)", "type": "object"}, "has_image_width_model": {"additionalProperties": false, "description": "Asserts the output is an image and has a specific width (in pixels).\n\nThe width is plus/minus ``delta`` (e.g., ````).\nAlternatively the range of the expected width can be specified by ``min`` and/or ``max``.", "properties": {"width": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Expected width of the image (in pixels).", "title": "Width"}, "delta": {"default": 0, "description": "Maximum allowed difference of the image width (in pixels, default is 0). The observed width has to be in the range ``value +- delta``.", "title": "Delta", "type": "integer"}, "min": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum allowed width of the image (in pixels).", "title": "Min"}, "max": {"anyOf": [{"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum allowed width of the image (in pixels).", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_image_width", "default": "has_image_width", "title": "That", "type": "string"}}, "title": "Assert Has Image Width", "type": "object"}, "has_image_width_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_image_width": {"$ref": "#/$defs/base_has_image_width_model", "title": "Assert Has Image Width"}}, "required": ["has_image_width"], "title": "Assert Has Image Width (Nested)", "type": "object"}, "has_json_property_with_text_model": {"additionalProperties": false, "description": "Asserts the JSON document contains a property or key with the specified text (i.e. string) value.\n\n```xml\n\n```", "properties": {"property": {"description": "The property name to search the JSON document for.", "title": "Property", "type": "string"}, "text": {"description": "The expected text value of the target JSON attribute.", "title": "Text", "type": "string"}, "that": {"const": "has_json_property_with_text", "default": "has_json_property_with_text", "title": "That", "type": "string"}}, "required": ["property", "text"], "title": "Assert Has Json Property With Text", "type": "object"}, "has_json_property_with_text_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_json_property_with_text": {"$ref": "#/$defs/base_has_json_property_with_text_model", "title": "Assert Has Json Property With Text"}}, "required": ["has_json_property_with_text"], "title": "Assert Has Json Property With Text (Nested)", "type": "object"}, "has_json_property_with_value_model": {"additionalProperties": false, "description": "Asserts the JSON document contains a property or key with the specified JSON value.\n\n```xml\n\n```", "properties": {"property": {"description": "The property name to search the JSON document for.", "title": "Property", "type": "string"}, "value": {"description": "The expected JSON value of the target JSON attribute (as a JSON encoded string).", "title": "Value", "type": "string"}, "that": {"const": "has_json_property_with_value", "default": "has_json_property_with_value", "title": "That", "type": "string"}}, "required": ["property", "value"], "title": "Assert Has Json Property With Value", "type": "object"}, "has_json_property_with_value_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_json_property_with_value": {"$ref": "#/$defs/base_has_json_property_with_value_model", "title": "Assert Has Json Property With Value"}}, "required": ["has_json_property_with_value"], "title": "Assert Has Json Property With Value (Nested)", "type": "object"}, "has_line_matching_model": {"additionalProperties": false, "description": "Asserts the specified output contains a line matching the\nregular expression specified by the argument expression. If n is given\nthe assertion checks for exactly n occurrences.", "properties": {"expression": {"description": "The regular expressions to attempt match in the output.", "title": "Expression", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_line_matching", "default": "has_line_matching", "title": "That", "type": "string"}}, "required": ["expression"], "title": "Assert Has Line Matching", "type": "object"}, "has_line_matching_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_line_matching": {"$ref": "#/$defs/base_has_line_matching_model", "title": "Assert Has Line Matching"}}, "required": ["has_line_matching"], "title": "Assert Has Line Matching (Nested)", "type": "object"}, "has_line_model": {"additionalProperties": false, "description": "Asserts the specified output contains the line specified by the\nargument line. The exact number of occurrences can be optionally\nspecified by the argument n", "properties": {"line": {"description": "The full line of text to search for in the output.", "title": "Line", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_line", "default": "has_line", "title": "That", "type": "string"}}, "required": ["line"], "title": "Assert Has Line", "type": "object"}, "has_line_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_line": {"$ref": "#/$defs/base_has_line_model", "title": "Assert Has Line"}}, "required": ["has_line"], "title": "Assert Has Line (Nested)", "type": "object"}, "has_n_columns_model": {"additionalProperties": false, "description": "Asserts tabular output contains the specified\nnumber (``n``) of columns.\n\nFor instance, ````. The assertion tests only the first line.\nNumber of columns can optionally also be specified with ``delta``. Alternatively the\nrange of expected occurrences can be specified by ``min`` and/or ``max``.\n\nOptionally a column separator (``sep``, default is `` ``) `and comment character(s)\ncan be specified (``comment``, default is empty string). The first non-comment\nline is used for determining the number of columns.", "properties": {"n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "sep": {"default": "\t", "description": "Separator defining columns, default: tab", "title": "Sep", "type": "string"}, "comment": {"default": "", "description": "Comment character(s) used to skip comment lines (which should not be used for counting columns)", "title": "Comment", "type": "string"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_n_columns", "default": "has_n_columns", "title": "That", "type": "string"}}, "title": "Assert Has N Columns", "type": "object"}, "has_n_columns_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_n_columns": {"$ref": "#/$defs/base_has_n_columns_model", "title": "Assert Has N Columns"}}, "required": ["has_n_columns"], "title": "Assert Has N Columns (Nested)", "type": "object"}, "has_n_elements_with_path_model": {"additionalProperties": false, "description": "Asserts the XML output contains the specified number (``n``, optionally with ``delta``) of elements (or\ntags) with the specified XPath-like ``path``.\n\nFor example:\n\n```xml\n\n```\n\nAlternatively to ``n`` and ``delta`` also the ``min`` and ``max`` attributes\ncan be used to specify the range of the expected number of occurrences.\nWith ``negate`` the result of the assertion can be inverted.", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_n_elements_with_path", "default": "has_n_elements_with_path", "title": "That", "type": "string"}}, "required": ["path"], "title": "Assert Has N Elements With Path", "type": "object"}, "has_n_elements_with_path_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_n_elements_with_path": {"$ref": "#/$defs/base_has_n_elements_with_path_model", "title": "Assert Has N Elements With Path"}}, "required": ["has_n_elements_with_path"], "title": "Assert Has N Elements With Path (Nested)", "type": "object"}, "has_n_lines_model": {"additionalProperties": false, "description": "Asserts the specified output contains ``n`` lines allowing\nfor a difference in the number of lines (delta)\nor relative differebce in the number of lines", "properties": {"n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_n_lines", "default": "has_n_lines", "title": "That", "type": "string"}}, "title": "Assert Has N Lines", "type": "object"}, "has_n_lines_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_n_lines": {"$ref": "#/$defs/base_has_n_lines_model", "title": "Assert Has N Lines"}}, "required": ["has_n_lines"], "title": "Assert Has N Lines (Nested)", "type": "object"}, "has_size_model": {"additionalProperties": false, "description": "Asserts the specified output has a size of the specified value\n\nAttributes size and value or synonyms though value is considered deprecated.\nThe size optionally allows for absolute (``delta``) difference.", "properties": {"value": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Deprecated alias for `size`", "title": "Value"}, "size": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired size of the output (in bytes), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Size"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_size", "default": "has_size", "title": "That", "type": "string"}}, "title": "Assert Has Size", "type": "object"}, "has_size_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_size": {"$ref": "#/$defs/base_has_size_model", "title": "Assert Has Size"}}, "required": ["has_size"], "title": "Assert Has Size (Nested)", "type": "object"}, "has_text_matching_model": {"additionalProperties": false, "description": "Asserts the specified output contains text matching the\nregular expression specified by the argument expression.\nIf n is given the assertion checks for exactly n (nonoverlapping)\noccurrences.", "properties": {"expression": {"description": "The regular expressions to attempt match in the output.", "title": "Expression", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_text_matching", "default": "has_text_matching", "title": "That", "type": "string"}}, "required": ["expression"], "title": "Assert Has Text Matching", "type": "object"}, "has_text_matching_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_text_matching": {"$ref": "#/$defs/base_has_text_matching_model", "title": "Assert Has Text Matching"}}, "required": ["has_text_matching"], "title": "Assert Has Text Matching (Nested)", "type": "object"}, "has_text_model": {"additionalProperties": false, "description": "Asserts specified output contains the substring specified by\nthe argument text. The exact number of occurrences can be\noptionally specified by the argument n", "properties": {"text": {"description": "The text to search for in the output.", "title": "Text", "type": "string"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "that": {"const": "has_text", "default": "has_text", "title": "That", "type": "string"}}, "required": ["text"], "title": "Assert Has Text", "type": "object"}, "has_text_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"has_text": {"$ref": "#/$defs/base_has_text_model", "title": "Assert Has Text"}}, "required": ["has_text"], "title": "Assert Has Text (Nested)", "type": "object"}, "is_valid_xml_model": {"additionalProperties": false, "description": "Asserts the output is a valid XML file (e.g. ````).", "properties": {"that": {"const": "is_valid_xml", "default": "is_valid_xml", "title": "That", "type": "string"}}, "title": "Assert Is Valid Xml", "type": "object"}, "is_valid_xml_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"is_valid_xml": {"$ref": "#/$defs/base_is_valid_xml_model", "title": "Assert Is Valid Xml"}}, "required": ["is_valid_xml"], "title": "Assert Is Valid Xml (Nested)", "type": "object"}, "not_has_text_model": {"additionalProperties": false, "description": "Asserts specified output does not contain the substring\nspecified by the argument text", "properties": {"text": {"description": "The text to search for in the output.", "title": "Text", "type": "string"}, "that": {"const": "not_has_text", "default": "not_has_text", "title": "That", "type": "string"}}, "required": ["text"], "title": "Assert Not Has Text", "type": "object"}, "not_has_text_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"not_has_text": {"$ref": "#/$defs/base_not_has_text_model", "title": "Assert Not Has Text"}}, "required": ["not_has_text"], "title": "Assert Not Has Text (Nested)", "type": "object"}, "xml_element_model": {"additionalProperties": false, "description": "Assert if the XML file contains element(s) or tag(s) with the specified\n[XPath-like ``path``](https://lxml.de/xpathxslt.html). If ``n`` and ``delta``\nor ``min`` and ``max`` are given also the number of occurrences is checked.\n\n```xml\n\n \n \n \n\n```\n\nWith ``negate=\"true\"`` the outcome of the assertions wrt the presence and number\nof ``path`` can be negated. If there are any sub assertions then check them against\n\n- the content of the attribute ``attribute``\n- the element's text if no attribute is given\n\n```xml\n\n \n \n \n\n```\n\nSub-assertions are not subject to the ``negate`` attribute of ``xml_element``.\nIf ``all`` is ``true`` then the sub assertions are checked for all occurrences.\n\nNote that all other XML assertions can be expressed by this assertion (Galaxy\nalso implements the other assertions by calling this one).", "properties": {"path": {"description": "The Python xpath-like expression to find the target element.", "title": "Path", "type": "string"}, "attribute": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "The XML attribute name to test against from the target XML element.", "title": "Attribute"}, "all": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "Check the sub-assertions for all paths matching the path. Default: false, i.e. only the first ", "title": "All"}, "n": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Desired number, can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "N"}, "delta": {"anyOf": [{"type": "integer"}, {"type": "string"}], "default": 0, "description": "Allowed difference with respect to n (default: 0), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Delta"}, "min": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Minimum number (default: -infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Min"}, "max": {"anyOf": [{"type": "string"}, {"type": "integer"}, {"type": "null"}], "default": null, "description": "Maximum number (default: infinity), can be suffixed by ``(k|M|G|T|P|E)i?``", "title": "Max"}, "negate": {"anyOf": [{"type": "boolean"}, {"type": "string"}], "default": false, "description": "A boolean that can be set to true to negate the outcome of the assertion.", "title": "Negate"}, "children": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"type": "null"}], "default": null, "title": "Children"}, "asserts": {"anyOf": [{"$ref": "#/$defs/assertion_list"}, {"type": "null"}], "default": null, "title": "Asserts"}, "that": {"const": "xml_element", "default": "xml_element", "title": "That", "type": "string"}}, "required": ["path"], "title": "Assert Xml Element", "type": "object"}, "xml_element_model_nested": {"additionalProperties": false, "description": "Nested version of this assertion model.", "properties": {"xml_element": {"$ref": "#/$defs/base_xml_element_model", "title": "Assert Xml Element"}}, "required": ["xml_element"], "title": "Assert Xml Element (Nested)", "type": "object"}}, "additionalProperties": false, "properties": {"id": {"anyOf": [{"maxLength": 255, "minLength": 3, "type": "string"}, {"type": "null"}], "default": null, "description": "Unique identifier for the tool. Should be all lower-case and should not include whitespace.", "examples": ["my-cool-tool"], "title": "id"}, "version": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "Version for the tool.", "examples": ["0.1.0"], "title": "version"}, "name": {"description": "The name of the tool, displayed in the tool menu. This is not the same as the tool id, which is a unique identifier for the tool.", "title": "name", "type": "string"}, "description": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "The description is displayed in the tool menu immediately following the hyperlink for the tool.", "title": "description"}, "configfiles": {"anyOf": [{"items": {"$ref": "#/$defs/YamlTemplateConfigFile"}, "type": "array"}, {"type": "null"}], "default": null, "description": "A list of config files for this tool.", "title": "configfiles"}, "requirements": {"anyOf": [{"items": {"anyOf": [{"$ref": "#/$defs/JavascriptRequirement"}, {"$ref": "#/$defs/ResourceRequirement"}, {"$ref": "#/$defs/ContainerRequirement"}]}, "type": "array"}, {"type": "null"}], "default": [], "description": "A list of requirements needed to execute this tool. These can be javascript expressions, resource requirements or container images.", "title": "requirements"}, "shell_command": {"description": "A string that contains the command to be executed. Parameters can be referenced inside $().", "examples": ["head -n '$(inputs.n_lines)' '$(inputs.data_input.path)'"], "title": "shell_command", "type": "string"}, "inputs": {"default": [], "items": {"$ref": "#/$defs/YamlGalaxyToolParameter"}, "title": "inputs", "type": "array"}, "outputs": {"default": [], "items": {"discriminator": {"mapping": {"boolean": "#/$defs/ToolOutputBoolean", "collection": "#/$defs/IncomingToolOutputCollection", "data": "#/$defs/IncomingToolOutputDataset", "float": "#/$defs/ToolOutputFloat", "integer": "#/$defs/ToolOutputInteger", "text": "#/$defs/ToolOutputText"}, "propertyName": "type"}, "oneOf": [{"$ref": "#/$defs/IncomingToolOutputDataset"}, {"$ref": "#/$defs/IncomingToolOutputCollection"}, {"$ref": "#/$defs/ToolOutputText"}, {"$ref": "#/$defs/ToolOutputInteger"}, {"$ref": "#/$defs/ToolOutputFloat"}, {"$ref": "#/$defs/ToolOutputBoolean"}]}, "title": "outputs", "type": "array"}, "citations": {"anyOf": [{"items": {"$ref": "#/$defs/Citation"}, "type": "array"}, {"type": "null"}], "default": null, "title": "citations"}, "license": {"anyOf": [{"type": "string"}, {"type": "null"}], "default": null, "description": "A full URI or a a short [SPDX](https://spdx.org/licenses/) identifier for a license for this tool wrapper. The tool wrapper license can be independent of the underlying tool license. This license covers the tool yaml and associated scripts shipped with the tool.", "examples": ["MIT"], "title": "license"}, "edam_operations": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "default": null, "title": "edam_operations"}, "edam_topics": {"anyOf": [{"items": {"type": "string"}, "type": "array"}, {"type": "null"}], "default": null, "title": "edam_topics"}, "xrefs": {"anyOf": [{"items": {"$ref": "#/$defs/XrefDict"}, "type": "array"}, {"type": "null"}], "default": null, "title": "xrefs"}, "profile": {"anyOf": [{"type": "number"}, {"type": "null"}], "default": null, "title": "profile"}, "help": {"anyOf": [{"$ref": "#/$defs/HelpContent"}, {"type": "null"}], "default": null, "description": "Help text shown below the tool interface.", "title": "help"}, "tests": {"anyOf": [{"items": {"$ref": "#/$defs/YamlToolTest"}, "type": "array"}, {"type": "null"}], "default": null, "title": "tests"}, "class": {"const": "GalaxyUserTool", "title": "class_", "type": "string"}, "container": {"description": "Container image to use for this tool.", "examples": ["quay.io/biocontainers/python:3.13"], "title": "container", "type": "string"}}, "required": ["name", "shell_command", "class", "container"], "title": "UserToolSource", "type": "object"} \ No newline at end of file diff --git a/lib/galaxy/agents/custom_tool.py b/lib/galaxy/agents/custom_tool.py index ecde285bd637..384fed1f5b1d 100644 --- a/lib/galaxy/agents/custom_tool.py +++ b/lib/galaxy/agents/custom_tool.py @@ -10,6 +10,7 @@ ) import yaml +from pydantic import ValidationError from pydantic_ai import Agent from pydantic_ai.exceptions import ( ModelHTTPError, @@ -17,7 +18,11 @@ ) from galaxy.schema.agents import ConfidenceLevel -from galaxy.tool_util_models import UserToolSource +from galaxy.tool_util.lint import lint_user_tool_source +from galaxy.tool_util_models import ( + format_validation_errors, + UserToolSource, +) from .base import ( ActionSuggestion, ActionType, @@ -32,6 +37,22 @@ log = logging.getLogger(__name__) +def _find_validation_error(exc: BaseException) -> Optional[ValidationError]: + """Walk the exception cause chain looking for a pydantic ValidationError. + + pydantic-ai wraps validation failures inside UnexpectedModelBehavior after + exhausting retries; the original ValidationError surfaces via __cause__. + """ + seen: set[int] = set() + current: Optional[BaseException] = exc + while current is not None and id(current) not in seen: + seen.add(id(current)) + if isinstance(current, ValidationError): + return current + current = current.__cause__ or current.__context__ + return None + + class CustomToolAgent(BaseGalaxyAgent): """Agent that creates custom Galaxy tools using UserToolSource schema. @@ -98,6 +119,23 @@ async def process(self, query: str, context: Optional[dict[str, Any]] = None) -> error="invalid_structured_output", ) + lint_errors = lint_user_tool_source(tool) + if lint_errors: + log.debug("CustomToolAgent lint failure: %s", lint_errors) + bullet_text = "\n".join(f"- {issue}" for issue in lint_errors) + return self._build_response( + content=( + "The model produced a tool definition, but it has problems " + "that need to be fixed before it can be saved:\n\n" + f"{bullet_text}" + ), + confidence=ConfidenceLevel.LOW, + method="lint_error", + query=query, + error="lint_failed", + agent_data={"lint_errors": lint_errors}, + ) + tool_dict = tool.model_dump(by_alias=True, exclude_none=True) tool_yaml = yaml.dump(tool_dict, default_flow_style=False, sort_keys=False) @@ -178,6 +216,27 @@ async def process(self, query: str, context: Optional[dict[str, Any]] = None) -> ) raise except UnexpectedModelBehavior as e: + pydantic_error = _find_validation_error(e) + if pydantic_error is not None: + # Expected path: the user is editing the prompt iteratively and + # the LLM produced a tool definition that fails one of the + # UserToolSource validators. Surface the friendly bullet list + # rather than a generic "model misbehaved" message. + bullets = format_validation_errors(pydantic_error) + log.debug("CustomToolAgent validation failure: %s", bullets) + bullet_text = "\n".join(f"- {issue}" for issue in bullets) + return self._build_response( + content=( + "The model produced a tool definition, but it has problems " + "that need to be fixed before it can be saved:\n\n" + f"{bullet_text}" + ), + confidence=ConfidenceLevel.LOW, + method="validation_error", + query=query, + error="validation_failed", + agent_data={"validation_errors": bullets}, + ) log.warning(f"Model failed to produce valid tool definition: {e}") model = self._get_agent_config("model", "unknown") return self._build_response( diff --git a/lib/galaxy/managers/tools.py b/lib/galaxy/managers/tools.py index 3af6cb74beeb..07fd1b7d0bc6 100644 --- a/lib/galaxy/managers/tools.py +++ b/lib/galaxy/managers/tools.py @@ -28,6 +28,7 @@ UserDynamicToolAssociation, ) from galaxy.tool_util.cwl import tool_proxy +from galaxy.tool_util.lint import lint_user_tool_source from galaxy.tool_util.parser.yaml import YamlToolSource from galaxy.tool_util.toolbox import AbstractToolBox from galaxy.tool_util_models.dynamic_tool_models import ( @@ -194,6 +195,9 @@ def create_unprivileged_tool( "Set 'enable_beta_tool_formats' in Galaxy config to create dynamic tools." ) self.ensure_can_use_unprivileged_tool(user) + lint_errors = lint_user_tool_source(tool_payload.representation) + if lint_errors: + raise exceptions.RequestParameterInvalidException("Tool failed lint checks: " + "; ".join(lint_errors)) dynamic_tool = self.create( tool_format=tool_payload.representation.class_, tool_id=tool_payload.representation.id, diff --git a/lib/galaxy/tool_util/lint.py b/lib/galaxy/tool_util/lint.py index 3d2796a2927e..2bfc483069af 100644 --- a/lib/galaxy/tool_util/lint.py +++ b/lib/galaxy/tool_util/lint.py @@ -62,6 +62,7 @@ import galaxy.tool_util.linters from galaxy.tool_util.parser import get_tool_source +from galaxy.tool_util.parser.yaml import YamlToolSource from galaxy.util import ( Element, submodules, @@ -69,6 +70,7 @@ if TYPE_CHECKING: from galaxy.tool_util.parser.interface import ToolSource + from galaxy.tool_util_models import UserToolSource class LintLevel(IntEnum): @@ -308,6 +310,23 @@ def failed(self, fail_level: Union[LintLevel, str]) -> bool: return lint_fail +def lint_user_tool_source(user_tool_source: "UserToolSource") -> List[str]: + """Run the lint pipeline against a ``UserToolSource`` pydantic value. + + Returns a list of formatted ``": "`` bullets at WARN + level or above, suitable for surfacing through ``format_validation_errors``- + style consumers (the agent's bullet list, an API 4xx body). + """ + root_dict = user_tool_source.model_dump(by_alias=True, exclude_none=True) + tool_source = YamlToolSource(root_dict) + lint_context = get_lint_context_for_tool_source(tool_source) + bullets: List[str] = [] + for message in lint_context.error_messages + lint_context.warn_messages: + prefix = f"{message.linter}: " if message.linter else "" + bullets.append(f"{prefix}{message.message}") + return bullets + + def lint_tool_source( tool_source, level=LintLevel.ALL, fail_level=LintLevel.WARN, extra_modules=None, skip_types=None, name=None ) -> bool: diff --git a/lib/galaxy/tool_util/linters/containers.py b/lib/galaxy/tool_util/linters/containers.py new file mode 100644 index 000000000000..bc1917b1e191 --- /dev/null +++ b/lib/galaxy/tool_util/linters/containers.py @@ -0,0 +1,54 @@ +"""Linter rules covering container references on a tool source.""" + +import re +from typing import ( + Iterator, + Tuple, + TYPE_CHECKING, +) + +from galaxy.tool_util.lint import Linter + +if TYPE_CHECKING: + from galaxy.tool_util.lint import LintContext + from galaxy.tool_util.parser.interface import ToolSource + + +lint_tool_types = ["*"] + + +CONTAINER_PREFIXES: Tuple[str, ...] = ("quay.io/biocontainers/", "docker://", "oras://") +DOCKER_IMAGE_RE = re.compile(r"^[a-zA-Z0-9][a-zA-Z0-9._-]*(/[a-zA-Z0-9._-]+)*(:[\w][\w.-]*)?$") + + +def _iter_container_identifiers(tool_source: "ToolSource") -> Iterator[str]: + try: + _, containers, _, _, _ = tool_source.parse_requirements() + except Exception: + return + for container in containers or (): + identifier = getattr(container, "identifier", None) + if identifier: + yield identifier + + +class ContainerImageShape(Linter): + """Container identifiers should match a recognized shape. + + Recognized: a `quay.io/biocontainers/...`, `docker://...`, or `oras://...` + prefix; or a Docker-Hub-style `[:]` reference. + """ + + @classmethod + def lint(cls, tool_source: "ToolSource", lint_ctx: "LintContext"): + for identifier in _iter_container_identifiers(tool_source): + stripped = identifier.strip() + if stripped.startswith(CONTAINER_PREFIXES): + continue + if DOCKER_IMAGE_RE.match(stripped): + continue + lint_ctx.warn( + f"container '{identifier}' does not match a recognized shape " + "(quay.io/biocontainers/..., docker://..., oras://..., or [:])", + linter=cls.name(), + ) diff --git a/lib/galaxy/tool_util_models/__init__.py b/lib/galaxy/tool_util_models/__init__.py index fb0f6629de2a..d39d7ce981a6 100644 --- a/lib/galaxy/tool_util_models/__init__.py +++ b/lib/galaxy/tool_util_models/__init__.py @@ -4,11 +4,13 @@ for reasoning about tool state externally from Galaxy. """ +import re from typing import ( Any, Dict, List, Optional, + Set, Union, ) @@ -18,9 +20,11 @@ ConfigDict, Discriminator, Field, + field_validator, model_validator, RootModel, Tag, + ValidationError, ) from typing_extensions import ( Annotated, @@ -39,6 +43,8 @@ from .test_job import Job from .tool_outputs import ( IncomingToolOutput, + IncomingToolOutputCollection, + IncomingToolOutputDataset, ToolOutput, ) from .tool_source import ( @@ -62,6 +68,48 @@ def normalize_dict(values, keys: List[str]): values[key] = [{"name": k, **v} for k, v in items.items()] +# Tool ID: lowercase, leading letter, letters/digits/'_'/'-'. +_TOOL_ID_RE = re.compile(r"^[a-z][a-z0-9_-]*$") +TOOL_ID_PATTERN = r"^[a-z][a-z0-9_-]*$" + +# Templated ecmascript inside `shell_command` / `configfiles[*].content`. +# Pull every $() and extract the *leading* 'inputs.' identifier. +# Only the top-level name is checked, so nested references like +# 'inputs.cond.test_parameter' or 'inputs.repeat[0].x' resolve against +# the conditional / repeat / section's own top-level name -- no false +# positives for nested structures. Computed/aliased references (e.g. +# 'var x = inputs; x.foo') are intentionally not parsed; the goal is +# catching obvious typos cheaply, not modelling ecmascript scope. +_TEMPLATE_BLOCK_RE = re.compile(r"\$\((.*?)\)", re.DOTALL) +_INPUTS_REF_RE = re.compile(r"\binputs\.([A-Za-z_][A-Za-z0-9_]*)") + + +def _command_input_refs(text: Optional[str]) -> Set[str]: + refs: Set[str] = set() + if not text: + return refs + for block in _TEMPLATE_BLOCK_RE.findall(text): + for match in _INPUTS_REF_RE.findall(block): + refs.add(match) + return refs + + +def format_validation_errors(exc: ValidationError) -> List[str]: + """Distill a pydantic ValidationError into a human-readable list. + + Each entry is `: `, or just `` for + model-level errors with no location. Suitable for surfacing directly to + a user (in the agent's bullet list, or as an API 4xx body). + """ + lines: List[str] = [] + for err in exc.errors(): + loc_parts = [str(p) for p in err.get("loc", ()) if p not in ("__root__",)] + loc = ".".join(loc_parts) + msg = err.get("msg", "validation error") + lines.append(f"{loc}: {msg}" if loc else msg) + return lines + + class _DynamicToolSourceBase(ToolSourceBaseModel): # extra="forbid" rejects unknown top-level keys (e.g. a stray `argument:` at # the tool level), matching the strict-narrow stance on `inputs`. @@ -73,17 +121,22 @@ class _DynamicToolSourceBase(ToolSourceBaseModel): id: Annotated[ Optional[str], Field( - description="Unique identifier for the tool. Should be all lower-case and should not include whitespace.", + description=( + "Unique identifier for the tool. Lowercase, must start with a letter, " + "may contain letters, digits, '_' and '-'." + ), examples=["my-cool-tool"], min_length=3, max_length=255, + pattern=TOOL_ID_PATTERN, ), ] = None version: Annotated[Optional[str], Field(description="Version for the tool.", examples=["0.1.0"])] = None name: Annotated[ str, Field( - description="The name of the tool, displayed in the tool menu. This is not the same as the tool id, which is a unique identifier for the tool." + description="The name of the tool, displayed in the tool menu. This is not the same as the tool id, which is a unique identifier for the tool.", + min_length=5, ), ] description: Annotated[ @@ -133,6 +186,43 @@ def normalize_items(cls, values): normalize_dict(values, ["inputs", "outputs"]) return values + @field_validator("name", "version", mode="after") + @classmethod + def _reject_blank_strings(cls, v: Optional[str]) -> Optional[str]: + if v is not None and not v.strip(): + raise ValueError("must not be empty or whitespace") + return v + + @model_validator(mode="after") + def _check_input_refs_and_outputs(self) -> "_DynamicToolSourceBase": + declared_inputs: Set[str] = {param.root.name for param in self.inputs} + + referenced: Set[str] = _command_input_refs(self.shell_command) + for configfile in self.configfiles or []: + referenced |= _command_input_refs(configfile.content) + + errors: List[str] = [] + for name in sorted(referenced - declared_inputs): + errors.append(f"references inputs.{name} but no input named '{name}' is declared") + + for output in self.outputs: + if isinstance(output, IncomingToolOutputDataset): + if not output.from_work_dir and not output.discover_datasets: + errors.append( + f"output '{output.name}' must set 'from_work_dir' or 'discover_datasets' " + "(otherwise its bytes will never be claimed from the working directory)" + ) + elif isinstance(output, IncomingToolOutputCollection): + if not output.structure.discover_datasets: + errors.append( + f"output collection '{output.name}' must set 'structure.discover_datasets' " + "(otherwise no elements will be claimed from the working directory)" + ) + + if errors: + raise ValueError("; ".join(errors)) + return self + class UserToolSource(_DynamicToolSourceBase): class_: Annotated[Literal["GalaxyUserTool"], Field(alias="class")] @@ -140,6 +230,13 @@ class UserToolSource(_DynamicToolSourceBase): str, Field(description="Container image to use for this tool.", examples=["quay.io/biocontainers/python:3.13"]) ] + @field_validator("container", mode="after") + @classmethod + def _reject_blank_container(cls, value: str) -> str: + if not value or not value.strip(): + raise ValueError("container must not be empty") + return value + class YamlToolSource(_DynamicToolSourceBase): class_: Annotated[Literal["GalaxyTool"], Field(alias="class")] diff --git a/lib/galaxy/tool_util_models/tool_source.py b/lib/galaxy/tool_util_models/tool_source.py index 6612b67a2662..5a9c93809dd3 100644 --- a/lib/galaxy/tool_util_models/tool_source.py +++ b/lib/galaxy/tool_util_models/tool_source.py @@ -1,3 +1,4 @@ +import re from enum import Enum from typing import ( List, @@ -8,6 +9,7 @@ from pydantic import ( ConfigDict, Field, + model_validator, with_config, ) from typing_extensions import ( @@ -142,10 +144,37 @@ class YamlTemplateConfigFile(TemplateConfigFile): eval_engine: Literal["ecmascript"] = "ecmascript" +# DOI: '10./' per Crossref's published shape. +DOI_RE = re.compile(r"^10\.\d{4,9}/.+$") +# BibTeX entries open with '@{' -- e.g. '@article{', '@inproceedings{'. +BIBTEX_RE = re.compile(r"^@[a-zA-Z]+\s*\{", re.MULTILINE) + + class Citation(ToolSourceBaseModel): type: str content: str + @model_validator(mode="after") + def _check_citation_shape(self) -> "Citation": + content = (self.content or "").strip() + if not content: + raise ValueError("citation content must not be empty") + citation_type = (self.type or "").strip().lower() + if citation_type == "doi": + if not DOI_RE.match(content): + raise ValueError(f"declared as DOI but '{content}' does not match DOI shape (^10\\.\\d{{4,9}}/.+$)") + return self + if citation_type == "bibtex": + if not BIBTEX_RE.search(content): + raise ValueError("declared as bibtex but content does not start with '@{'") + return self + # Type wasn't explicitly doi/bibtex -- accept if the content shape is + # one of the two known forms. Lets a slightly mis-typed entry through + # instead of fighting models that emit type='reference' or similar. + if DOI_RE.match(content) or BIBTEX_RE.search(content): + return self + raise ValueError(f"citation (type={self.type!r}) is neither a recognizable DOI nor a BibTeX entry") + class HelpContent(ToolSourceBaseModel): format: Literal["restructuredtext", "plain_text", "markdown"] diff --git a/test/unit/tool_util/test_container_shape_lint.py b/test/unit/tool_util/test_container_shape_lint.py new file mode 100644 index 000000000000..ecda8298f76c --- /dev/null +++ b/test/unit/tool_util/test_container_shape_lint.py @@ -0,0 +1,78 @@ +"""Tests for the ContainerImageShape linter and the lint_user_tool_source helper.""" + +from copy import deepcopy + +import pytest + +from galaxy.tool_util.lint import ( + get_lint_context_for_tool_source, + lint_user_tool_source, +) +from galaxy.tool_util.linters.containers import ContainerImageShape +from galaxy.tool_util.parser.yaml import YamlToolSource +from galaxy.tool_util_models import UserToolSource + +VALID_TOOL = { + "class": "GalaxyUserTool", + "id": "my-cool-tool", + "name": "My Cool Tool", + "version": "0.1.0", + "description": "A cool tool.", + "container": "quay.io/biocontainers/python:3.13", + "shell_command": "head -n '$(inputs.n_lines)' '$(inputs.data_input.path)' > out.txt", + "inputs": [ + {"type": "integer", "name": "n_lines"}, + {"type": "data", "name": "data_input"}, + ], + "outputs": [ + {"type": "data", "name": "out", "from_work_dir": "out.txt"}, + ], + "citations": [ + {"type": "doi", "content": "10.1234/abc.def"}, + ], +} + + +def _doc(**overrides): + base = deepcopy(VALID_TOOL) + base.update(overrides) + return base + + +@pytest.mark.parametrize( + "container", + [ + "quay.io/biocontainers/samtools:1.17", + "docker://my-registry/image:tag", + "oras://example.org/image", + "busybox", + "ubuntu:latest", + "library/python:3.11-slim", + ], +) +def test_valid_container_shapes_pass_lint(container): + tool_source = YamlToolSource(_doc(container=container)) + ctx = get_lint_context_for_tool_source(tool_source) + container_warns = [m for m in ctx.warn_messages if m.linter == ContainerImageShape.name()] + assert container_warns == [] + + +@pytest.mark.parametrize("bad_container", ["definitely not a container", "foo bar baz"]) +def test_invalid_container_shapes_warn(bad_container): + tool_source = YamlToolSource(_doc(container=bad_container)) + ctx = get_lint_context_for_tool_source(tool_source) + container_warns = [m for m in ctx.warn_messages if m.linter == ContainerImageShape.name()] + assert len(container_warns) == 1 + assert "does not match a recognized shape" in container_warns[0].message + + +def test_lint_user_tool_source_returns_empty_on_clean_tool(): + user_tool = UserToolSource.model_validate(VALID_TOOL) + assert lint_user_tool_source(user_tool) == [] + + +def test_lint_user_tool_source_surfaces_container_shape_failure(): + user_tool = UserToolSource.model_validate(_doc(container="totally bogus value")) + bullets = lint_user_tool_source(user_tool) + assert any("does not match a recognized shape" in b for b in bullets) + assert any(b.startswith(f"{ContainerImageShape.name()}:") for b in bullets) diff --git a/test/unit/tool_util/test_tool_linters.py b/test/unit/tool_util/test_tool_linters.py index 121bf65d7ca4..8996db9dc3d6 100644 --- a/test/unit/tool_util/test_tool_linters.py +++ b/test/unit/tool_util/test_tool_linters.py @@ -2543,7 +2543,7 @@ def test_skip_by_module(lint_ctx): def test_list_linters(): linter_names = Linter.list_listers() # make sure to add/remove a test for new/removed linters if this number changes - assert len(linter_names) == 145 + assert len(linter_names) == 146 assert "Linter" not in linter_names # make sure that linters from all modules are available for prefix in [ diff --git a/test/unit/tool_util/test_user_tool_source_validation.py b/test/unit/tool_util/test_user_tool_source_validation.py new file mode 100644 index 000000000000..77b886e6a37b --- /dev/null +++ b/test/unit/tool_util/test_user_tool_source_validation.py @@ -0,0 +1,197 @@ +"""Direct tests for the semantic validators on ``UserToolSource``. + +These tests construct ``UserToolSource`` payloads in-memory and assert that +each rule (id pattern, citation shape, undeclared ``inputs.`` +references in ``shell_command`` / ``configfiles``, output discovery +requirements, blank required fields) raises a ``ValidationError`` whose +distilled output identifies the offending field. + +Container *shape* is enforced by the lint framework, not pydantic — see +``test_container_shape_lint.py``. +""" + +from copy import deepcopy + +import pytest +from pydantic import ValidationError + +from galaxy.tool_util_models import ( + format_validation_errors, + UserToolSource, +) + +VALID_TOOL = { + "class": "GalaxyUserTool", + "id": "my-cool-tool", + "name": "My Cool Tool", + "version": "0.1.0", + "description": "A cool tool.", + "container": "quay.io/biocontainers/python:3.13", + "shell_command": "head -n '$(inputs.n_lines)' '$(inputs.data_input.path)' > out.txt", + "inputs": [ + {"type": "integer", "name": "n_lines"}, + {"type": "data", "name": "data_input"}, + ], + "outputs": [ + {"type": "data", "name": "out", "from_work_dir": "out.txt"}, + ], + "citations": [ + {"type": "doi", "content": "10.1234/abc.def"}, + ], +} + + +def _doc(**overrides): + base = deepcopy(VALID_TOOL) + base.update(overrides) + return base + + +def _assert_error_contains(exc: ValidationError, needle: str) -> None: + flat = " | ".join(format_validation_errors(exc)) + assert needle in flat, f"expected substring {needle!r} in errors:\n{flat}" + + +def test_happy_path(): + UserToolSource.model_validate(VALID_TOOL) + + +def test_hyphenated_id_is_accepted(): + UserToolSource.model_validate(_doc(id="with-hyphens-and_underscores")) + + +@pytest.mark.parametrize( + "bad_id", + ["My-Tool", "1starts_with_digit", "has space", "trailing!", "_leading_underscore"], +) +def test_invalid_id_rejected(bad_id): + with pytest.raises(ValidationError) as info: + UserToolSource.model_validate(_doc(id=bad_id)) + _assert_error_contains(info.value, "String should match pattern") + + +@pytest.mark.parametrize("bad_container", ["", " "]) +def test_blank_container_rejected(bad_container): + with pytest.raises(ValidationError) as info: + UserToolSource.model_validate(_doc(container=bad_container)) + _assert_error_contains(info.value, "container must not be empty") + + +def test_blank_name_rejected(): + # Long enough to clear `min_length=5`, so the whitespace-rejection + # field_validator is what fires. + with pytest.raises(ValidationError) as info: + UserToolSource.model_validate(_doc(name=" ")) + _assert_error_contains(info.value, "must not be empty or whitespace") + + +def test_undeclared_inputs_ref_in_shell_command(): + bad = _doc(shell_command="echo $(inputs.foo)") + with pytest.raises(ValidationError) as info: + UserToolSource.model_validate(bad) + _assert_error_contains(info.value, "inputs.foo") + + +def test_conditional_top_level_name_resolves_for_nested_ref(): + """`$(inputs.cond.test_parameter)` must validate against the conditional's + top-level name, not its nested `test_parameter` -- a regression test + for the false-positive concern with conditionals/repeats/sections. + """ + UserToolSource.model_validate( + _doc( + shell_command="echo $(inputs.cond.test_parameter) > out.txt", + inputs=[ + { + "type": "conditional", + "name": "cond", + "test_parameter": {"type": "boolean", "name": "test_parameter"}, + "whens": [ + {"discriminator": True, "parameters": []}, + {"discriminator": False, "parameters": []}, + ], + } + ], + ) + ) + + +def test_repeat_and_section_top_level_names_resolve(): + UserToolSource.model_validate( + _doc( + shell_command="echo $(inputs.my_repeat[0].x) $(inputs.my_section.y) > out.txt", + inputs=[ + {"type": "repeat", "name": "my_repeat", "parameters": []}, + {"type": "section", "name": "my_section", "parameters": []}, + ], + ) + ) + + +def test_undeclared_inputs_ref_in_configfile(): + bad = _doc( + configfiles=[ + { + "name": "script", + "filename": "script.sh", + "content": "echo $(inputs.unknown)", + "eval_engine": "ecmascript", + } + ] + ) + with pytest.raises(ValidationError) as info: + UserToolSource.model_validate(bad) + _assert_error_contains(info.value, "inputs.unknown") + + +def test_data_output_without_from_work_dir_or_discovery_rejected(): + bad = _doc(outputs=[{"type": "data", "name": "out"}]) + with pytest.raises(ValidationError) as info: + UserToolSource.model_validate(bad) + _assert_error_contains(info.value, "from_work_dir") + + +def test_collection_output_without_discover_rejected(): + bad = _doc( + outputs=[ + { + "type": "collection", + "name": "outs", + "structure": {"collection_type": "list"}, + } + ] + ) + with pytest.raises(ValidationError) as info: + UserToolSource.model_validate(bad) + _assert_error_contains(info.value, "discover_datasets") + + +def test_invalid_doi_citation_rejected(): + bad = _doc(citations=[{"type": "doi", "content": "not-a-doi"}]) + with pytest.raises(ValidationError) as info: + UserToolSource.model_validate(bad) + _assert_error_contains(info.value, "DOI") + + +def test_invalid_bibtex_citation_rejected(): + bad = _doc(citations=[{"type": "bibtex", "content": "no leading at-sign"}]) + with pytest.raises(ValidationError) as info: + UserToolSource.model_validate(bad) + _assert_error_contains(info.value, "bibtex") + + +def test_unknown_type_citation_with_doi_content_accepted(): + UserToolSource.model_validate(_doc(citations=[{"type": "reference", "content": "10.1234/abc.def"}])) + + +def test_no_citations_accepted(): + UserToolSource.model_validate(_doc(citations=None)) + + +def test_format_validation_errors_distills_loc_and_msg(): + bad = _doc(id="BAD-ID", container="") + with pytest.raises(ValidationError) as info: + UserToolSource.model_validate(bad) + assert format_validation_errors(info.value) == [ + "id: String should match pattern '^[a-z][a-z0-9_-]*$'", + "container: Value error, container must not be empty", + ]