diff --git a/django_grpc/__init__.py b/django_grpc/__init__.py index 7525d19..66a87bb 100644 --- a/django_grpc/__init__.py +++ b/django_grpc/__init__.py @@ -1 +1 @@ -__version__ = '0.1.4' +__version__ = '0.1.5' diff --git a/django_grpc/management/commands/grpcserver.py b/django_grpc/management/commands/grpcserver.py index 42a5fdb..c7874a7 100644 --- a/django_grpc/management/commands/grpcserver.py +++ b/django_grpc/management/commands/grpcserver.py @@ -36,8 +36,9 @@ def _serve(self, max_workers, port, *args, **kwargs): self.stdout.write("Server is listening port %s" % port) if kwargs['list_handlers'] is True: + self.stdout.write("Registered handlers:") for handler in extract_handlers(server): - self.stdout.write(self.style.INFO(handler)) + self.stdout.write("* %s" % handler) # since server.start() will not block, # a sleep-loop is added to keep alive diff --git a/django_grpc/serializers/base.py b/django_grpc/serializers/base.py index acdf30d..d4f4fcf 100644 --- a/django_grpc/serializers/base.py +++ b/django_grpc/serializers/base.py @@ -48,6 +48,7 @@ def find_for_model(cls, instance, serializers: Iterable): @classmethod def serialize_model(cls, message_class, instance: 'Model', serializers): serializer = cls.find_for_model(instance, serializers) + serializer.serializers = serializers return message_class(**serializer._to_dict(message_class.DESCRIPTOR.fields_by_name.items(), instance)) @classmethod @@ -77,16 +78,22 @@ def _message_value(val): """ Check if nested values need to be deserialized """ + class_name = val.__class__.__name__ + # List of structures # Convert repeated # if isinstance(val, RepeatedCompositeContainer): - if val.__class__.__name__ == 'RepeatedCompositeContainer': + if class_name == 'RepeatedCompositeContainer': return [ message_to_python(it) for it in val ] + # List of simple types + if class_name == 'RepeatedScalarContainer': + return list(val) - # Convert complex types + # Convert single complex type (structure) if isinstance(val, Message): return message_to_python(val) + # Simple type (str, int, bool) return val diff --git a/django_grpc/utils.py b/django_grpc/utils.py index eb6b4f3..31d345f 100644 --- a/django_grpc/utils.py +++ b/django_grpc/utils.py @@ -1,9 +1,14 @@ +from abc import ABCMeta +import logging from concurrent import futures import grpc from django.utils.module_loading import import_string +logger = logging.getLogger(__name__) + + def create_server(max_workers, port): # create a gRPC server server = grpc.server(futures.ThreadPoolExecutor(max_workers=max_workers)) @@ -19,10 +24,24 @@ def add_servicers(server): """ from django.conf import settings for path in settings.GRPC_SERVICERS: + logger.debug("Adding servicers from %s", path) callback = import_string(path) callback(server) def extract_handlers(server): for it in server._state.generic_handlers[0]._method_handlers.values(): - yield it.unary_unary.__qualname__ + unary = it.unary_unary + if unary is None: + logger.warning("%s is invalid", it) + continue + + code = it.unary_unary.__code__ + abstract = '' + if isinstance(it.__class__, ABCMeta): + abstract = 'NOT IMPLEMENTED' + yield "{name}({params}) {abstract}".format( + name=code.co_name, + params=", ".join(code.co_varnames), + abstract=abstract + ) diff --git a/setup.cfg b/setup.cfg index 561713c..a1616c1 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.1.4 +current_version = 0.1.5 commit = True tag = True