def store_list(ctx): """List known Stores.""" display_not_implemented_message_and_exit() context = ctx.obj.data_context try: stores = context.list_stores() if len(stores) == 0: cli_message("No Stores found") toolkit.send_usage_message(data_context=context, event="cli.store.list", success=True) return elif len(stores) == 1: list_intro_string = "1 Store found:" else: list_intro_string = "{} Stores found:".format(len(stores)) cli_message(list_intro_string) for store in stores: cli_message("") cli_message_dict(store) toolkit.send_usage_message(data_context=context, event="cli.store.list", success=True) except Exception as e: toolkit.send_usage_message(data_context=context, event="cli.store.list", success=False) raise e
def suite_edit(ctx, suite, datasource, jupyter, batch_kwargs): """ Generate a Jupyter notebook for editing an existing Expectation Suite. The SUITE argument is required. This is the name you gave to the suite when you created it. A batch of data is required to edit the suite, which is used as a sample. The edit command will help you specify a batch interactively. Or you can specify them manually by providing --batch-kwargs in valid JSON format. Read more about specifying batches of data in the documentation: https://docs.greatexpectations.io/ """ display_not_implemented_message_and_exit() directory = toolkit.parse_cli_config_file_location( config_file_location=ctx.obj.config_file_location).get("directory") _suite_edit( suite, datasource, directory, jupyter, batch_kwargs, usage_event="cli.suite.edit", )
def suite_delete(ctx, suite): """ Delete an expectation suite from the expectation store. """ display_not_implemented_message_and_exit() usage_event = "cli.suite.delete" directory = toolkit.parse_cli_config_file_location( config_file_location=ctx.obj.config_file_location).get("directory") context = toolkit.load_data_context_with_error_handling(directory) suite_names = context.list_expectation_suite_names() if not suite_names: toolkit.exit_with_failure_message_and_stats( context, usage_event, "</red>No expectation suites found in the project.</red>", ) if suite not in suite_names: toolkit.exit_with_failure_message_and_stats( context, usage_event, f"No expectation suite named {suite} found.") context.delete_expectation_suite(suite) cli_message(f"Deleted the expectation suite named: {suite}") toolkit.send_usage_message(data_context=context, event=usage_event, success=True)
def suite_list(ctx): """Lists available Expectation Suites.""" display_not_implemented_message_and_exit() directory = toolkit.parse_cli_config_file_location( config_file_location=ctx.obj.config_file_location).get("directory") context = toolkit.load_data_context_with_error_handling(directory) try: suite_names = [ " - <cyan>{}</cyan>".format(suite_name) for suite_name in context.list_expectation_suite_names() ] if len(suite_names) == 0: cli_message("No Expectation Suites found") toolkit.send_usage_message(data_context=context, event="cli.suite.list", success=True) return elif len(suite_names) == 1: list_intro_string = "1 Expectation Suite found:" else: list_intro_string = "{} Expectation Suites found:".format( len(suite_names)) cli_message_list(suite_names, list_intro_string) toolkit.send_usage_message(data_context=context, event="cli.suite.list", success=True) except Exception as e: toolkit.send_usage_message(data_context=context, event="cli.suite.list", success=False) raise e
def clean_data_docs(ctx, site_name=None, all=None): """Delete data docs""" display_not_implemented_message_and_exit() context = ctx.obj.data_context failed = True if site_name is None and all is None: cli_message( "<red>{}</red>".format( "Please specify --all to remove all sites or specify a specific site using " "--site_name" ) ) sys.exit(1) context.clean_data_docs(site_name=site_name) failed = False if not failed and context is not None: toolkit.send_usage_message( data_context=context, event="cli.docs.clean", success=True ) cli_message("<green>{}</green>".format("Cleaned data docs")) if failed and context is not None: toolkit.send_usage_message( data_context=context, event="cli.docs.clean", success=False )
def datasource_new(ctx): """Add a new datasource to the data context.""" display_not_implemented_message_and_exit() context = ctx.obj.data_context datasource_name, data_source_type = add_datasource(context) if datasource_name: cli_message( "A new datasource '{}' was added to your project.".format(datasource_name) ) toolkit.send_usage_message( data_context=context, event="cli.datasource.new", success=True ) else: # no datasource was created toolkit.send_usage_message( data_context=context, event="cli.datasource.new", success=False ) sys.exit(1)
def suite_new(ctx, suite, jupyter, batch_kwargs): """ Create a new empty Expectation Suite. Edit in jupyter notebooks, or skip with the --no-jupyter flag """ display_not_implemented_message_and_exit() directory = toolkit.parse_cli_config_file_location( config_file_location=ctx.obj.config_file_location).get("directory") _suite_new( suite=suite, directory=directory, empty=True, jupyter=jupyter, view=False, batch_kwargs=batch_kwargs, usage_event="cli.suite.new", )
def datasource_list(ctx): """List known datasources.""" display_not_implemented_message_and_exit() context = ctx.obj.data_context datasources = context.list_datasources() datasource_count = len(datasources) if datasource_count == 0: list_intro_string = "No Datasources found" else: list_intro_string = _build_datasource_intro_string(datasource_count) cli_message(list_intro_string) for datasource in datasources: cli_message("") cli_message_dict(datasource) toolkit.send_usage_message( data_context=context, event="cli.datasource.list", success=True )
def init(ctx, view, usage_stats): """ Initialize a new Great Expectations project. This guided input walks the user through setting up a new project and also onboards a new developer in an existing project. It scaffolds directories, sets up notebooks, creates a project file, and appends to a `.gitignore` file. """ display_not_implemented_message_and_exit() directory = toolkit.parse_cli_config_file_location( config_file_location=ctx.obj.config_file_location).get("directory") if directory is None: directory = os.getcwd() target_directory = os.path.abspath(directory) ge_dir = _get_full_path_to_ge_dir(target_directory) cli_message(GREETING) if DataContext.does_config_exist_on_disk(ge_dir): try: if DataContext.is_project_initialized(ge_dir): # Ensure the context can be instantiated cli_message(PROJECT_IS_COMPLETE) except (DataContextError, DatasourceInitializationError) as e: cli_message("<red>{}</red>".format(e.message)) sys.exit(1) try: context = DataContext.create(target_directory, usage_statistics_enabled=usage_stats) cli_message(ONBOARDING_COMPLETE) # TODO if this is correct, ensure this is covered by a test # cli_message(SETUP_SUCCESS) # exit(0) except DataContextError as e: cli_message("<red>{}</red>".format(e.message)) # TODO ensure this is covered by a test exit(5) else: if not ctx.obj.assume_yes: if not click.confirm(LETS_BEGIN_PROMPT, default=True): cli_message(RUN_INIT_AGAIN) # TODO ensure this is covered by a test exit(0) try: context = DataContext.create(target_directory, usage_statistics_enabled=usage_stats) toolkit.send_usage_message(data_context=context, event="cli.init.create", success=True) except DataContextError as e: # TODO ensure this is covered by a test cli_message("<red>{}</red>".format(e)) # Skip the rest of setup if --assume-yes flag is passed if ctx.obj.assume_yes: cli_message(SECTION_SEPARATOR) cli_message(SETUP_SUCCESS) sys.exit(0) try: # if expectations exist, offer to build docs context = DataContext(ge_dir) if context.list_expectation_suites(): if click.confirm(BUILD_DOCS_PROMPT, default=True): build_docs(context, view=view) else: datasources = context.list_datasources() if len(datasources) == 0: cli_message(SECTION_SEPARATOR) if not click.confirm( "Would you like to configure a Datasource?", default=True): cli_message("Okay, bye!") sys.exit(1) datasource_name, data_source_type = add_datasource_impl( context, choose_one_data_asset=False) if not datasource_name: # no datasource was created sys.exit(1) datasources = context.list_datasources() if len(datasources) == 1: datasource_name = datasources[0]["name"] cli_message(SECTION_SEPARATOR) if not click.confirm( "Would you like to profile new Expectations for a single data asset within your new Datasource?", default=True, ): cli_message( "Okay, exiting now. To learn more about Profilers, run great_expectations profile --help or visit docs.greatexpectations.io!" ) sys.exit(1) ( success, suite_name, profiling_results, ) = toolkit.create_expectation_suite( context, datasource_name=datasource_name, additional_batch_kwargs={"limit": 1000}, flag_build_docs=False, open_docs=False, ) cli_message(SECTION_SEPARATOR) if not click.confirm("Would you like to build Data Docs?", default=True): cli_message( "Okay, exiting now. To learn more about Data Docs, run great_expectations docs --help or visit docs.greatexpectations.io!" ) sys.exit(1) build_docs(context, view=False) if not click.confirm( "\nWould you like to view your new Expectations in Data Docs? This will open a new browser window.", default=True, ): cli_message( "Okay, exiting now. You can view the site that has been created in a browser, or visit docs.greatexpectations.io for more information!" ) sys.exit(1) toolkit.attempt_to_open_validation_results_in_data_docs( context, profiling_results) cli_message(SECTION_SEPARATOR) cli_message(SETUP_SUCCESS) sys.exit(0) except ( DataContextError, ge_exceptions.ProfilerError, OSError, SQLAlchemyError, ) as e: cli_message("<red>{}</red>".format(e)) sys.exit(1)
def suite_scaffold(ctx, suite, jupyter): """Scaffold a new Expectation Suite.""" display_not_implemented_message_and_exit() directory = toolkit.parse_cli_config_file_location( config_file_location=ctx.obj.config_file_location).get("directory") _suite_scaffold(suite, directory, jupyter)