Beispiel #1
0
    def _get_route_args(self, namespace, route, tag=False):
        """Returns a list of name / value string pairs representing the arguments for
        a particular route."""
        data_type, _ = unwrap_nullable(route.arg_data_type)
        if is_struct_type(data_type):
            arg_list = []
            for field in data_type.all_fields:
                arg_list.append((fmt_var(field.name),
                                 fmt_type(field.data_type,
                                          tag=tag,
                                          has_default=field.has_default)))

            doc_list = [(fmt_var(f.name), self.process_doc(f.doc, self._docf))
                        for f in data_type.fields if f.doc]
        elif is_union_type(data_type):
            arg_list = [(fmt_var(data_type.name),
                         fmt_type(route.arg_data_type, tag=tag))]

            doc_list = [
                (fmt_var(data_type.name),
                 self.process_doc(data_type.doc, self._docf) if data_type.doc
                 else 'The {} union'.format(fmt_class(data_type.name)))
            ]
        else:
            arg_list = []
            doc_list = []

        return arg_list, doc_list
Beispiel #2
0
    def _get_route_args(self, namespace, route, tag=False):  # pylint: disable=unused-argument
        """Returns a list of name / value string pairs representing the arguments for
        a particular route."""
        data_type, _ = unwrap_nullable(route.arg_data_type)
        if is_struct_type(data_type):
            arg_list = []
            for field in data_type.all_fields:
                arg_list.append((fmt_var(field.name), fmt_type(
                    field.data_type, tag=tag, has_default=field.has_default)))

            doc_list = [(fmt_var(f.name), self.process_doc(f.doc, self._docf))
                        for f in data_type.fields if f.doc]
        elif is_union_type(data_type):
            arg_list = [(fmt_var(data_type.name), fmt_type(
                route.arg_data_type, tag=tag))]

            doc_list = [(fmt_var(data_type.name),
                self.process_doc(data_type.doc,
                    self._docf) if data_type.doc
                else 'The {} union'.format(
                    fmt_class(data_type
                        .name)))]
        else:
            arg_list = []
            doc_list = []

        return arg_list, doc_list
Beispiel #3
0
    def block_h(self,
                class_name,
                protocol=None,
                extensions=None,
                protected=None):
        if not extensions:
            extensions = ['NSObject']

        if not protocol:
            extend_suffix = ' : {}'.format(', '.join(extensions))
        else:
            extend_suffix = ' : {} <{}>'.format(', '.join(extensions),
                                                fmt_class(protocol))

        base_interface_str = '@interface {}{} {{' if protected else '@interface {}{}'
        with self.block(base_interface_str.format(class_name, extend_suffix),
                        delim=('', '@end'),
                        dent=0):
            if protected:
                with self.block('', delim=('', '')):
                    self.emit('@protected')
                    for field_name, field_type in protected:
                        self.emit('{} _{};'.format(field_type, field_name))
                self.emit('}')
            self.emit()
            yield
Beispiel #4
0
    def block_h(self, class_name, protocol=None, extensions=None):
        if not extensions:
            extensions = ['NSObject']

        if not protocol:
            extend_suffix = ' : {}'.format(', '.join(extensions))
        else:
            extend_suffix = ' : {} <{}>'.format(
                ', '.join(extensions), fmt_class(protocol))

        with self.block('@interface {}{}'.format(
                class_name, extend_suffix), delim=('', '@end'), dent=0):
            self.emit()
            yield
Beispiel #5
0
    def _generate_routes_h(self, namespace):
        """Generates header file for namespace object that has as methods
        all routes within the namespace."""
        self.emit(comment_prefix)
        self.emit_wrapped_text('Routes for the `{}` namespace'.format(
            fmt_class(namespace.name)),
                               prefix=comment_prefix)
        self.emit(comment_prefix)

        with self.block_h(fmt_routes_class(namespace.name)):
            description_str = (
                'An instance of the networking client that each '
                'route will use to submit a request.')
            self.emit_wrapped_text(description_str, prefix=comment_prefix)
            self.emit(
                fmt_property_str(prop='client',
                                 typ='{} * _Nonnull'.format(
                                     self.args.transport_client_name)))
            self.emit()

            routes_obj_args = fmt_func_args_declaration([
                ('client',
                 '{} * _Nonnull'.format(self.args.transport_client_name))
            ])

            init_signature = fmt_signature(func='init',
                                           args=routes_obj_args,
                                           return_type='nonnull instancetype')
            description_str = (
                'Initializes the `{}` namespace container object '
                'with a networking client.')
            self.emit_wrapped_text(description_str.format(
                fmt_routes_class(namespace.name)),
                                   prefix=comment_prefix)
            self.emit('{};'.format(init_signature))
            self.emit()

            style_to_request = json.loads(self.args.z__style_to_request)

            for route in namespace.routes:
                route_type = route.attrs.get('style')
                client_args = json.loads(self.args.client_args)

                if route_type in client_args.keys():
                    for args_data in client_args[route_type]:
                        task_type_key, type_data_dict = tuple(args_data)
                        task_type_name = style_to_request[task_type_key]

                        func_suffix = type_data_dict[0]
                        extra_args = [
                            tuple(type_data[:-1])
                            for type_data in type_data_dict[1]
                        ]
                        extra_docs = [(type_data[0], type_data[-1])
                                      for type_data in type_data_dict[1]]

                        if is_struct_type(route.arg_data_type
                                          ) and self._struct_has_defaults(
                                              route.arg_data_type):
                            route_args, doc_list = self._get_default_route_args(
                                namespace, route, tag=True)
                            self._generate_route_signature(
                                route, namespace, route_args, extra_args,
                                doc_list + extra_docs, task_type_name,
                                func_suffix)

                        route_args, doc_list = self._get_route_args(namespace,
                                                                    route,
                                                                    tag=True)
                        self._generate_route_signature(route, namespace,
                                                       route_args, extra_args,
                                                       doc_list + extra_docs,
                                                       task_type_name,
                                                       func_suffix)
                else:
                    task_type_name = style_to_request[route_type]
                    if is_struct_type(
                            route.arg_data_type) and self._struct_has_defaults(
                                route.arg_data_type):
                        route_args, doc_list = self._get_default_route_args(
                            namespace, route, tag=True)
                        self._generate_route_signature(route, namespace,
                                                       route_args, [],
                                                       doc_list,
                                                       task_type_name, '')

                    route_args, doc_list = self._get_route_args(namespace,
                                                                route,
                                                                tag=True)
                    self._generate_route_signature(route, namespace,
                                                   route_args, [], doc_list,
                                                   task_type_name, '')
