def validate_parameters(ocrd_tool, executable, param_json): ''' Validate PARAM_JSON against parameter definition of EXECUTABLE in OCRD_TOOL ''' with codecs.open(ocrd_tool, encoding='utf-8') as f: ocrd_tool = loads(f.read()) _inform_of_result( ParameterValidator(ocrd_tool['tools'][executable]).validate( parse_json_string_or_file(param_json)))
def test_parameter_file_comments(self): with TemporaryDirectory() as tempdir: jsonpath = Path(tempdir, 'test.json') jsonpath.write_text("""\ { # Metasyntactical variables are rarely imaginative "foo": 42, # case in point: "bar": 23 }""") self.assertEqual(parse_json_string_or_file(str(jsonpath)), {'foo': 42, 'bar': 23})
def test_parse_json_string_or_file(self): self.assertEqual(parse_json_string_or_file(), {}) self.assertEqual(parse_json_string_or_file(''), {}) self.assertEqual(parse_json_string_or_file(' '), {}) self.assertEqual(parse_json_string_or_file('{}'), {}) self.assertEqual(parse_json_string_or_file('{"foo": 32}'), {'foo': 32}) self.assertEqual(parse_json_string_or_file( '{"dpi": -1, "textequiv_level": "word", "overwrite_words": false, "raw_lines": false, "char_whitelist": "", "char_blacklist": "", "char_unblacklist": ""}' ), {"dpi": -1, "textequiv_level": "word", "overwrite_words": False, "raw_lines": False, "char_whitelist": "", "char_blacklist": "", "char_unblacklist": ""})
def validate(self): if not which(self.executable): raise Exception("Executable not found in PATH: %s" % self.executable) if not self.input_file_grps: raise Exception("Task must have input file group") parameters = {} if self.parameter_path: parameters = parse_json_string_or_file(self.parameter_path) param_validator = ParameterValidator(self.ocrd_tool_json) report = param_validator.validate(parameters) if not report.is_valid: raise Exception(report.errors) if 'output_file_grp' in self.ocrd_tool_json and not self.output_file_grps: raise Exception( "Processor requires output_file_grp but none was provided.") return report
def validate(self): if not which(self.executable): raise Exception("Executable not found in PATH: %s" % self.executable) if not self.input_file_grps: raise Exception("Task must have input file group") result = run([self.executable, '--dump-json'], stdout=PIPE, check=True, universal_newlines=True) ocrd_tool_json = json.loads(result.stdout) parameters = {} if self.parameter_path: parameters = parse_json_string_or_file(self.parameter_path) param_validator = ParameterValidator(ocrd_tool_json) report = param_validator.validate(parameters) if not report.is_valid: raise Exception(report.errors) if 'output_file_grp' in ocrd_tool_json and not self.output_file_grps: raise Exception( "Processor requires output_file_grp but none was provided.") return True
def test_parameters_invalid(self): with self.assertRaisesRegex(ValueError, 'Not a valid JSON object'): parse_json_string_or_file('[]') with self.assertRaisesRegex(ValueError, 'Error parsing'): parse_json_string_or_file('[}')
def test_parse_json_string_or_file(self): self.assertEqual(parse_json_string_or_file(), {}) self.assertEqual(parse_json_string_or_file('{}'), {}) self.assertEqual(parse_json_string_or_file('{"foo": 32}'), {'foo': 32})
def _handle_param_option(ctx, param, value): return parse_json_string_or_file(*list(value))
loglevel_option = click.option( '-l', '--log-level', help="Log level", type=click.Choice(['OFF', 'ERROR', 'WARN', 'INFO', 'DEBUG', 'TRACE']), default=None, callback=_set_root_logger_version) parameter_option = click.option( '-p', '--parameter', help="Parameters, either JSON string or path to JSON file", default='{}', callback=lambda ctx, param, value: parse_json_string_or_file(value)) def ocrd_cli_wrap_processor(processorClass, ocrd_tool=None, mets=None, working_dir=None, dump_json=False, version=False, **kwargs): LOG = getLogger('ocrd_cli_wrap_processor') if dump_json: processorClass(workspace=None, dump_json=True) elif version: try: p = processorClass(workspace=None)