def get_input_from_form(request): """Gets the sidecar processing input arguments from a request object. Parameters ---------- request: Request object A Request object containing user data from the sidecar processing form. Returns ------- dict A dictionary containing input arguments for calling the underlying sidecar processing functions. """ arguments = { base_constants.SCHEMA: get_hed_schema_from_pull_down(request), base_constants.JSON_SIDECAR: None, base_constants.COMMAND: request.form.get(base_constants.COMMAND_OPTION, None), base_constants.CHECK_FOR_WARNINGS: form_has_option(request, base_constants.CHECK_FOR_WARNINGS, 'on'), base_constants.EXPAND_DEFS: form_has_option(request, base_constants.EXPAND_DEFS, 'on') } if base_constants.JSON_FILE in request.files: f = request.files[base_constants.JSON_FILE] fb = io.StringIO(f.read(file_constants.BYTE_LIMIT).decode('ascii')) arguments[base_constants.JSON_SIDECAR] = models.Sidecar( file=fb, name=secure_filename(f.filename)) return arguments
def test_process_services_sidecar(self): from hedweb.services import process json_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/bids_events.json') with open(json_path) as f: data = json.load(f) json_text = json.dumps(data) fb = io.StringIO(json_text) schema_url = 'https://raw.githubusercontent.com/hed-standard/hed-specification/master/' \ + 'hedxml/HED8.0.0.xml' hed_schema = hedschema.load_schema(schema_url) json_sidecar = models.Sidecar(file=fb, name='JSON_Sidecar') arguments = {base_constants.SERVICE: 'sidecar_validate', base_constants.SCHEMA: hed_schema, base_constants.COMMAND: 'validate', base_constants.COMMAND_TARGET: 'sidecar', base_constants.JSON_SIDECAR: json_sidecar} with self.app.app_context(): response = process(arguments) self.assertFalse(response['error_type'], 'sidecar_validation services should not have a fatal error when file is invalid') results = response['results'] self.assertEqual('success', results['msg_category'], "sidecar_validation services has success on bids_events.json") self.assertEqual('8.0.0', results[base_constants.SCHEMA_VERSION], 'Version 8.0.0 was used') schema_url = 'https://raw.githubusercontent.com/hed-standard/hed-specification/master/' \ + 'hedxml/HED7.2.0.xml' arguments[base_constants.SCHEMA] = hedschema.load_schema(schema_url) with self.app.app_context(): response = process(arguments) self.assertFalse(response['error_type'], 'sidecar_validation services should not have a error when file is valid') results = response['results'] self.assertTrue(results['data'], 'sidecar_validation produces errors when file not valid') self.assertEqual('warning', results['msg_category'], "sidecar_validation did not valid with 7.2.0") self.assertEqual('7.2.0', results['schema_version'], 'Version 7.2.0 was used')
def test_sidecar_convert_to_short_invalid(self): from hed import models from hedweb.sidecar import sidecar_convert json_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/bids_events_bad.json') json_sidecar = models.Sidecar(file=json_path, name='bids_events_bad') schema_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/HED8.0.0.xml') hed_schema = hedschema.load_schema(schema_path) with self.app.app_context(): results = sidecar_convert(hed_schema, json_sidecar) self.assertTrue(results['data'], 'sidecar_convert results should have data key') self.assertEqual('warning', results['msg_category'], 'sidecar_convert msg_category should be warning for errors')
def test_sidecar_validate_valid(self): from hed import models from hedweb.sidecar import sidecar_validate json_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/bids_events.json') json_sidecar = models.Sidecar(file=json_path, name='bids_events') schema_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/HED8.0.0.xml') hed_schema = hedschema.load_schema(schema_path) with self.app.app_context(): results = sidecar_validate(hed_schema, json_sidecar) self.assertFalse(results['data'], 'sidecar_validate results should not have a data key when no validation errors') self.assertEqual('success', results["msg_category"], 'sidecar_validate msg_category should be success when no errors')
def test_sidecar_convert_to_long_valid(self): from hed import models from hedweb.sidecar import sidecar_convert from hedweb.constants import base_constants json_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/bids_events.json') json_sidecar = models.Sidecar(file=json_path, name='bids_events') schema_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/HED8.0.0.xml') hed_schema = hedschema.load_schema(schema_path) with self.app.app_context(): results = sidecar_convert(hed_schema, json_sidecar, command=base_constants.COMMAND_TO_LONG) self.assertTrue(results['data'], 'sidecar_convert to long results should have data key') self.assertEqual('success', results["msg_category"], 'sidecar_convert to long msg_category should be success when no errors')
def test_events_validate_invalid(self): from hedweb.events import validate events_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/bids_events.tsv') json_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/bids_events_bad.json') schema_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/HED8.0.0.xml') hed_schema = hedschema.load_schema(schema_path) json_sidecar = models.Sidecar(file=json_path, name='bids_events_bad') events = models.EventsInput(file=events_path, sidecars=json_sidecar, name='bids_events') with self.app.app_context(): results = validate(hed_schema, events) self.assertTrue(results['data'], 'validate results should have a data key when validation errors') self.assertEqual('warning', results["msg_category"], 'validate msg_category should be warning when errors')
def test_events_assemble_valid(self): from hedweb.events import assemble events_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/bids_events.tsv') json_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/bids_events.json') schema_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/HED8.0.0.xml') hed_schema = hedschema.load_schema(schema_path) json_sidecar = models.Sidecar(file=json_path, name='bids_json') events = models.EventsInput(file=events_path, sidecars=json_sidecar, name='bids_events') with self.app.app_context(): results = assemble(hed_schema, events, expand_defs=True) self.assertTrue(results['data'], 'assemble results should have a data key when no errors') self.assertEqual('success', results['msg_category'], 'assemble msg_category should be success when no errors')
def test_sidecar_process_valid_to_short_defs_expanded(self): from hedweb.sidecar import process json_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/bids_events.json') json_sidecar = models.Sidecar(file=json_path, name='bids_events') schema_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/HED8.0.0.xml') hed_schema = hedschema.load_schema(schema_path) arguments = {base_constants.SCHEMA: hed_schema, base_constants.JSON_SIDECAR: json_sidecar, base_constants.JSON_DISPLAY_NAME: 'bids_events', base_constants.EXPAND_DEFS: True, base_constants.COMMAND: base_constants.COMMAND_TO_SHORT} with self.app.app_context(): results = process(arguments) self.assertTrue(isinstance(results, dict), 'process to short should return a dict when no errors and defs expanded') self.assertEqual('success', results['msg_category'], 'process to short should return success if no errors and defs_expanded')
def test_events_process_invalid(self): from hedweb.events import process events_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/bids_events.tsv') json_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/bids_events_bad.json') schema_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/HED8.0.0.xml') hed_schema = hedschema.load_schema(schema_path) json_sidecar = models.Sidecar(file=json_path, name='bids_events_bad') events = models.EventsInput(file=events_path, sidecars=json_sidecar, name='bids_events') arguments = {base_constants.EVENTS: events, base_constants.COMMAND: base_constants.COMMAND_VALIDATE, base_constants.EXPAND_DEFS: True, base_constants.CHECK_FOR_WARNINGS: True, base_constants.SCHEMA: hed_schema} with self.app.app_context(): results = process(arguments) self.assertTrue(isinstance(results, dict), 'process validation should return a result dictionary when validation errors') self.assertEqual('warning', results['msg_category'], 'process validate should return warning when errors')
def test_sidecar_process_invalid(self): from hedweb.sidecar import process json_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/bids_events_bad.json') json_sidecar = models.Sidecar(file=json_path, name='bids_events_bad') schema_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'data/HED8.0.0.xml') hed_schema = hedschema.load_schema(schema_path) arguments = {base_constants.SCHEMA: hed_schema, base_constants.JSON_SIDECAR: json_sidecar, base_constants.JSON_DISPLAY_NAME: 'bids_events_bad', base_constants.COMMAND: base_constants.COMMAND_TO_SHORT} with self.app.app_context(): results = process(arguments) self.assertTrue(isinstance(results, dict), 'process to short should return a dictionary when errors') self.assertEqual('warning', results['msg_category'], 'process to short should give warning when JSON with errors') self.assertTrue(results['data'], 'process to short should not convert using HED 8.0.0.xml')
def get_input_from_events_form(request): """Gets the validation function input arguments from a request object associated with the validation form. Parameters ---------- request: Request object A Request object containing user data from the validation form. Returns ------- dictionary A dictionary containing input arguments for calling the underlying validation function. """ arguments = { base_constants.SCHEMA: get_hed_schema_from_pull_down(request), base_constants.EVENTS: None, base_constants.COMMAND: request.form.get(base_constants.COMMAND_OPTION, ''), base_constants.CHECK_FOR_WARNINGS: form_has_option(request, base_constants.CHECK_FOR_WARNINGS, 'on'), base_constants.EXPAND_DEFS: form_has_option(request, base_constants.EXPAND_DEFS, 'on'), base_constants.COLUMNS_SELECTED: create_column_selections(request.form) } json_sidecar = None if base_constants.JSON_FILE in request.files: f = request.files[base_constants.JSON_FILE] json_sidecar = models.Sidecar(file=f, name=secure_filename(f.filename)) arguments[base_constants.JSON_SIDECAR] = json_sidecar if base_constants.EVENTS_FILE in request.files: f = request.files[base_constants.EVENTS_FILE] arguments[base_constants.EVENTS] = \ models.EventsInput(file=f, sidecars=json_sidecar, name=secure_filename(f.filename)) return arguments
def get_input_objects(arguments, params): if base_constants.JSON_STRING in params and params[ base_constants.JSON_STRING]: arguments[base_constants.JSON_SIDECAR] = \ models.Sidecar(file=io.StringIO(params[base_constants.JSON_STRING]), name='JSON_Sidecar') if base_constants.EVENTS_STRING in params and params[ base_constants.EVENTS_STRING]: arguments[base_constants.EVENTS] = \ models.EventsInput(file=io.StringIO(params[base_constants.EVENTS_STRING]), sidecars=arguments[base_constants.JSON_SIDECAR], name='Events') if base_constants.SPREADSHEET_STRING in params and params[ base_constants.SPREADSHEET_STRING]: tag_columns, prefix_dict = spreadsheet.get_prefix_dict(params) arguments[base_constants.SPREADSHEET] = \ models.HedInput(file=io.StringIO(params[base_constants.SPREADSHEET_STRING]), file_type=".tsv", tag_columns=tag_columns, has_column_names=arguments.get(base_constants.HAS_COLUMN_NAMES, None), column_prefix_dictionary=prefix_dict, name='spreadsheet.tsv') if base_constants.STRING_LIST in params and params[ base_constants.STRING_LIST]: s_list = [] for s in params[base_constants.STRING_LIST]: s_list.append(models.HedString(s)) arguments[base_constants.STRING_LIST] = s_list