Beispiel #6
0
    def _generate_routes_h(self, namespace):
        """Generates header file for namespace object that has as methods
        all routes within the namespace."""
        self.emit(comment_prefix)
        self.emit_wrapped_text(
            'Routes for the `{}` namespace'.format(fmt_class(namespace.name)),
            prefix=comment_prefix)
        self.emit(comment_prefix)

        self.emit()
        self.emit('NS_ASSUME_NONNULL_BEGIN')
        self.emit()

        with self.block_h(
                fmt_routes_class(namespace.name, self.args.auth_type)):
            description_str = (
                'An instance of the networking client that each '
                'route will use to submit a request.')
            self.emit_wrapped_text(description_str, prefix=comment_prefix)
            self.emit(
                fmt_property_str(
                    prop='client',
                    typ='id<{}>'.format(
                        self.args.transport_client_name)))
            self.emit()

            routes_obj_args = fmt_func_args_declaration(
                [('client',
                  'id<{}>'.format(self.args.transport_client_name))])

            init_signature = fmt_signature(
                func='init',
                args=routes_obj_args,
                return_type='instancetype')
            description_str = (
                'Initializes the `{}` namespace container object '
                'with a networking client.')
            self.emit_wrapped_text(
                description_str.format(
                    fmt_routes_class(namespace.name, self.args.auth_type)),
                prefix=comment_prefix)
            self.emit('{};'.format(init_signature))
            self.emit()

            style_to_request = json.loads(self.args.z__style_to_request)

            for route in namespace.routes:
                if (route.attrs.get('auth') != self.args.auth_type
                        and route.attrs.get('auth') != 'noauth'):
                    continue

                route_type = route.attrs.get('style')
                client_args = json.loads(self.args.client_args)

                if route_type in client_args.keys():
                    for args_data in client_args[route_type]:
                        task_type_key, type_data_dict = tuple(args_data)
                        task_type_name = style_to_request[task_type_key]

                        func_suffix = type_data_dict[0]
                        extra_args = [
                            tuple(type_data[:-1])
                            for type_data in type_data_dict[1]
                        ]
                        extra_docs = [(type_data[0], type_data[-1])
                                      for type_data in type_data_dict[1]]

                        if (is_struct_type(route.arg_data_type) and
                                self._struct_has_defaults(route.arg_data_type)):
                            route_args, doc_list = self._get_default_route_args(
                                namespace, route, tag=True)
                            self._generate_route_signature(
                                route, namespace, route_args, extra_args,
                                doc_list + extra_docs, task_type_name,
                                func_suffix)

                        route_args, doc_list = self._get_route_args(
                            namespace, route, tag=True)
                        self._generate_route_signature(
                            route, namespace, route_args, extra_args,
                            doc_list + extra_docs, task_type_name, func_suffix)
                else:
                    task_type_name = style_to_request[route_type]
                    if (is_struct_type(route.arg_data_type) and
                            self._struct_has_defaults(route.arg_data_type)):
                        route_args, doc_list = self._get_default_route_args(
                            namespace, route, tag=True)
                        self._generate_route_signature(
                            route, namespace, route_args, [], doc_list,
                            task_type_name, '')

                    route_args, doc_list = self._get_route_args(
                        namespace, route, tag=True)
                    self._generate_route_signature(route, namespace,
                                                   route_args, [], doc_list,
                                                   task_type_name, '')
        self.emit()
        self.emit('NS_ASSUME_NONNULL_END')
        self.emit()