def _suite_edit_workflow( context: DataContext, expectation_suite_name: str, profile: bool, usage_event: str, interactive: bool, no_jupyter: bool, create_if_not_exist: Optional[bool] = False, datasource_name: Optional[str] = None, batch_request: Optional[Union[str, Dict[str, Union[str, int, Dict[str, Any]]]]] = None, additional_batch_request_args: Optional[Dict[str, Union[str, int, Dict[str, Any]]]] = None, suppress_usage_message: Optional[bool] = False, assume_yes: Optional[bool] = False, ): # suppress_usage_message flag is for the situation where _suite_edit_workflow is called by _suite_new_workflow(). # when called by _suite_new_workflow(), the flag will be set to True, otherwise it will default to False if suppress_usage_message: usage_event = None suite: ExpectationSuite = toolkit.load_expectation_suite( data_context=context, expectation_suite_name=expectation_suite_name, usage_event=usage_event, create_if_not_exist=create_if_not_exist, ) try: if interactive or profile: batch_request_from_citation_is_up_to_date: bool = True batch_request_from_citation: Optional[Union[str, Dict[str, Union[ str, Dict[str, Any]]]]] = toolkit.get_batch_request_from_citations( expectation_suite=suite) if batch_request is not None and isinstance(batch_request, str): batch_request = toolkit.get_batch_request_from_json_file( batch_request_json_file_path=batch_request, data_context=context, usage_event=usage_event, suppress_usage_message=suppress_usage_message, ) if batch_request != batch_request_from_citation: batch_request_from_citation_is_up_to_date = False if not (batch_request and isinstance(batch_request, dict) and BatchRequest(**batch_request)): if (batch_request_from_citation and isinstance(batch_request_from_citation, dict) and BatchRequest(**batch_request_from_citation)): batch_request = copy.deepcopy(batch_request_from_citation) else: batch_request = toolkit.get_batch_request_using_datasource_name( data_context=context, datasource_name=datasource_name, usage_event=usage_event, suppress_usage_message=False, additional_batch_request_args= additional_batch_request_args, ) if batch_request != batch_request_from_citation: batch_request_from_citation_is_up_to_date = False if not batch_request_from_citation_is_up_to_date: toolkit.add_citation_with_batch_request( data_context=context, expectation_suite=suite, batch_request=batch_request, ) notebook_name: str = "edit_{}.ipynb".format(expectation_suite_name) notebook_path: str = _get_notebook_path(context, notebook_name) if profile: if not assume_yes: toolkit.prompt_profile_to_create_a_suite( data_context=context, expectation_suite_name=expectation_suite_name) renderer: SuiteProfileNotebookRenderer = SuiteProfileNotebookRenderer( context=context, expectation_suite_name=expectation_suite_name, batch_request=batch_request, ) renderer.render_to_disk(notebook_file_path=notebook_path) else: SuiteEditNotebookRenderer.from_data_context( data_context=context).render_to_disk( suite=suite, notebook_file_path=notebook_path, batch_request=batch_request, ) if no_jupyter: cli_message( string= f"To continue editing this suite, run <green>jupyter notebook {notebook_path}</green>" ) else: cli_message( string= """<green>Opening a notebook for you now to edit your expectation suite! If you wish to avoid this you can add the `--no-jupyter` flag.</green>\n\n""") payload: dict = edit_expectation_suite_usage_statistics( data_context=context, expectation_suite_name=suite.expectation_suite_name) if not suppress_usage_message: toolkit.send_usage_message( data_context=context, event=usage_event, event_payload=payload, success=True, ) if not no_jupyter: toolkit.launch_jupyter_notebook(notebook_path=notebook_path) except ( ge_exceptions.DataContextError, ge_exceptions.ProfilerError, ValueError, OSError, SQLAlchemyError, ) as e: cli_message(string="<red>{}</red>".format(e)) if not suppress_usage_message: toolkit.send_usage_message(data_context=context, event=usage_event, success=False) sys.exit(1) except Exception as e: if not suppress_usage_message: toolkit.send_usage_message(data_context=context, event=usage_event, success=False) raise e
def _suite_new_workflow( context: DataContext, expectation_suite_name: str, interactive: bool, profile: bool, no_jupyter: bool, usage_event: str, batch_request: Optional[Union[str, Dict[str, Union[str, int, Dict[str, Any]]]]] = None, ): try: datasource_name: Optional[str] = None data_asset_name: Optional[str] = None additional_batch_request_args: Optional[Dict[str, Union[str, int, Dict[str, Any]]]] = { "limit": 1000 } if interactive: if batch_request is not None and isinstance(batch_request, str): batch_request = toolkit.get_batch_request_from_json_file( batch_request_json_file_path=batch_request, data_context=context, usage_event=usage_event, suppress_usage_message=False, ) if not batch_request: batch_request = toolkit.get_batch_request_using_datasource_name( data_context=context, datasource_name=datasource_name, usage_event=usage_event, suppress_usage_message=False, additional_batch_request_args=additional_batch_request_args, ) # In this case, we have "consumed" the additional_batch_request_args additional_batch_request_args = {} data_asset_name = batch_request.get("data_asset_name") else: batch_request = None suite: ExpectationSuite = toolkit.get_or_create_expectation_suite( expectation_suite_name=expectation_suite_name, data_context=context, data_asset_name=data_asset_name, usage_event=usage_event, suppress_usage_message=False, batch_request=batch_request, create_if_not_exist=True, ) expectation_suite_name = suite.expectation_suite_name toolkit.add_citation_with_batch_request( data_context=context, expectation_suite=suite, batch_request=batch_request, ) toolkit.send_usage_message(data_context=context, event=usage_event, success=True) if batch_request: datasource_name = batch_request.get("datasource_name") # This usage event is suppressed via suppress_usage_message but here because usage_event is not optional usage_event = "cli.suite.edit.begin" # or else we will be sending `cli.suite.new` which is incorrect # do not want to actually send usage_message, since the function call is not the result of actual usage _suite_edit_workflow( context=context, expectation_suite_name=expectation_suite_name, profile=profile, usage_event=usage_event, interactive=interactive, no_jupyter=no_jupyter, create_if_not_exist=True, datasource_name=datasource_name, batch_request=batch_request, additional_batch_request_args=additional_batch_request_args, suppress_usage_message=True, assume_yes=False, ) except ( ge_exceptions.DataContextError, ge_exceptions.ProfilerError, ValueError, OSError, SQLAlchemyError, ) as e: cli_message(string="<red>{}</red>".format(e)) toolkit.send_usage_message(data_context=context, event=usage_event, success=False) sys.exit(1) except Exception as e: toolkit.send_usage_message(data_context=context, event=usage_event, success=False) raise e