From bac322ccdbedb93df649a9dd245c20d18e324116 Mon Sep 17 00:00:00 2001 From: Christian Decker Date: Thu, 30 Jun 2022 11:08:50 +0200 Subject: [PATCH] pytest: Move generated grpc bindings to pyln-testing These may eventually end up in pyln-client, as they allow talking to the GRPC interface exposed by cln-grpc, however for now they are used for testing only. Once we have sufficient API and test coverage we can move them and leave imports in their place. --- Makefile | 14 +- contrib/pyln-testing/pyln/testing/node_pb2.py | Bin 0 -> 117834 bytes .../pyln/testing/node_pb2_grpc.py | 1485 +++++++++++++++++ .../pyln/testing/primitives_pb2.py | 146 ++ tests/test_cln_rs.py | 18 +- 5 files changed, 1648 insertions(+), 15 deletions(-) create mode 100644 contrib/pyln-testing/pyln/testing/node_pb2.py create mode 100644 contrib/pyln-testing/pyln/testing/node_pb2_grpc.py create mode 100644 contrib/pyln-testing/pyln/testing/primitives_pb2.py diff --git a/Makefile b/Makefile index 6c804b954..40dcde7b5 100644 --- a/Makefile +++ b/Makefile @@ -383,15 +383,19 @@ ifneq ($(RUST),0) include cln-rpc/Makefile include cln-grpc/Makefile -GRPC_GEN = tests/node_pb2.py \ - tests/node_pb2_grpc.py \ - tests/primitives_pb2.py +GRPC_GEN = contrib/pyln-testing/pyln/testing/node_pb2.py \ + contrib/pyln-testing/pyln/testing/node_pb2_grpc.py \ + contrib/pyln-testing/pyln/testing/primitives_pb2.py ALL_TEST_GEN += $(GRPC_GEN) $(GRPC_GEN): cln-grpc/proto/node.proto cln-grpc/proto/primitives.proto - python -m grpc_tools.protoc -I cln-grpc/proto cln-grpc/proto/node.proto --python_out=tests/ --grpc_python_out=tests/ --experimental_allow_proto3_optional - python -m grpc_tools.protoc -I cln-grpc/proto cln-grpc/proto/primitives.proto --python_out=tests/ --grpc_python_out=tests/ --experimental_allow_proto3_optional + python -m grpc_tools.protoc -I cln-grpc/proto cln-grpc/proto/node.proto --python_out=contrib/pyln-testing/pyln/testing/ --grpc_python_out=contrib/pyln-testing/pyln/testing/ --experimental_allow_proto3_optional + python -m grpc_tools.protoc -I cln-grpc/proto cln-grpc/proto/primitives.proto --python_out=contrib/pyln-testing/pyln/testing/ --experimental_allow_proto3_optional + # The compiler assumes that the proto files are in the same + # directory structure as the generated files will be. Since we + # don't do that we need to path the files up. + find contrib/pyln-testing/pyln/testing/ -type f -name "*.py" -print0 | xargs -0 sed -i 's/^import \(.*\)_pb2 as .*__pb2/from . import \1_pb2 as \1__pb2/g' endif diff --git a/contrib/pyln-testing/pyln/testing/node_pb2.py b/contrib/pyln-testing/pyln/testing/node_pb2.py new file mode 100644 index 0000000000000000000000000000000000000000..adfdf835414eef21756518a4401a125b4cc96efa GIT binary patch literal 117834 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 Z@%UjryI*~GH@|+oosMxa