From aec2dba5f8e1e90c807e04b849628d4060a570f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Brunet?= Date: Tue, 7 May 2024 16:00:19 +0200 Subject: [PATCH 1/5] add hardcoded _get_resource_file_name to fix proto generation --- .../management/commands/generateproto.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/django_socio_grpc/management/commands/generateproto.py b/django_socio_grpc/management/commands/generateproto.py index 4950acd1..06b580c5 100644 --- a/django_socio_grpc/management/commands/generateproto.py +++ b/django_socio_grpc/management/commands/generateproto.py @@ -11,6 +11,18 @@ from django_socio_grpc.protobuf import RegistrySingleton from django_socio_grpc.protobuf.generators import RegistryToProtoGenerator from django_socio_grpc.settings import grpc_settings +from importlib import resources + +def _get_resource_file_name( + package_or_requirement: str, resource_name: str +) -> str: + """ + Obtain the filename for a resource on the file system. + To remove when grpcio-tools is updated. + """ + return ( + resources.files(package_or_requirement) / resource_name + ).resolve() class Command(BaseCommand): @@ -128,7 +140,7 @@ def handle(self, *args, **options): raise ProtobufGenerationException(detail="No BASE_DIR in settings") extra_args = options["extra_args"] if options["extra_args"] else "" # INFO - AM - 16/04/2024 - subprocess.run is safe because we are not using shell=True. Please do not change this. Unit test check this - proto_include = protoc._get_resource_file_name( + proto_include = _get_resource_file_name( "grpc_tools", "_proto" ) # See https://github.com/grpc/grpc/blob/master/tools/distrib/python/grpcio_tools/grpc_tools/protoc.py#L209 protoc.main( From 5876757366ac9ad266243cc27c02f47ce380f051 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Brunet?= Date: Tue, 7 May 2024 16:04:37 +0200 Subject: [PATCH 2/5] fix lint --- .../management/commands/generateproto.py | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/django_socio_grpc/management/commands/generateproto.py b/django_socio_grpc/management/commands/generateproto.py index 06b580c5..0d95c385 100644 --- a/django_socio_grpc/management/commands/generateproto.py +++ b/django_socio_grpc/management/commands/generateproto.py @@ -1,5 +1,6 @@ import asyncio import os +from importlib import resources from pathlib import Path from asgiref.sync import async_to_sync @@ -11,18 +12,14 @@ from django_socio_grpc.protobuf import RegistrySingleton from django_socio_grpc.protobuf.generators import RegistryToProtoGenerator from django_socio_grpc.settings import grpc_settings -from importlib import resources -def _get_resource_file_name( - package_or_requirement: str, resource_name: str -) -> str: + +def _get_resource_file_name(package_or_requirement: str, resource_name: str) -> str: """ Obtain the filename for a resource on the file system. - To remove when grpcio-tools is updated. + To remove when grpcio-tools is updated. """ - return ( - resources.files(package_or_requirement) / resource_name - ).resolve() + return (resources.files(package_or_requirement) / resource_name).resolve() class Command(BaseCommand): From b07b8a60aae80273ea50c312033bb65c19a4717f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Brunet?= Date: Tue, 7 May 2024 16:12:39 +0200 Subject: [PATCH 3/5] fix conditionnal import --- .../management/commands/generateproto.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/django_socio_grpc/management/commands/generateproto.py b/django_socio_grpc/management/commands/generateproto.py index 0d95c385..c4f25a2d 100644 --- a/django_socio_grpc/management/commands/generateproto.py +++ b/django_socio_grpc/management/commands/generateproto.py @@ -1,6 +1,6 @@ import asyncio import os -from importlib import resources +import sys from pathlib import Path from asgiref.sync import async_to_sync @@ -13,13 +13,21 @@ from django_socio_grpc.protobuf.generators import RegistryToProtoGenerator from django_socio_grpc.settings import grpc_settings +if sys.version_info >= (3, 9, 0): + from importlib import resources +else: + import pkg_resources + def _get_resource_file_name(package_or_requirement: str, resource_name: str) -> str: """ Obtain the filename for a resource on the file system. To remove when grpcio-tools is updated. """ - return (resources.files(package_or_requirement) / resource_name).resolve() + if sys.version_info >= (3, 9, 0): + return (resources.files(package_or_requirement) / resource_name).resolve() + else: + return pkg_resources.resource_filename(package_or_requirement, resource_name) class Command(BaseCommand): From 6da805d8724c5b4a7a3f2ff79be83f20c1416a6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Brunet?= Date: Tue, 7 May 2024 17:24:39 +0200 Subject: [PATCH 4/5] fix tests --- django_socio_grpc/tests/test_proto_generation.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/django_socio_grpc/tests/test_proto_generation.py b/django_socio_grpc/tests/test_proto_generation.py index 48c6ac9f..9b4195c1 100644 --- a/django_socio_grpc/tests/test_proto_generation.py +++ b/django_socio_grpc/tests/test_proto_generation.py @@ -15,7 +15,7 @@ from django_socio_grpc.services import AppHandlerRegistry from django_socio_grpc.tests.fakeapp.utils import make_reloaded_grpc_handler from django_socio_grpc.tests.utils import patch_open - +from django_socio_grpc.management.commands.generateproto import _get_resource_file_name def relatedfieldmodel_handler_hook(server): from fakeapp.services.related_field_model_service import RelatedFieldModelService @@ -459,7 +459,7 @@ def test_generate_proto_subprocess_correctly_call(self, mock_protoc_main): with patch_open(): call_command("generateproto", *args, **opts) - proto_include = protoc._get_resource_file_name("grpc_tools", "_proto") + proto_include = _get_resource_file_name("grpc_tools", "_proto") mock_protoc_main.assert_called_once_with( [ @@ -484,7 +484,7 @@ def test_generate_proto_with_extra_args(self, mock_protoc_main): with patch_open(): call_command("generateproto", *args, **opts) - proto_include = protoc._get_resource_file_name("grpc_tools", "_proto") + proto_include = _get_resource_file_name("grpc_tools", "_proto") mock_protoc_main.assert_called_once_with( [ "", From 717263396203fcae2a5e596a9eab73c7b8383fad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Brunet?= Date: Tue, 7 May 2024 17:25:36 +0200 Subject: [PATCH 5/5] fix lint and remove comment --- django_socio_grpc/management/commands/generateproto.py | 1 - django_socio_grpc/tests/test_proto_generation.py | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/django_socio_grpc/management/commands/generateproto.py b/django_socio_grpc/management/commands/generateproto.py index c4f25a2d..30a0df74 100644 --- a/django_socio_grpc/management/commands/generateproto.py +++ b/django_socio_grpc/management/commands/generateproto.py @@ -22,7 +22,6 @@ def _get_resource_file_name(package_or_requirement: str, resource_name: str) -> str: """ Obtain the filename for a resource on the file system. - To remove when grpcio-tools is updated. """ if sys.version_info >= (3, 9, 0): return (resources.files(package_or_requirement) / resource_name).resolve() diff --git a/django_socio_grpc/tests/test_proto_generation.py b/django_socio_grpc/tests/test_proto_generation.py index 9b4195c1..d1264707 100644 --- a/django_socio_grpc/tests/test_proto_generation.py +++ b/django_socio_grpc/tests/test_proto_generation.py @@ -7,15 +7,15 @@ from django.core.management import call_command from django.test import TestCase, override_settings -from grpc_tools import protoc from django_socio_grpc.exceptions import ProtobufGenerationException +from django_socio_grpc.management.commands.generateproto import _get_resource_file_name from django_socio_grpc.protobuf import RegistrySingleton from django_socio_grpc.protobuf.protoparser import protoparser from django_socio_grpc.services import AppHandlerRegistry from django_socio_grpc.tests.fakeapp.utils import make_reloaded_grpc_handler from django_socio_grpc.tests.utils import patch_open -from django_socio_grpc.management.commands.generateproto import _get_resource_file_name + def relatedfieldmodel_handler_hook(server): from fakeapp.services.related_field_model_service import RelatedFieldModelService