def test_validator_repo_readme_file_missing(param_json): report_dict = { 'name': 'Report', 'readme_file': 'readme.md', 'entrypoint': 'reports.report_package.entrypoint', 'audience': ['vendor', 'provider'], 'report_spec': '2', } renderer_csv_dict = { 'root_path': 'root_path', 'id': '123', 'type': 'csv', 'description': 'CSV Renderer', 'default': True, } csv_renderer = RendererDefinition(**renderer_csv_dict) parameter = ParameterDefinition(**param_json()) report = ReportDefinition( root_path='root_path', **report_dict, renderers=[csv_renderer], parameters=[parameter], ) repo_dict = { 'name': 'Reports Repository', 'readme_file': 'readme.md', 'version': '1.0.0', 'language': 'python', 'reports': [report], } repo = RepositoryDefinition(root_path='root_path', **repo_dict) errors = validate(repo) assert len(errors) != 0 assert 'repository property `readme_file` cannot be resolved' in errors[0]
def test_validator_repo_duplicated_reports(mocker, param_json): mocker.patch( 'connect.reports.validator._validate_report', return_value=[], ) report_dict_1 = { 'name': 'Report', 'readme_file': 'readme.md', 'entrypoint': 'reports.report_package.entrypoint', 'audience': ['vendor', 'provider'], 'parameters': [param_json()], 'report_spec': '2', } report_dict_2 = { 'name': 'Report', 'readme_file': 'readme.md', 'entrypoint': 'reports.report_package.entrypoint', 'audience': ['vendor', 'provider'], 'parameters': [param_json()], 'report_spec': '2', } renderer_csv_dict = { 'root_path': 'root_path', 'id': '123', 'type': 'csv', 'description': 'CSV Renderer', 'default': True, } csv_renderer = RendererDefinition(**renderer_csv_dict) report_1 = ReportDefinition( root_path='root_path', **report_dict_1, renderers=[csv_renderer], ) report_2 = ReportDefinition( root_path='root_path', **report_dict_2, renderers=[csv_renderer], ) tmp_filesystem = TempFS() tmp_filesystem.create('readme.md') repo_dict = { 'name': 'Reports Repository', 'readme_file': 'readme.md', 'version': '1.0.0', 'language': 'python', 'reports': [report_1, report_2], } repo = RepositoryDefinition( root_path=tmp_filesystem.root_path, **repo_dict, ) errors = validate(repo) assert len(errors) != 0 assert 'Multiple reports within single module found' in errors[0]
def validate_project(project_dir): click.secho(f'Validating project {project_dir}...\n', fg='blue') data = _file_descriptor_validations(project_dir) errors = validate_with_schema(data) if errors: raise ClickException(f'Invalid `reports.json`: {errors}') report_project = parse(project_dir, data) errors = validate(report_project) if errors: raise ClickException(f'Invalid `reports.json`: {",".join(errors)}') for report in report_project.reports: _entrypoint_validations(project_dir, report.entrypoint, report.report_spec) click.secho(f'Report Project {project_dir} has been successfully validated.', fg='green')
def load_repo(repo_dir): cfg = os.path.join(repo_dir, 'reports.json') if not os.path.isfile(cfg): raise ClickException( f'The directory `{repo_dir}` is not a reports project root directory.', ) try: descriptor = json.load(open(cfg, 'r')) except json.JSONDecodeError: raise ClickException( 'The reports project descriptor `reports.json` is not a valid json file.', ) errors = validate_with_schema(descriptor) if errors: raise ClickException(f'Invalid `reports.json`: {errors}') repo = parse(repo_dir, descriptor) errors = validate(repo) if errors: raise ClickException(f'Invalid `reports.json`: {",".join(errors)}') return repo