Allow next_step to be a string (#82647)

* Allow next_step to be a string

* Adjust docstrings

* Add test
This commit is contained in:
epenet 2022-11-24 18:55:53 +01:00 committed by GitHub
parent 285aff154d
commit caa99ea9fb
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 25 additions and 13 deletions

View file

@ -134,7 +134,7 @@ DATA_SCHEMA_SENSOR = vol.Schema(SENSOR_SETUP)
CONFIG_FLOW: dict[str, SchemaFlowFormStep | SchemaFlowMenuStep] = {
"user": SchemaFlowFormStep(
schema=DATA_SCHEMA_RESOURCE,
next_step=lambda _: "sensor",
next_step="sensor",
validate_user_input=validate_rest_setup,
),
"sensor": SchemaFlowFormStep(

View file

@ -32,18 +32,22 @@ class SchemaFlowFormStep:
vol.Schema | None,
] | None
# Optional function to validate user input.
# The validate_user_input function is called if the schema validates successfully.
# The validate_user_input function is passed the user input from the current step.
# The validate_user_input should raise SchemaFlowError is user input is invalid.
validate_user_input: Callable[[dict[str, Any]], dict[str, Any]] = lambda x: x
"""Optional function to validate user input.
# Optional function to identify next step.
# The next_step function is called if the schema validates successfully or if no
# schema is defined. The next_step function is passed the union of config entry
# options and user input from previous steps.
# If next_step is None, the flow is ended with FlowResultType.CREATE_ENTRY.
next_step: Callable[[dict[str, Any]], str] | None = None
- The `validate_user_input` function is called if the schema validates successfully.
- The `validate_user_input` function is passed the user input from the current step.
- The `validate_user_input` should raise `SchemaFlowError` is user input is invalid.
"""
next_step: Callable[[dict[str, Any]], str] | str | None = None
"""Optional property to identify next step.
- If `next_step` is a function, it is called if the schema validates successfully or
if no schema is defined. The `next_step` function is passed the union of config entry
options and user input from previous steps.
- If `next_step` is None, the flow is ended with `FlowResultType.CREATE_ENTRY`.
"""
# Optional function to allow amending a form schema.
# The update_form_schema function is called before async_show_form is called. The
@ -140,7 +144,10 @@ class SchemaCommonFlowHandler:
# Flow done, create entry or update config entry options
return self._handler.async_create_entry(data=self._options)
next_step_id = form_step.next_step(self._options)
if isinstance(form_step.next_step, str):
next_step_id = form_step.next_step
else:
next_step_id = form_step.next_step(self._options)
return self._show_next_step(next_step_id)

View file

@ -29,7 +29,8 @@ async def test_menu_step(hass: HomeAssistant) -> None:
"user": SchemaFlowMenuStep(MENU_1),
"option1": SchemaFlowFormStep(vol.Schema({}), next_step=lambda _: "menu2"),
"menu2": SchemaFlowMenuStep(MENU_2),
"option3": SchemaFlowFormStep(vol.Schema({})),
"option3": SchemaFlowFormStep(vol.Schema({}), next_step="option4"),
"option4": SchemaFlowFormStep(vol.Schema({})),
}
class TestConfigFlow(SchemaConfigFlowHandler, domain=TEST_DOMAIN):
@ -63,5 +64,9 @@ async def test_menu_step(hass: HomeAssistant) -> None:
assert result["type"] == FlowResultType.FORM
assert result["step_id"] == "option3"
result = await hass.config_entries.flow.async_configure(result["flow_id"], {})
assert result["type"] == FlowResultType.FORM
assert result["step_id"] == "option4"
result = await hass.config_entries.flow.async_configure(result["flow_id"], {})
assert result["type"] == FlowResultType.CREATE_ENTRY