Ejemplo n.º 1
0
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))
Ejemplo n.º 2
0
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()
Ejemplo n.º 3
0
    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))
Ejemplo n.º 4
0
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()
Ejemplo n.º 5
0
    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))
Ejemplo n.º 6
0
    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:])))
Ejemplo n.º 7
0
    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)
Ejemplo n.º 8
0
    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)
Ejemplo n.º 9
0
    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