def _raise_encoding_error(e, encoding): if encoding and encoding.lower() == 'iso-8859-1': suggestion = 'utf-8' else: suggestion = 'iso-8859-1' raise CommandError('encoding error: {}\nTry `--encoding {}`?'.format( e, suggestion))
def main(): parser = argparse.ArgumentParser( description='Open Contracting Data Standard CLI') parser.add_argument('--encoding', help='the file encoding') parser.add_argument('--pretty', help='pretty print output', action='store_true') subparsers = parser.add_subparsers(dest='subcommand') subcommands = {} for module in COMMAND_MODULES: try: command = importlib.import_module(module).Command(subparsers) subcommands[command.name] = command except ImportError as e: logger.error('exception "%s" prevented loading of %s module', e, module) args = parser.parse_args() if args.subcommand: command = subcommands[args.subcommand] try: command.args = args try: command.handle() except json.decoder.JSONDecodeError as e: raise CommandError( 'JSON error: {}\nIs the JSON data not line-delimited? ' 'Try piping it through `jq -crM .`'.format(e)) except UnicodeDecodeError as e: if args.encoding and args.encoding.lower() == 'iso-8859-1': suggestion = 'utf-8' else: suggestion = 'iso-8859-1' raise CommandError( 'encoding error: {}\nTry `--encoding {}`?'.format( e, suggestion)) except CommandError as e: logger.critical(e) sys.exit(1) else: parser.print_help()
def handle(self): with open(self.args.file) as f: schema = jsonref.load(f, object_pairs_hook=OrderedDict, base_uri=pathlib.Path( os.path.realpath( self.args.file)).as_uri()) try: MappingSheet().run(schema, sys.stdout, self.args.order_by, self.args.infer_required) except MissingColumnError as e: raise CommandError(str(e))
def main(): parser = argparse.ArgumentParser( description='Open Contracting Data Standard CLI') parser.add_argument('--encoding', help='the file encoding') parser.add_argument( '--ascii', help='print escape sequences instead of UTF-8 characters', action='store_true') parser.add_argument('--pretty', help='pretty print output', action='store_true') subparsers = parser.add_subparsers(dest='subcommand') subcommands = {} for module in COMMAND_MODULES: try: command = importlib.import_module(module).Command(subparsers) except ImportError as e: logger.error('exception "%s" prevented loading of %s module', e, module) else: subcommands[command.name] = command args = parser.parse_args() if args.subcommand: command = subcommands[args.subcommand] try: command.args = args try: with warnings.catch_warnings(): warnings.showwarning = _showwarning command.handle() except ijson.common.IncompleteJSONError as e: if e.args and isinstance(e.args[0], (bytes, UnicodeDecodeError)): message = e.args[0] if isinstance(e.args[0], bytes): # YAJL backends message = e.args[0].decode(errors='backslashreplace') _raise_encoding_error(message, args.encoding) raise CommandError('JSON error: {}'.format(e)) from e except UnicodeDecodeError as e: _raise_encoding_error(e, args.encoding) except CommandError as e: logger.critical(e) sys.exit(1) else: parser.print_help()
def handle(self): components = urlparse(self.args.schema) if components.scheme == 'file': with open(self.args.schema[7:]) as f: schema = json_load(f) else: schema = requests.get(self.args.schema).json() format_checker = FormatChecker() if self.args.check_urls: def check_url(instance): # See https://github.com/Julian/jsonschema/blob/master/jsonschema/_format.py if not isinstance(instance, str_types): return True rfc3987.parse(instance, rule='URI') # raises ValueError try: response = requests.get(instance, timeout=self.args.timeout) result = response.status_code in (200, ) if not result: print('HTTP {} on GET {}'.format( response.status_code, instance)) return result except requests.exceptions.Timeout: print('Timedout on GET {}'.format(instance)) return False format_checker.checks('uri', raises=(ValueError))(check_url) for i, line in enumerate(self.buffer()): try: data = json_loads(line) errors = False for error in validator( schema, format_checker=format_checker).iter_errors(data): print('item {}: {} ({})'.format( i, error.message, '/'.join(error.absolute_schema_path))) errors = True if not errors and self.args.verbose: print('item {}: no errors'.format(i)) except json.decoder.JSONDecodeError as e: raise CommandError('item {}: JSON error: {}'.format(i, e))
def handle(self): kwargs = self.parse_package_arguments() kwargs['schema'] = self.args.schema kwargs['return_package'] = self.args.package kwargs['use_linked_releases'] = self.args.linked_releases kwargs['return_versioned_release'] = self.args.versioned try: for output in compile_release_packages(self.buffer(), **kwargs): self.print(output) except InconsistentVersionError as e: versions = [e.earlier_version, e.current_version] if versions[1] < versions[0]: versions.reverse() raise CommandError( '{}\nTry first upgrading packages to the same version:\n cat file [file ...] | ocdskit' ' upgrade {}:{} | ocdskit compile {}'.format( str(e), *versions, ' '.join(sys.argv[2:])))
def handle(self): versions = self.args.versions version_from, version_to = versions.split(':') if version_from < version_to: direction = 'up' else: direction = 'down' try: upgrade_method = getattr( upgrade, 'upgrade_{}'.format( versions.replace('.', '').replace(':', '_'))) except AttributeError: raise CommandError('{}grade from {} is not supported'.format( direction, versions.replace(':', ' to '))) for line in self.buffer(): data = json_loads(line) upgrade_method(data) self.print(data)
def handle(self): versions = self.args.versions version_from, version_to = versions.split(':') if version_from < version_to: direction = 'up' else: direction = 'down' try: upgrade_method = getattr( upgrade, 'upgrade_{}'.format( versions.replace('.', '').replace(':', '_'))) except AttributeError as e: message = '{}grade from {} is not supported'.format( direction, versions.replace(':', ' to ')) raise CommandError(message) from e for data in self.items(map_type=OrderedDict): data = upgrade_method(data) self.print(data)
def handle(self): with open(self.args.file) as f: schema = json.load(f) if self.args.extension: builder = ProfileBuilder(None, self.args.extension) schema = builder.patched_release_schema( schema=schema, extension_field=self.args.extension_field) base_uri = pathlib.Path(os.path.realpath(self.args.file)).as_uri() if not self.args.no_replace_refs: schema = jsonref.JsonRef.replace_refs(schema, base_uri=base_uri) try: mapping_sheet(schema, sys.stdout, order_by=self.args.order_by, infer_required=self.args.infer_required, extension_field=self.args.extension_field, include_deprecated=not self.args.no_deprecated, include_definitions=self.args.no_replace_refs) except MissingColumnError as e: raise CommandError(str(e)) from e