From 8d9ceaaf22bb590fcb33f7ab5bad253efce6bb42 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 31 Aug 2019 15:27:02 +0800 Subject: [PATCH 01/50] move java code to it's own folder --- .travis.yml => java/.travis.yml | 0 LICENSE => java/LICENSE | 0 Makefile => java/Makefile | 0 README.md => java/README.md | 0 build.gradle => java/build.gradle | 0 .../elasticsearch-service}/build.gradle | 0 .../elasticsearch-service}/deployment/Dockerfile | 0 .../deployment/data_nerd.properties | 0 .../elasticsearch-service}/deployment/deploy.sh | 0 .../deployment/deployment.yaml | 0 .../elasticsearch-service}/deployment/service.yaml | 0 .../main/java/io/datanerd/es/dao/ProductDao.java | 0 .../io/datanerd/es/guice/ConfigurationProvider.java | 0 .../main/java/io/datanerd/es/guice/Constants.java | 0 .../io/datanerd/es/guice/ElasticSearchModule.java | 0 .../datanerd/es/guice/TransportClientProvider.java | 0 .../java/io/datanerd/es/metrics/CounterFactory.java | 0 .../main/java/io/datanerd/es/metrics/Metric.java | 0 .../main/java/io/datanerd/es/server/GrpcServer.java | 0 .../main/java/io/datanerd/es/server/HttpServer.java | 0 .../io/datanerd/es/server/ServiceInterceptor.java | 0 .../java/io/datanerd/es/server/ServiceLauncher.java | 0 .../java/io/datanerd/es/service/EchoService.java | 0 .../io/datanerd/es/service/ProductImageSeeker.java | 0 .../io/datanerd/es/service/ProductReadService.java | 0 .../datanerd/es/service/ProductUpdateService.java | 0 .../io/datanerd/es/service/RxStreamObserver.java | 0 .../elasticsearch-service}/src/main/proto/google | 0 .../src/main/proto/product_common.proto | 0 .../src/main/proto/product_search_engine.proto | 0 .../resources/elasticsearch/product_mappings.json | 0 .../resources/elasticsearch/product_settings.json | 0 .../src/main/resources/logback.xml | 0 .../src/test/java/io/datanerd/es/TestConstant.java | 0 .../java/io/datanerd/es/dao/ProductDaoTest.java | 0 .../es/guice/ConfigurationProviderTest.java | 0 .../datanerd/es/guice/ElasticSearchModuleTest.java | 0 .../es/guice/TransportClientProviderTest.java | 0 .../io/datanerd/es/metrics/CounterFactoryTest.java | 0 .../java/io/datanerd/es/metrics/MetricTest.java | 0 .../io/datanerd/es/service/CallerInterceptor.java | 0 .../io/datanerd/es/service/EchoServiceTest.java | 0 .../datanerd/es/service/ProductReadServiceTest.java | 0 .../es/service/ProductUpdateServiceTest.java | 0 .../datanerd/es/service/RxStreamObserverTest.java | 0 .../test/resources/Large_Scaled_Forest_Lizard.jpg | Bin .../src/test/resources/logback-test.xml | 0 .../src/test/resources/test.properties | 0 {gradle => java/gradle}/checkstyle.gradle | 0 {gradle => java/gradle}/findbugs.gradle | 0 {gradle => java/gradle}/findbugs_exclude_filter.xml | 0 {gradle => java/gradle}/google_checks.xml | 0 .../gradle}/google_checks_suppressions.xml | 0 {gradle => java/gradle}/jacoco.gradle | 0 {gradle => java/gradle}/wrapper/gradle-wrapper.jar | Bin .../gradle}/wrapper/gradle-wrapper.properties | 0 gradlew => java/gradlew | 0 gradlew.bat => java/gradlew.bat | 0 {grpc-gateway => java/grpc-gateway}/README.md | 0 {grpc-gateway => java/grpc-gateway}/build.sh | 0 .../grpc-gateway}/src/grpc-mate-gateway/main.go | 0 .../helloworld-service}/build.gradle | 0 .../helloworld-service}/deployment/Dockerfile | 0 .../helloworld-service}/deployment/deployment.yaml | 0 .../deployment/endpoints/Makefile | 0 .../deployment/endpoints/api_service.yaml | 0 .../helloworld-service}/deployment/service.yaml | 0 .../java/io/datanerd/hello/server/GrpcServer.java | 0 .../io/datanerd/hello/server/ServiceLauncher.java | 0 .../io/datanerd/hello/service/GreeterService.java | 0 .../src/main/proto/helloworld.proto | 0 .../src/main/resources/logback.xml | 0 .../datanerd/hello/service/GreeterServiceTest.java | 0 settings.gradle => java/settings.gradle | 0 shippable.yml => java/shippable.yml | 0 protobuffers/Makefile | 2 +- protobuffers/{ => grpc_mate}/helloworld.proto | 0 protobuffers/{ => grpc_mate}/product_common.proto | 0 .../{ => grpc_mate}/product_search_engine.proto | 2 +- 79 files changed, 2 insertions(+), 2 deletions(-) rename .travis.yml => java/.travis.yml (100%) rename LICENSE => java/LICENSE (100%) rename Makefile => java/Makefile (100%) rename README.md => java/README.md (100%) rename build.gradle => java/build.gradle (100%) rename {elasticsearch-service => java/elasticsearch-service}/build.gradle (100%) rename {elasticsearch-service => java/elasticsearch-service}/deployment/Dockerfile (100%) rename {elasticsearch-service => java/elasticsearch-service}/deployment/data_nerd.properties (100%) rename {elasticsearch-service => java/elasticsearch-service}/deployment/deploy.sh (100%) rename {elasticsearch-service => java/elasticsearch-service}/deployment/deployment.yaml (100%) rename {elasticsearch-service => java/elasticsearch-service}/deployment/service.yaml (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/dao/ProductDao.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/guice/ConfigurationProvider.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/guice/Constants.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/guice/ElasticSearchModule.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/guice/TransportClientProvider.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/metrics/CounterFactory.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/metrics/Metric.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/server/GrpcServer.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/server/HttpServer.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/server/ServiceInterceptor.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/server/ServiceLauncher.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/service/EchoService.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/service/ProductImageSeeker.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/service/ProductReadService.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/service/ProductUpdateService.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/java/io/datanerd/es/service/RxStreamObserver.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/proto/google (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/proto/product_common.proto (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/proto/product_search_engine.proto (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/resources/elasticsearch/product_mappings.json (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/resources/elasticsearch/product_settings.json (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/main/resources/logback.xml (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/java/io/datanerd/es/TestConstant.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/java/io/datanerd/es/dao/ProductDaoTest.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/java/io/datanerd/es/guice/ConfigurationProviderTest.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/java/io/datanerd/es/guice/ElasticSearchModuleTest.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/java/io/datanerd/es/guice/TransportClientProviderTest.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/java/io/datanerd/es/metrics/CounterFactoryTest.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/java/io/datanerd/es/metrics/MetricTest.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/java/io/datanerd/es/service/CallerInterceptor.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/java/io/datanerd/es/service/EchoServiceTest.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/java/io/datanerd/es/service/ProductReadServiceTest.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/java/io/datanerd/es/service/ProductUpdateServiceTest.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/java/io/datanerd/es/service/RxStreamObserverTest.java (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/resources/Large_Scaled_Forest_Lizard.jpg (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/resources/logback-test.xml (100%) rename {elasticsearch-service => java/elasticsearch-service}/src/test/resources/test.properties (100%) rename {gradle => java/gradle}/checkstyle.gradle (100%) rename {gradle => java/gradle}/findbugs.gradle (100%) rename {gradle => java/gradle}/findbugs_exclude_filter.xml (100%) rename {gradle => java/gradle}/google_checks.xml (100%) rename {gradle => java/gradle}/google_checks_suppressions.xml (100%) rename {gradle => java/gradle}/jacoco.gradle (100%) rename {gradle => java/gradle}/wrapper/gradle-wrapper.jar (100%) rename {gradle => java/gradle}/wrapper/gradle-wrapper.properties (100%) rename gradlew => java/gradlew (100%) rename gradlew.bat => java/gradlew.bat (100%) rename {grpc-gateway => java/grpc-gateway}/README.md (100%) rename {grpc-gateway => java/grpc-gateway}/build.sh (100%) rename {grpc-gateway => java/grpc-gateway}/src/grpc-mate-gateway/main.go (100%) rename {helloworld-service => java/helloworld-service}/build.gradle (100%) rename {helloworld-service => java/helloworld-service}/deployment/Dockerfile (100%) rename {helloworld-service => java/helloworld-service}/deployment/deployment.yaml (100%) rename {helloworld-service => java/helloworld-service}/deployment/endpoints/Makefile (100%) rename {helloworld-service => java/helloworld-service}/deployment/endpoints/api_service.yaml (100%) rename {helloworld-service => java/helloworld-service}/deployment/service.yaml (100%) rename {helloworld-service => java/helloworld-service}/src/main/java/io/datanerd/hello/server/GrpcServer.java (100%) rename {helloworld-service => java/helloworld-service}/src/main/java/io/datanerd/hello/server/ServiceLauncher.java (100%) rename {helloworld-service => java/helloworld-service}/src/main/java/io/datanerd/hello/service/GreeterService.java (100%) rename {helloworld-service => java/helloworld-service}/src/main/proto/helloworld.proto (100%) rename {helloworld-service => java/helloworld-service}/src/main/resources/logback.xml (100%) rename {helloworld-service => java/helloworld-service}/src/test/java/io/datanerd/hello/service/GreeterServiceTest.java (100%) rename settings.gradle => java/settings.gradle (100%) rename shippable.yml => java/shippable.yml (100%) rename protobuffers/{ => grpc_mate}/helloworld.proto (100%) rename protobuffers/{ => grpc_mate}/product_common.proto (100%) rename protobuffers/{ => grpc_mate}/product_search_engine.proto (97%) diff --git a/.travis.yml b/java/.travis.yml similarity index 100% rename from .travis.yml rename to java/.travis.yml diff --git a/LICENSE b/java/LICENSE similarity index 100% rename from LICENSE rename to java/LICENSE diff --git a/Makefile b/java/Makefile similarity index 100% rename from Makefile rename to java/Makefile diff --git a/README.md b/java/README.md similarity index 100% rename from README.md rename to java/README.md diff --git a/build.gradle b/java/build.gradle similarity index 100% rename from build.gradle rename to java/build.gradle diff --git a/elasticsearch-service/build.gradle b/java/elasticsearch-service/build.gradle similarity index 100% rename from elasticsearch-service/build.gradle rename to java/elasticsearch-service/build.gradle diff --git a/elasticsearch-service/deployment/Dockerfile b/java/elasticsearch-service/deployment/Dockerfile similarity index 100% rename from elasticsearch-service/deployment/Dockerfile rename to java/elasticsearch-service/deployment/Dockerfile diff --git a/elasticsearch-service/deployment/data_nerd.properties b/java/elasticsearch-service/deployment/data_nerd.properties similarity index 100% rename from elasticsearch-service/deployment/data_nerd.properties rename to java/elasticsearch-service/deployment/data_nerd.properties diff --git a/elasticsearch-service/deployment/deploy.sh b/java/elasticsearch-service/deployment/deploy.sh similarity index 100% rename from elasticsearch-service/deployment/deploy.sh rename to java/elasticsearch-service/deployment/deploy.sh diff --git a/elasticsearch-service/deployment/deployment.yaml b/java/elasticsearch-service/deployment/deployment.yaml similarity index 100% rename from elasticsearch-service/deployment/deployment.yaml rename to java/elasticsearch-service/deployment/deployment.yaml diff --git a/elasticsearch-service/deployment/service.yaml b/java/elasticsearch-service/deployment/service.yaml similarity index 100% rename from elasticsearch-service/deployment/service.yaml rename to java/elasticsearch-service/deployment/service.yaml diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/dao/ProductDao.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/dao/ProductDao.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/dao/ProductDao.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/dao/ProductDao.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/guice/ConfigurationProvider.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/guice/ConfigurationProvider.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/guice/ConfigurationProvider.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/guice/ConfigurationProvider.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/guice/Constants.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/guice/Constants.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/guice/Constants.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/guice/Constants.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/guice/ElasticSearchModule.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/guice/ElasticSearchModule.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/guice/ElasticSearchModule.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/guice/ElasticSearchModule.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/guice/TransportClientProvider.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/guice/TransportClientProvider.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/guice/TransportClientProvider.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/guice/TransportClientProvider.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/metrics/CounterFactory.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/CounterFactory.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/metrics/CounterFactory.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/CounterFactory.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/metrics/Metric.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/Metric.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/metrics/Metric.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/Metric.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/server/GrpcServer.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/server/GrpcServer.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/server/GrpcServer.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/server/GrpcServer.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/server/HttpServer.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/server/HttpServer.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/server/HttpServer.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/server/HttpServer.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceInterceptor.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceInterceptor.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceInterceptor.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceInterceptor.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceLauncher.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceLauncher.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceLauncher.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceLauncher.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/service/EchoService.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/service/EchoService.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/service/EchoService.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/service/EchoService.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductImageSeeker.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductImageSeeker.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/service/ProductImageSeeker.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductImageSeeker.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductUpdateService.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductUpdateService.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/service/ProductUpdateService.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductUpdateService.java diff --git a/elasticsearch-service/src/main/java/io/datanerd/es/service/RxStreamObserver.java b/java/elasticsearch-service/src/main/java/io/datanerd/es/service/RxStreamObserver.java similarity index 100% rename from elasticsearch-service/src/main/java/io/datanerd/es/service/RxStreamObserver.java rename to java/elasticsearch-service/src/main/java/io/datanerd/es/service/RxStreamObserver.java diff --git a/elasticsearch-service/src/main/proto/google b/java/elasticsearch-service/src/main/proto/google similarity index 100% rename from elasticsearch-service/src/main/proto/google rename to java/elasticsearch-service/src/main/proto/google diff --git a/elasticsearch-service/src/main/proto/product_common.proto b/java/elasticsearch-service/src/main/proto/product_common.proto similarity index 100% rename from elasticsearch-service/src/main/proto/product_common.proto rename to java/elasticsearch-service/src/main/proto/product_common.proto diff --git a/elasticsearch-service/src/main/proto/product_search_engine.proto b/java/elasticsearch-service/src/main/proto/product_search_engine.proto similarity index 100% rename from elasticsearch-service/src/main/proto/product_search_engine.proto rename to java/elasticsearch-service/src/main/proto/product_search_engine.proto diff --git a/elasticsearch-service/src/main/resources/elasticsearch/product_mappings.json b/java/elasticsearch-service/src/main/resources/elasticsearch/product_mappings.json similarity index 100% rename from elasticsearch-service/src/main/resources/elasticsearch/product_mappings.json rename to java/elasticsearch-service/src/main/resources/elasticsearch/product_mappings.json diff --git a/elasticsearch-service/src/main/resources/elasticsearch/product_settings.json b/java/elasticsearch-service/src/main/resources/elasticsearch/product_settings.json similarity index 100% rename from elasticsearch-service/src/main/resources/elasticsearch/product_settings.json rename to java/elasticsearch-service/src/main/resources/elasticsearch/product_settings.json diff --git a/elasticsearch-service/src/main/resources/logback.xml b/java/elasticsearch-service/src/main/resources/logback.xml similarity index 100% rename from elasticsearch-service/src/main/resources/logback.xml rename to java/elasticsearch-service/src/main/resources/logback.xml diff --git a/elasticsearch-service/src/test/java/io/datanerd/es/TestConstant.java b/java/elasticsearch-service/src/test/java/io/datanerd/es/TestConstant.java similarity index 100% rename from elasticsearch-service/src/test/java/io/datanerd/es/TestConstant.java rename to java/elasticsearch-service/src/test/java/io/datanerd/es/TestConstant.java diff --git a/elasticsearch-service/src/test/java/io/datanerd/es/dao/ProductDaoTest.java b/java/elasticsearch-service/src/test/java/io/datanerd/es/dao/ProductDaoTest.java similarity index 100% rename from elasticsearch-service/src/test/java/io/datanerd/es/dao/ProductDaoTest.java rename to java/elasticsearch-service/src/test/java/io/datanerd/es/dao/ProductDaoTest.java diff --git a/elasticsearch-service/src/test/java/io/datanerd/es/guice/ConfigurationProviderTest.java b/java/elasticsearch-service/src/test/java/io/datanerd/es/guice/ConfigurationProviderTest.java similarity index 100% rename from elasticsearch-service/src/test/java/io/datanerd/es/guice/ConfigurationProviderTest.java rename to java/elasticsearch-service/src/test/java/io/datanerd/es/guice/ConfigurationProviderTest.java diff --git a/elasticsearch-service/src/test/java/io/datanerd/es/guice/ElasticSearchModuleTest.java b/java/elasticsearch-service/src/test/java/io/datanerd/es/guice/ElasticSearchModuleTest.java similarity index 100% rename from elasticsearch-service/src/test/java/io/datanerd/es/guice/ElasticSearchModuleTest.java rename to java/elasticsearch-service/src/test/java/io/datanerd/es/guice/ElasticSearchModuleTest.java diff --git a/elasticsearch-service/src/test/java/io/datanerd/es/guice/TransportClientProviderTest.java b/java/elasticsearch-service/src/test/java/io/datanerd/es/guice/TransportClientProviderTest.java similarity index 100% rename from elasticsearch-service/src/test/java/io/datanerd/es/guice/TransportClientProviderTest.java rename to java/elasticsearch-service/src/test/java/io/datanerd/es/guice/TransportClientProviderTest.java diff --git a/elasticsearch-service/src/test/java/io/datanerd/es/metrics/CounterFactoryTest.java b/java/elasticsearch-service/src/test/java/io/datanerd/es/metrics/CounterFactoryTest.java similarity index 100% rename from elasticsearch-service/src/test/java/io/datanerd/es/metrics/CounterFactoryTest.java rename to java/elasticsearch-service/src/test/java/io/datanerd/es/metrics/CounterFactoryTest.java diff --git a/elasticsearch-service/src/test/java/io/datanerd/es/metrics/MetricTest.java b/java/elasticsearch-service/src/test/java/io/datanerd/es/metrics/MetricTest.java similarity index 100% rename from elasticsearch-service/src/test/java/io/datanerd/es/metrics/MetricTest.java rename to java/elasticsearch-service/src/test/java/io/datanerd/es/metrics/MetricTest.java diff --git a/elasticsearch-service/src/test/java/io/datanerd/es/service/CallerInterceptor.java b/java/elasticsearch-service/src/test/java/io/datanerd/es/service/CallerInterceptor.java similarity index 100% rename from elasticsearch-service/src/test/java/io/datanerd/es/service/CallerInterceptor.java rename to java/elasticsearch-service/src/test/java/io/datanerd/es/service/CallerInterceptor.java diff --git a/elasticsearch-service/src/test/java/io/datanerd/es/service/EchoServiceTest.java b/java/elasticsearch-service/src/test/java/io/datanerd/es/service/EchoServiceTest.java similarity index 100% rename from elasticsearch-service/src/test/java/io/datanerd/es/service/EchoServiceTest.java rename to java/elasticsearch-service/src/test/java/io/datanerd/es/service/EchoServiceTest.java diff --git a/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductReadServiceTest.java b/java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductReadServiceTest.java similarity index 100% rename from elasticsearch-service/src/test/java/io/datanerd/es/service/ProductReadServiceTest.java rename to java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductReadServiceTest.java diff --git a/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductUpdateServiceTest.java b/java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductUpdateServiceTest.java similarity index 100% rename from elasticsearch-service/src/test/java/io/datanerd/es/service/ProductUpdateServiceTest.java rename to java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductUpdateServiceTest.java diff --git a/elasticsearch-service/src/test/java/io/datanerd/es/service/RxStreamObserverTest.java b/java/elasticsearch-service/src/test/java/io/datanerd/es/service/RxStreamObserverTest.java similarity index 100% rename from elasticsearch-service/src/test/java/io/datanerd/es/service/RxStreamObserverTest.java rename to java/elasticsearch-service/src/test/java/io/datanerd/es/service/RxStreamObserverTest.java diff --git a/elasticsearch-service/src/test/resources/Large_Scaled_Forest_Lizard.jpg b/java/elasticsearch-service/src/test/resources/Large_Scaled_Forest_Lizard.jpg similarity index 100% rename from elasticsearch-service/src/test/resources/Large_Scaled_Forest_Lizard.jpg rename to java/elasticsearch-service/src/test/resources/Large_Scaled_Forest_Lizard.jpg diff --git a/elasticsearch-service/src/test/resources/logback-test.xml b/java/elasticsearch-service/src/test/resources/logback-test.xml similarity index 100% rename from elasticsearch-service/src/test/resources/logback-test.xml rename to java/elasticsearch-service/src/test/resources/logback-test.xml diff --git a/elasticsearch-service/src/test/resources/test.properties b/java/elasticsearch-service/src/test/resources/test.properties similarity index 100% rename from elasticsearch-service/src/test/resources/test.properties rename to java/elasticsearch-service/src/test/resources/test.properties diff --git a/gradle/checkstyle.gradle b/java/gradle/checkstyle.gradle similarity index 100% rename from gradle/checkstyle.gradle rename to java/gradle/checkstyle.gradle diff --git a/gradle/findbugs.gradle b/java/gradle/findbugs.gradle similarity index 100% rename from gradle/findbugs.gradle rename to java/gradle/findbugs.gradle diff --git a/gradle/findbugs_exclude_filter.xml b/java/gradle/findbugs_exclude_filter.xml similarity index 100% rename from gradle/findbugs_exclude_filter.xml rename to java/gradle/findbugs_exclude_filter.xml diff --git a/gradle/google_checks.xml b/java/gradle/google_checks.xml similarity index 100% rename from gradle/google_checks.xml rename to java/gradle/google_checks.xml diff --git a/gradle/google_checks_suppressions.xml b/java/gradle/google_checks_suppressions.xml similarity index 100% rename from gradle/google_checks_suppressions.xml rename to java/gradle/google_checks_suppressions.xml diff --git a/gradle/jacoco.gradle b/java/gradle/jacoco.gradle similarity index 100% rename from gradle/jacoco.gradle rename to java/gradle/jacoco.gradle diff --git a/gradle/wrapper/gradle-wrapper.jar b/java/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from gradle/wrapper/gradle-wrapper.jar rename to java/gradle/wrapper/gradle-wrapper.jar diff --git a/gradle/wrapper/gradle-wrapper.properties b/java/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from gradle/wrapper/gradle-wrapper.properties rename to java/gradle/wrapper/gradle-wrapper.properties diff --git a/gradlew b/java/gradlew similarity index 100% rename from gradlew rename to java/gradlew diff --git a/gradlew.bat b/java/gradlew.bat similarity index 100% rename from gradlew.bat rename to java/gradlew.bat diff --git a/grpc-gateway/README.md b/java/grpc-gateway/README.md similarity index 100% rename from grpc-gateway/README.md rename to java/grpc-gateway/README.md diff --git a/grpc-gateway/build.sh b/java/grpc-gateway/build.sh similarity index 100% rename from grpc-gateway/build.sh rename to java/grpc-gateway/build.sh diff --git a/grpc-gateway/src/grpc-mate-gateway/main.go b/java/grpc-gateway/src/grpc-mate-gateway/main.go similarity index 100% rename from grpc-gateway/src/grpc-mate-gateway/main.go rename to java/grpc-gateway/src/grpc-mate-gateway/main.go diff --git a/helloworld-service/build.gradle b/java/helloworld-service/build.gradle similarity index 100% rename from helloworld-service/build.gradle rename to java/helloworld-service/build.gradle diff --git a/helloworld-service/deployment/Dockerfile b/java/helloworld-service/deployment/Dockerfile similarity index 100% rename from helloworld-service/deployment/Dockerfile rename to java/helloworld-service/deployment/Dockerfile diff --git a/helloworld-service/deployment/deployment.yaml b/java/helloworld-service/deployment/deployment.yaml similarity index 100% rename from helloworld-service/deployment/deployment.yaml rename to java/helloworld-service/deployment/deployment.yaml diff --git a/helloworld-service/deployment/endpoints/Makefile b/java/helloworld-service/deployment/endpoints/Makefile similarity index 100% rename from helloworld-service/deployment/endpoints/Makefile rename to java/helloworld-service/deployment/endpoints/Makefile diff --git a/helloworld-service/deployment/endpoints/api_service.yaml b/java/helloworld-service/deployment/endpoints/api_service.yaml similarity index 100% rename from helloworld-service/deployment/endpoints/api_service.yaml rename to java/helloworld-service/deployment/endpoints/api_service.yaml diff --git a/helloworld-service/deployment/service.yaml b/java/helloworld-service/deployment/service.yaml similarity index 100% rename from helloworld-service/deployment/service.yaml rename to java/helloworld-service/deployment/service.yaml diff --git a/helloworld-service/src/main/java/io/datanerd/hello/server/GrpcServer.java b/java/helloworld-service/src/main/java/io/datanerd/hello/server/GrpcServer.java similarity index 100% rename from helloworld-service/src/main/java/io/datanerd/hello/server/GrpcServer.java rename to java/helloworld-service/src/main/java/io/datanerd/hello/server/GrpcServer.java diff --git a/helloworld-service/src/main/java/io/datanerd/hello/server/ServiceLauncher.java b/java/helloworld-service/src/main/java/io/datanerd/hello/server/ServiceLauncher.java similarity index 100% rename from helloworld-service/src/main/java/io/datanerd/hello/server/ServiceLauncher.java rename to java/helloworld-service/src/main/java/io/datanerd/hello/server/ServiceLauncher.java diff --git a/helloworld-service/src/main/java/io/datanerd/hello/service/GreeterService.java b/java/helloworld-service/src/main/java/io/datanerd/hello/service/GreeterService.java similarity index 100% rename from helloworld-service/src/main/java/io/datanerd/hello/service/GreeterService.java rename to java/helloworld-service/src/main/java/io/datanerd/hello/service/GreeterService.java diff --git a/helloworld-service/src/main/proto/helloworld.proto b/java/helloworld-service/src/main/proto/helloworld.proto similarity index 100% rename from helloworld-service/src/main/proto/helloworld.proto rename to java/helloworld-service/src/main/proto/helloworld.proto diff --git a/helloworld-service/src/main/resources/logback.xml b/java/helloworld-service/src/main/resources/logback.xml similarity index 100% rename from helloworld-service/src/main/resources/logback.xml rename to java/helloworld-service/src/main/resources/logback.xml diff --git a/helloworld-service/src/test/java/io/datanerd/hello/service/GreeterServiceTest.java b/java/helloworld-service/src/test/java/io/datanerd/hello/service/GreeterServiceTest.java similarity index 100% rename from helloworld-service/src/test/java/io/datanerd/hello/service/GreeterServiceTest.java rename to java/helloworld-service/src/test/java/io/datanerd/hello/service/GreeterServiceTest.java diff --git a/settings.gradle b/java/settings.gradle similarity index 100% rename from settings.gradle rename to java/settings.gradle diff --git a/shippable.yml b/java/shippable.yml similarity index 100% rename from shippable.yml rename to java/shippable.yml diff --git a/protobuffers/Makefile b/protobuffers/Makefile index 16bfb73..4f99eec 100644 --- a/protobuffers/Makefile +++ b/protobuffers/Makefile @@ -1,4 +1,4 @@ clean: mkdir -p java_generated && rm -rf java_generated/* gen: clean - protoc --java_out=java_generated *.proto \ No newline at end of file + protoc --java_out=java_generated grpc_mate/*.proto diff --git a/protobuffers/helloworld.proto b/protobuffers/grpc_mate/helloworld.proto similarity index 100% rename from protobuffers/helloworld.proto rename to protobuffers/grpc_mate/helloworld.proto diff --git a/protobuffers/product_common.proto b/protobuffers/grpc_mate/product_common.proto similarity index 100% rename from protobuffers/product_common.proto rename to protobuffers/grpc_mate/product_common.proto diff --git a/protobuffers/product_search_engine.proto b/protobuffers/grpc_mate/product_search_engine.proto similarity index 97% rename from protobuffers/product_search_engine.proto rename to protobuffers/grpc_mate/product_search_engine.proto index 8837173..f24f8c7 100644 --- a/protobuffers/product_search_engine.proto +++ b/protobuffers/grpc_mate/product_search_engine.proto @@ -1,7 +1,7 @@ syntax = "proto3"; option java_package = "io.datanerd.generated.es"; option java_multiple_files = true; -import "product_common.proto"; +import "grpc_mate/product_common.proto"; import "google/api/annotations.proto"; //make sure this can be used in grpc gateway option go_package = "datanerd"; From 102aaf6c03230a85b46aa0dff385db5c7123dbea Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 31 Aug 2019 15:32:14 +0800 Subject: [PATCH 02/50] fix proto path --- java/elasticsearch-service/src/main/proto/google | 2 +- .../src/main/proto/grpc_mate/product_common.proto | 1 + .../src/main/proto/grpc_mate/product_search_engine.proto | 1 + java/elasticsearch-service/src/main/proto/product_common.proto | 1 - .../src/main/proto/product_search_engine.proto | 1 - .../src/main/proto/grpc_mate/helloworld.proto | 1 + java/helloworld-service/src/main/proto/helloworld.proto | 1 - 7 files changed, 4 insertions(+), 4 deletions(-) create mode 120000 java/elasticsearch-service/src/main/proto/grpc_mate/product_common.proto create mode 120000 java/elasticsearch-service/src/main/proto/grpc_mate/product_search_engine.proto delete mode 120000 java/elasticsearch-service/src/main/proto/product_common.proto delete mode 120000 java/elasticsearch-service/src/main/proto/product_search_engine.proto create mode 120000 java/helloworld-service/src/main/proto/grpc_mate/helloworld.proto delete mode 120000 java/helloworld-service/src/main/proto/helloworld.proto diff --git a/java/elasticsearch-service/src/main/proto/google b/java/elasticsearch-service/src/main/proto/google index 74e284b..8aa56a3 120000 --- a/java/elasticsearch-service/src/main/proto/google +++ b/java/elasticsearch-service/src/main/proto/google @@ -1 +1 @@ -../../../../protobuffers/google \ No newline at end of file +../../../../../protobuffers/google \ No newline at end of file diff --git a/java/elasticsearch-service/src/main/proto/grpc_mate/product_common.proto b/java/elasticsearch-service/src/main/proto/grpc_mate/product_common.proto new file mode 120000 index 0000000..ba4615a --- /dev/null +++ b/java/elasticsearch-service/src/main/proto/grpc_mate/product_common.proto @@ -0,0 +1 @@ +../../../../../../protobuffers/grpc_mate/product_common.proto \ No newline at end of file diff --git a/java/elasticsearch-service/src/main/proto/grpc_mate/product_search_engine.proto b/java/elasticsearch-service/src/main/proto/grpc_mate/product_search_engine.proto new file mode 120000 index 0000000..c6d84ec --- /dev/null +++ b/java/elasticsearch-service/src/main/proto/grpc_mate/product_search_engine.proto @@ -0,0 +1 @@ +../../../../../../protobuffers/grpc_mate/product_search_engine.proto \ No newline at end of file diff --git a/java/elasticsearch-service/src/main/proto/product_common.proto b/java/elasticsearch-service/src/main/proto/product_common.proto deleted file mode 120000 index e127a00..0000000 --- a/java/elasticsearch-service/src/main/proto/product_common.proto +++ /dev/null @@ -1 +0,0 @@ -../../../../protobuffers/product_common.proto \ No newline at end of file diff --git a/java/elasticsearch-service/src/main/proto/product_search_engine.proto b/java/elasticsearch-service/src/main/proto/product_search_engine.proto deleted file mode 120000 index 7ed75a7..0000000 --- a/java/elasticsearch-service/src/main/proto/product_search_engine.proto +++ /dev/null @@ -1 +0,0 @@ -../../../../protobuffers/product_search_engine.proto \ No newline at end of file diff --git a/java/helloworld-service/src/main/proto/grpc_mate/helloworld.proto b/java/helloworld-service/src/main/proto/grpc_mate/helloworld.proto new file mode 120000 index 0000000..0c17c5a --- /dev/null +++ b/java/helloworld-service/src/main/proto/grpc_mate/helloworld.proto @@ -0,0 +1 @@ +../../../../../../protobuffers/grpc_mate/helloworld.proto \ No newline at end of file diff --git a/java/helloworld-service/src/main/proto/helloworld.proto b/java/helloworld-service/src/main/proto/helloworld.proto deleted file mode 120000 index 8a729af..0000000 --- a/java/helloworld-service/src/main/proto/helloworld.proto +++ /dev/null @@ -1 +0,0 @@ -../../../../protobuffers/helloworld.proto \ No newline at end of file From 7960fddd1dda251d9fead1dc2f421633a0e301d8 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 19 Oct 2019 14:08:15 +0800 Subject: [PATCH 03/50] re structure project --- README.md | 3 + {java => grpc-mate-java}/.travis.yml | 0 {java => grpc-mate-java}/LICENSE | 0 {java => grpc-mate-java}/Makefile | 0 {java => grpc-mate-java}/README.md | 0 {java => grpc-mate-java}/build.gradle | 0 .../elasticsearch-service/build.gradle | 0 .../deployment/Dockerfile | 0 .../deployment/data_nerd.properties | 0 .../deployment/deploy.sh | 0 .../deployment/deployment.yaml | 0 .../deployment/service.yaml | 0 .../java/io/datanerd/es/dao/ProductDao.java | 0 .../es/guice/ConfigurationProvider.java | 0 .../java/io/datanerd/es/guice/Constants.java | 0 .../es/guice/ElasticSearchModule.java | 0 .../es/guice/TransportClientProvider.java | 0 .../datanerd/es/metrics/CounterFactory.java | 0 .../java/io/datanerd/es/metrics/Metric.java | 0 .../io/datanerd/es/server/GrpcServer.java | 0 .../io/datanerd/es/server/HttpServer.java | 0 .../es/server/ServiceInterceptor.java | 0 .../datanerd/es/server/ServiceLauncher.java | 0 .../io/datanerd/es/service/EchoService.java | 0 .../es/service/ProductImageSeeker.java | 0 .../es/service/ProductReadService.java | 0 .../es/service/ProductUpdateService.java | 0 .../datanerd/es/service/RxStreamObserver.java | 0 .../src/main/proto/google | 0 .../main/proto/grpc_mate/product_common.proto | 0 .../grpc_mate/product_search_engine.proto | 0 .../elasticsearch/product_mappings.json | 0 .../elasticsearch/product_settings.json | 0 .../src/main/resources/logback.xml | 0 .../java/io/datanerd/es/TestConstant.java | 0 .../io/datanerd/es/dao/ProductDaoTest.java | 0 .../es/guice/ConfigurationProviderTest.java | 0 .../es/guice/ElasticSearchModuleTest.java | 0 .../es/guice/TransportClientProviderTest.java | 0 .../es/metrics/CounterFactoryTest.java | 0 .../io/datanerd/es/metrics/MetricTest.java | 0 .../es/service/CallerInterceptor.java | 0 .../datanerd/es/service/EchoServiceTest.java | 0 .../es/service/ProductReadServiceTest.java | 0 .../es/service/ProductUpdateServiceTest.java | 0 .../es/service/RxStreamObserverTest.java | 0 .../resources/Large_Scaled_Forest_Lizard.jpg | Bin .../src/test/resources/logback-test.xml | 0 .../src/test/resources/test.properties | 0 .../gradle/checkstyle.gradle | 0 .../gradle/findbugs.gradle | 0 .../gradle/findbugs_exclude_filter.xml | 0 .../gradle/google_checks.xml | 0 .../gradle/google_checks_suppressions.xml | 0 {java => grpc-mate-java}/gradle/jacoco.gradle | 0 .../gradle/wrapper/gradle-wrapper.jar | Bin .../gradle/wrapper/gradle-wrapper.properties | 0 {java => grpc-mate-java}/gradlew | 0 {java => grpc-mate-java}/gradlew.bat | 0 .../grpc-gateway/README.md | 0 .../grpc-gateway/build.sh | 0 .../src/grpc-mate-gateway/main.go | 0 .../helloworld-service/build.gradle | 0 .../helloworld-service/deployment/Dockerfile | 0 .../deployment/deployment.yaml | 0 .../deployment/endpoints/Makefile | 0 .../deployment/endpoints/api_service.yaml | 0 .../deployment/service.yaml | 0 .../io/datanerd/hello/server/GrpcServer.java | 0 .../hello/server/ServiceLauncher.java | 0 .../hello/service/GreeterService.java | 0 .../src/main/proto/grpc_mate/helloworld.proto | 0 .../src/main/resources/logback.xml | 0 .../hello/service/GreeterServiceTest.java | 0 {java => grpc-mate-java}/settings.gradle | 0 {java => grpc-mate-java}/shippable.yml | 0 grpc-mate-python/Pipfile | 14 ++ grpc-mate-python/Pipfile.lock | 126 ++++++++++++++++++ 78 files changed, 143 insertions(+) create mode 100644 README.md rename {java => grpc-mate-java}/.travis.yml (100%) rename {java => grpc-mate-java}/LICENSE (100%) rename {java => grpc-mate-java}/Makefile (100%) rename {java => grpc-mate-java}/README.md (100%) rename {java => grpc-mate-java}/build.gradle (100%) rename {java => grpc-mate-java}/elasticsearch-service/build.gradle (100%) rename {java => grpc-mate-java}/elasticsearch-service/deployment/Dockerfile (100%) rename {java => grpc-mate-java}/elasticsearch-service/deployment/data_nerd.properties (100%) rename {java => grpc-mate-java}/elasticsearch-service/deployment/deploy.sh (100%) rename {java => grpc-mate-java}/elasticsearch-service/deployment/deployment.yaml (100%) rename {java => grpc-mate-java}/elasticsearch-service/deployment/service.yaml (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/dao/ProductDao.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/guice/ConfigurationProvider.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/guice/Constants.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/guice/ElasticSearchModule.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/guice/TransportClientProvider.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/metrics/CounterFactory.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/metrics/Metric.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/server/GrpcServer.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/server/HttpServer.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceInterceptor.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceLauncher.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/service/EchoService.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductImageSeeker.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductUpdateService.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/java/io/datanerd/es/service/RxStreamObserver.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/proto/google (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/proto/grpc_mate/product_common.proto (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/proto/grpc_mate/product_search_engine.proto (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/resources/elasticsearch/product_mappings.json (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/resources/elasticsearch/product_settings.json (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/main/resources/logback.xml (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/java/io/datanerd/es/TestConstant.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/java/io/datanerd/es/dao/ProductDaoTest.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/java/io/datanerd/es/guice/ConfigurationProviderTest.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/java/io/datanerd/es/guice/ElasticSearchModuleTest.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/java/io/datanerd/es/guice/TransportClientProviderTest.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/java/io/datanerd/es/metrics/CounterFactoryTest.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/java/io/datanerd/es/metrics/MetricTest.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/java/io/datanerd/es/service/CallerInterceptor.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/java/io/datanerd/es/service/EchoServiceTest.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductReadServiceTest.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductUpdateServiceTest.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/java/io/datanerd/es/service/RxStreamObserverTest.java (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/resources/Large_Scaled_Forest_Lizard.jpg (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/resources/logback-test.xml (100%) rename {java => grpc-mate-java}/elasticsearch-service/src/test/resources/test.properties (100%) rename {java => grpc-mate-java}/gradle/checkstyle.gradle (100%) rename {java => grpc-mate-java}/gradle/findbugs.gradle (100%) rename {java => grpc-mate-java}/gradle/findbugs_exclude_filter.xml (100%) rename {java => grpc-mate-java}/gradle/google_checks.xml (100%) rename {java => grpc-mate-java}/gradle/google_checks_suppressions.xml (100%) rename {java => grpc-mate-java}/gradle/jacoco.gradle (100%) rename {java => grpc-mate-java}/gradle/wrapper/gradle-wrapper.jar (100%) rename {java => grpc-mate-java}/gradle/wrapper/gradle-wrapper.properties (100%) rename {java => grpc-mate-java}/gradlew (100%) rename {java => grpc-mate-java}/gradlew.bat (100%) rename {java => grpc-mate-java}/grpc-gateway/README.md (100%) rename {java => grpc-mate-java}/grpc-gateway/build.sh (100%) rename {java => grpc-mate-java}/grpc-gateway/src/grpc-mate-gateway/main.go (100%) rename {java => grpc-mate-java}/helloworld-service/build.gradle (100%) rename {java => grpc-mate-java}/helloworld-service/deployment/Dockerfile (100%) rename {java => grpc-mate-java}/helloworld-service/deployment/deployment.yaml (100%) rename {java => grpc-mate-java}/helloworld-service/deployment/endpoints/Makefile (100%) rename {java => grpc-mate-java}/helloworld-service/deployment/endpoints/api_service.yaml (100%) rename {java => grpc-mate-java}/helloworld-service/deployment/service.yaml (100%) rename {java => grpc-mate-java}/helloworld-service/src/main/java/io/datanerd/hello/server/GrpcServer.java (100%) rename {java => grpc-mate-java}/helloworld-service/src/main/java/io/datanerd/hello/server/ServiceLauncher.java (100%) rename {java => grpc-mate-java}/helloworld-service/src/main/java/io/datanerd/hello/service/GreeterService.java (100%) rename {java => grpc-mate-java}/helloworld-service/src/main/proto/grpc_mate/helloworld.proto (100%) rename {java => grpc-mate-java}/helloworld-service/src/main/resources/logback.xml (100%) rename {java => grpc-mate-java}/helloworld-service/src/test/java/io/datanerd/hello/service/GreeterServiceTest.java (100%) rename {java => grpc-mate-java}/settings.gradle (100%) rename {java => grpc-mate-java}/shippable.yml (100%) create mode 100644 grpc-mate-python/Pipfile create mode 100644 grpc-mate-python/Pipfile.lock diff --git a/README.md b/README.md new file mode 100644 index 0000000..e01c9c5 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +gRPC-Mate - An enterprise ready micro service project base on [gRPC](https://grpc.io/) +======================================== +for java based project, please check out diff --git a/java/.travis.yml b/grpc-mate-java/.travis.yml similarity index 100% rename from java/.travis.yml rename to grpc-mate-java/.travis.yml diff --git a/java/LICENSE b/grpc-mate-java/LICENSE similarity index 100% rename from java/LICENSE rename to grpc-mate-java/LICENSE diff --git a/java/Makefile b/grpc-mate-java/Makefile similarity index 100% rename from java/Makefile rename to grpc-mate-java/Makefile diff --git a/java/README.md b/grpc-mate-java/README.md similarity index 100% rename from java/README.md rename to grpc-mate-java/README.md diff --git a/java/build.gradle b/grpc-mate-java/build.gradle similarity index 100% rename from java/build.gradle rename to grpc-mate-java/build.gradle diff --git a/java/elasticsearch-service/build.gradle b/grpc-mate-java/elasticsearch-service/build.gradle similarity index 100% rename from java/elasticsearch-service/build.gradle rename to grpc-mate-java/elasticsearch-service/build.gradle diff --git a/java/elasticsearch-service/deployment/Dockerfile b/grpc-mate-java/elasticsearch-service/deployment/Dockerfile similarity index 100% rename from java/elasticsearch-service/deployment/Dockerfile rename to grpc-mate-java/elasticsearch-service/deployment/Dockerfile diff --git a/java/elasticsearch-service/deployment/data_nerd.properties b/grpc-mate-java/elasticsearch-service/deployment/data_nerd.properties similarity index 100% rename from java/elasticsearch-service/deployment/data_nerd.properties rename to grpc-mate-java/elasticsearch-service/deployment/data_nerd.properties diff --git a/java/elasticsearch-service/deployment/deploy.sh b/grpc-mate-java/elasticsearch-service/deployment/deploy.sh similarity index 100% rename from java/elasticsearch-service/deployment/deploy.sh rename to grpc-mate-java/elasticsearch-service/deployment/deploy.sh diff --git a/java/elasticsearch-service/deployment/deployment.yaml b/grpc-mate-java/elasticsearch-service/deployment/deployment.yaml similarity index 100% rename from java/elasticsearch-service/deployment/deployment.yaml rename to grpc-mate-java/elasticsearch-service/deployment/deployment.yaml diff --git a/java/elasticsearch-service/deployment/service.yaml b/grpc-mate-java/elasticsearch-service/deployment/service.yaml similarity index 100% rename from java/elasticsearch-service/deployment/service.yaml rename to grpc-mate-java/elasticsearch-service/deployment/service.yaml diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/dao/ProductDao.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/dao/ProductDao.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/dao/ProductDao.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/dao/ProductDao.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/guice/ConfigurationProvider.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/guice/ConfigurationProvider.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/guice/ConfigurationProvider.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/guice/ConfigurationProvider.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/guice/Constants.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/guice/Constants.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/guice/Constants.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/guice/Constants.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/guice/ElasticSearchModule.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/guice/ElasticSearchModule.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/guice/ElasticSearchModule.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/guice/ElasticSearchModule.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/guice/TransportClientProvider.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/guice/TransportClientProvider.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/guice/TransportClientProvider.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/guice/TransportClientProvider.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/CounterFactory.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/CounterFactory.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/CounterFactory.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/CounterFactory.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/Metric.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/Metric.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/Metric.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/Metric.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/server/GrpcServer.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/server/GrpcServer.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/server/GrpcServer.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/server/GrpcServer.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/server/HttpServer.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/server/HttpServer.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/server/HttpServer.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/server/HttpServer.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceInterceptor.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceInterceptor.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceInterceptor.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceInterceptor.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceLauncher.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceLauncher.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceLauncher.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceLauncher.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/service/EchoService.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/EchoService.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/service/EchoService.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/EchoService.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductImageSeeker.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductImageSeeker.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductImageSeeker.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductImageSeeker.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductUpdateService.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductUpdateService.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductUpdateService.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductUpdateService.java diff --git a/java/elasticsearch-service/src/main/java/io/datanerd/es/service/RxStreamObserver.java b/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/RxStreamObserver.java similarity index 100% rename from java/elasticsearch-service/src/main/java/io/datanerd/es/service/RxStreamObserver.java rename to grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/RxStreamObserver.java diff --git a/java/elasticsearch-service/src/main/proto/google b/grpc-mate-java/elasticsearch-service/src/main/proto/google similarity index 100% rename from java/elasticsearch-service/src/main/proto/google rename to grpc-mate-java/elasticsearch-service/src/main/proto/google diff --git a/java/elasticsearch-service/src/main/proto/grpc_mate/product_common.proto b/grpc-mate-java/elasticsearch-service/src/main/proto/grpc_mate/product_common.proto similarity index 100% rename from java/elasticsearch-service/src/main/proto/grpc_mate/product_common.proto rename to grpc-mate-java/elasticsearch-service/src/main/proto/grpc_mate/product_common.proto diff --git a/java/elasticsearch-service/src/main/proto/grpc_mate/product_search_engine.proto b/grpc-mate-java/elasticsearch-service/src/main/proto/grpc_mate/product_search_engine.proto similarity index 100% rename from java/elasticsearch-service/src/main/proto/grpc_mate/product_search_engine.proto rename to grpc-mate-java/elasticsearch-service/src/main/proto/grpc_mate/product_search_engine.proto diff --git a/java/elasticsearch-service/src/main/resources/elasticsearch/product_mappings.json b/grpc-mate-java/elasticsearch-service/src/main/resources/elasticsearch/product_mappings.json similarity index 100% rename from java/elasticsearch-service/src/main/resources/elasticsearch/product_mappings.json rename to grpc-mate-java/elasticsearch-service/src/main/resources/elasticsearch/product_mappings.json diff --git a/java/elasticsearch-service/src/main/resources/elasticsearch/product_settings.json b/grpc-mate-java/elasticsearch-service/src/main/resources/elasticsearch/product_settings.json similarity index 100% rename from java/elasticsearch-service/src/main/resources/elasticsearch/product_settings.json rename to grpc-mate-java/elasticsearch-service/src/main/resources/elasticsearch/product_settings.json diff --git a/java/elasticsearch-service/src/main/resources/logback.xml b/grpc-mate-java/elasticsearch-service/src/main/resources/logback.xml similarity index 100% rename from java/elasticsearch-service/src/main/resources/logback.xml rename to grpc-mate-java/elasticsearch-service/src/main/resources/logback.xml diff --git a/java/elasticsearch-service/src/test/java/io/datanerd/es/TestConstant.java b/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/TestConstant.java similarity index 100% rename from java/elasticsearch-service/src/test/java/io/datanerd/es/TestConstant.java rename to grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/TestConstant.java diff --git a/java/elasticsearch-service/src/test/java/io/datanerd/es/dao/ProductDaoTest.java b/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/dao/ProductDaoTest.java similarity index 100% rename from java/elasticsearch-service/src/test/java/io/datanerd/es/dao/ProductDaoTest.java rename to grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/dao/ProductDaoTest.java diff --git a/java/elasticsearch-service/src/test/java/io/datanerd/es/guice/ConfigurationProviderTest.java b/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/guice/ConfigurationProviderTest.java similarity index 100% rename from java/elasticsearch-service/src/test/java/io/datanerd/es/guice/ConfigurationProviderTest.java rename to grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/guice/ConfigurationProviderTest.java diff --git a/java/elasticsearch-service/src/test/java/io/datanerd/es/guice/ElasticSearchModuleTest.java b/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/guice/ElasticSearchModuleTest.java similarity index 100% rename from java/elasticsearch-service/src/test/java/io/datanerd/es/guice/ElasticSearchModuleTest.java rename to grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/guice/ElasticSearchModuleTest.java diff --git a/java/elasticsearch-service/src/test/java/io/datanerd/es/guice/TransportClientProviderTest.java b/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/guice/TransportClientProviderTest.java similarity index 100% rename from java/elasticsearch-service/src/test/java/io/datanerd/es/guice/TransportClientProviderTest.java rename to grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/guice/TransportClientProviderTest.java diff --git a/java/elasticsearch-service/src/test/java/io/datanerd/es/metrics/CounterFactoryTest.java b/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/metrics/CounterFactoryTest.java similarity index 100% rename from java/elasticsearch-service/src/test/java/io/datanerd/es/metrics/CounterFactoryTest.java rename to grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/metrics/CounterFactoryTest.java diff --git a/java/elasticsearch-service/src/test/java/io/datanerd/es/metrics/MetricTest.java b/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/metrics/MetricTest.java similarity index 100% rename from java/elasticsearch-service/src/test/java/io/datanerd/es/metrics/MetricTest.java rename to grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/metrics/MetricTest.java diff --git a/java/elasticsearch-service/src/test/java/io/datanerd/es/service/CallerInterceptor.java b/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/CallerInterceptor.java similarity index 100% rename from java/elasticsearch-service/src/test/java/io/datanerd/es/service/CallerInterceptor.java rename to grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/CallerInterceptor.java diff --git a/java/elasticsearch-service/src/test/java/io/datanerd/es/service/EchoServiceTest.java b/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/EchoServiceTest.java similarity index 100% rename from java/elasticsearch-service/src/test/java/io/datanerd/es/service/EchoServiceTest.java rename to grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/EchoServiceTest.java diff --git a/java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductReadServiceTest.java b/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductReadServiceTest.java similarity index 100% rename from java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductReadServiceTest.java rename to grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductReadServiceTest.java diff --git a/java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductUpdateServiceTest.java b/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductUpdateServiceTest.java similarity index 100% rename from java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductUpdateServiceTest.java rename to grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductUpdateServiceTest.java diff --git a/java/elasticsearch-service/src/test/java/io/datanerd/es/service/RxStreamObserverTest.java b/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/RxStreamObserverTest.java similarity index 100% rename from java/elasticsearch-service/src/test/java/io/datanerd/es/service/RxStreamObserverTest.java rename to grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/RxStreamObserverTest.java diff --git a/java/elasticsearch-service/src/test/resources/Large_Scaled_Forest_Lizard.jpg b/grpc-mate-java/elasticsearch-service/src/test/resources/Large_Scaled_Forest_Lizard.jpg similarity index 100% rename from java/elasticsearch-service/src/test/resources/Large_Scaled_Forest_Lizard.jpg rename to grpc-mate-java/elasticsearch-service/src/test/resources/Large_Scaled_Forest_Lizard.jpg diff --git a/java/elasticsearch-service/src/test/resources/logback-test.xml b/grpc-mate-java/elasticsearch-service/src/test/resources/logback-test.xml similarity index 100% rename from java/elasticsearch-service/src/test/resources/logback-test.xml rename to grpc-mate-java/elasticsearch-service/src/test/resources/logback-test.xml diff --git a/java/elasticsearch-service/src/test/resources/test.properties b/grpc-mate-java/elasticsearch-service/src/test/resources/test.properties similarity index 100% rename from java/elasticsearch-service/src/test/resources/test.properties rename to grpc-mate-java/elasticsearch-service/src/test/resources/test.properties diff --git a/java/gradle/checkstyle.gradle b/grpc-mate-java/gradle/checkstyle.gradle similarity index 100% rename from java/gradle/checkstyle.gradle rename to grpc-mate-java/gradle/checkstyle.gradle diff --git a/java/gradle/findbugs.gradle b/grpc-mate-java/gradle/findbugs.gradle similarity index 100% rename from java/gradle/findbugs.gradle rename to grpc-mate-java/gradle/findbugs.gradle diff --git a/java/gradle/findbugs_exclude_filter.xml b/grpc-mate-java/gradle/findbugs_exclude_filter.xml similarity index 100% rename from java/gradle/findbugs_exclude_filter.xml rename to grpc-mate-java/gradle/findbugs_exclude_filter.xml diff --git a/java/gradle/google_checks.xml b/grpc-mate-java/gradle/google_checks.xml similarity index 100% rename from java/gradle/google_checks.xml rename to grpc-mate-java/gradle/google_checks.xml diff --git a/java/gradle/google_checks_suppressions.xml b/grpc-mate-java/gradle/google_checks_suppressions.xml similarity index 100% rename from java/gradle/google_checks_suppressions.xml rename to grpc-mate-java/gradle/google_checks_suppressions.xml diff --git a/java/gradle/jacoco.gradle b/grpc-mate-java/gradle/jacoco.gradle similarity index 100% rename from java/gradle/jacoco.gradle rename to grpc-mate-java/gradle/jacoco.gradle diff --git a/java/gradle/wrapper/gradle-wrapper.jar b/grpc-mate-java/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from java/gradle/wrapper/gradle-wrapper.jar rename to grpc-mate-java/gradle/wrapper/gradle-wrapper.jar diff --git a/java/gradle/wrapper/gradle-wrapper.properties b/grpc-mate-java/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from java/gradle/wrapper/gradle-wrapper.properties rename to grpc-mate-java/gradle/wrapper/gradle-wrapper.properties diff --git a/java/gradlew b/grpc-mate-java/gradlew similarity index 100% rename from java/gradlew rename to grpc-mate-java/gradlew diff --git a/java/gradlew.bat b/grpc-mate-java/gradlew.bat similarity index 100% rename from java/gradlew.bat rename to grpc-mate-java/gradlew.bat diff --git a/java/grpc-gateway/README.md b/grpc-mate-java/grpc-gateway/README.md similarity index 100% rename from java/grpc-gateway/README.md rename to grpc-mate-java/grpc-gateway/README.md diff --git a/java/grpc-gateway/build.sh b/grpc-mate-java/grpc-gateway/build.sh similarity index 100% rename from java/grpc-gateway/build.sh rename to grpc-mate-java/grpc-gateway/build.sh diff --git a/java/grpc-gateway/src/grpc-mate-gateway/main.go b/grpc-mate-java/grpc-gateway/src/grpc-mate-gateway/main.go similarity index 100% rename from java/grpc-gateway/src/grpc-mate-gateway/main.go rename to grpc-mate-java/grpc-gateway/src/grpc-mate-gateway/main.go diff --git a/java/helloworld-service/build.gradle b/grpc-mate-java/helloworld-service/build.gradle similarity index 100% rename from java/helloworld-service/build.gradle rename to grpc-mate-java/helloworld-service/build.gradle diff --git a/java/helloworld-service/deployment/Dockerfile b/grpc-mate-java/helloworld-service/deployment/Dockerfile similarity index 100% rename from java/helloworld-service/deployment/Dockerfile rename to grpc-mate-java/helloworld-service/deployment/Dockerfile diff --git a/java/helloworld-service/deployment/deployment.yaml b/grpc-mate-java/helloworld-service/deployment/deployment.yaml similarity index 100% rename from java/helloworld-service/deployment/deployment.yaml rename to grpc-mate-java/helloworld-service/deployment/deployment.yaml diff --git a/java/helloworld-service/deployment/endpoints/Makefile b/grpc-mate-java/helloworld-service/deployment/endpoints/Makefile similarity index 100% rename from java/helloworld-service/deployment/endpoints/Makefile rename to grpc-mate-java/helloworld-service/deployment/endpoints/Makefile diff --git a/java/helloworld-service/deployment/endpoints/api_service.yaml b/grpc-mate-java/helloworld-service/deployment/endpoints/api_service.yaml similarity index 100% rename from java/helloworld-service/deployment/endpoints/api_service.yaml rename to grpc-mate-java/helloworld-service/deployment/endpoints/api_service.yaml diff --git a/java/helloworld-service/deployment/service.yaml b/grpc-mate-java/helloworld-service/deployment/service.yaml similarity index 100% rename from java/helloworld-service/deployment/service.yaml rename to grpc-mate-java/helloworld-service/deployment/service.yaml diff --git a/java/helloworld-service/src/main/java/io/datanerd/hello/server/GrpcServer.java b/grpc-mate-java/helloworld-service/src/main/java/io/datanerd/hello/server/GrpcServer.java similarity index 100% rename from java/helloworld-service/src/main/java/io/datanerd/hello/server/GrpcServer.java rename to grpc-mate-java/helloworld-service/src/main/java/io/datanerd/hello/server/GrpcServer.java diff --git a/java/helloworld-service/src/main/java/io/datanerd/hello/server/ServiceLauncher.java b/grpc-mate-java/helloworld-service/src/main/java/io/datanerd/hello/server/ServiceLauncher.java similarity index 100% rename from java/helloworld-service/src/main/java/io/datanerd/hello/server/ServiceLauncher.java rename to grpc-mate-java/helloworld-service/src/main/java/io/datanerd/hello/server/ServiceLauncher.java diff --git a/java/helloworld-service/src/main/java/io/datanerd/hello/service/GreeterService.java b/grpc-mate-java/helloworld-service/src/main/java/io/datanerd/hello/service/GreeterService.java similarity index 100% rename from java/helloworld-service/src/main/java/io/datanerd/hello/service/GreeterService.java rename to grpc-mate-java/helloworld-service/src/main/java/io/datanerd/hello/service/GreeterService.java diff --git a/java/helloworld-service/src/main/proto/grpc_mate/helloworld.proto b/grpc-mate-java/helloworld-service/src/main/proto/grpc_mate/helloworld.proto similarity index 100% rename from java/helloworld-service/src/main/proto/grpc_mate/helloworld.proto rename to grpc-mate-java/helloworld-service/src/main/proto/grpc_mate/helloworld.proto diff --git a/java/helloworld-service/src/main/resources/logback.xml b/grpc-mate-java/helloworld-service/src/main/resources/logback.xml similarity index 100% rename from java/helloworld-service/src/main/resources/logback.xml rename to grpc-mate-java/helloworld-service/src/main/resources/logback.xml diff --git a/java/helloworld-service/src/test/java/io/datanerd/hello/service/GreeterServiceTest.java b/grpc-mate-java/helloworld-service/src/test/java/io/datanerd/hello/service/GreeterServiceTest.java similarity index 100% rename from java/helloworld-service/src/test/java/io/datanerd/hello/service/GreeterServiceTest.java rename to grpc-mate-java/helloworld-service/src/test/java/io/datanerd/hello/service/GreeterServiceTest.java diff --git a/java/settings.gradle b/grpc-mate-java/settings.gradle similarity index 100% rename from java/settings.gradle rename to grpc-mate-java/settings.gradle diff --git a/java/shippable.yml b/grpc-mate-java/shippable.yml similarity index 100% rename from java/shippable.yml rename to grpc-mate-java/shippable.yml diff --git a/grpc-mate-python/Pipfile b/grpc-mate-python/Pipfile new file mode 100644 index 0000000..02a82fe --- /dev/null +++ b/grpc-mate-python/Pipfile @@ -0,0 +1,14 @@ +[[source]] +name = "pypi" +url = "https://pypi.org/simple" +verify_ssl = true + +[dev-packages] + +[packages] +grpcio = "*" +grpcio-tools = "*" +protobuf = "*" + +[requires] +python_version = "3.6" diff --git a/grpc-mate-python/Pipfile.lock b/grpc-mate-python/Pipfile.lock new file mode 100644 index 0000000..179ba61 --- /dev/null +++ b/grpc-mate-python/Pipfile.lock @@ -0,0 +1,126 @@ +{ + "_meta": { + "hash": { + "sha256": "f4866f7ed86e41249fcf150afb9f7c5147f89f60b3dfcce7a26d981ee81ae061" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.6" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "grpcio": { + "hashes": [ + "sha256:1303578092f1f6e4bfbc354c04ac422856c393723d3ffa032fff0f7cb5cfd693", + "sha256:229c6b313cd82bec8f979b059d87f03cc1a48939b543fe170b5a9c5cf6a6bc69", + "sha256:3cd3d99a8b5568d0d186f9520c16121a0f2a4bcad8e2b9884b76fb88a85a7774", + "sha256:41cfb222db358227521f9638a6fbc397f310042a4db5539a19dea01547c621cd", + "sha256:43330501660f636fd6547d1e196e395cd1e2c2ae57d62219d6184a668ffebda0", + "sha256:45d7a2bd8b4f25a013296683f4140d636cdbb507d94a382ea5029a21e76b1648", + "sha256:47dc935658a13b25108823dabd010194ddea9610357c5c1ef1ad7b3f5157ebee", + "sha256:480aa7e2b56238badce0b9413a96d5b4c90c3bfbd79eba5a0501e92328d9669e", + "sha256:4a0934c8b0f97e1d8c18e76c45afc0d02d33ab03125258179f2ac6c7a13f3626", + "sha256:5624dab19e950f99e560400c59d87b685809e4cfcb2c724103f1ab14c06071f7", + "sha256:60515b1405bb3dadc55e6ca99429072dad3e736afcf5048db5452df5572231ff", + "sha256:610f97ebae742a57d336a69b09a9c7d7de1f62aa54aaa8adc635b38f55ba4382", + "sha256:64ea189b2b0859d1f7b411a09185028744d494ef09029630200cc892e366f169", + "sha256:686090c6c1e09e4f49585b8508d0a31d58bc3895e4049ea55b197d1381e9f70f", + "sha256:7745c365195bb0605e3d47b480a2a4d1baa8a41a5fd0a20de5fa48900e2c886a", + "sha256:79491e0d2b77a1c438116bf9e5f9e2e04e78b78524615e2ce453eff62db59a09", + "sha256:825177dd4c601c487836b7d6b4ba268db59787157911c623ba59a7c03c8d3adc", + "sha256:8a060e1f72fb94eee8a035ed29f1201ce903ad14cbe27bda56b4a22a8abda045", + "sha256:90168cc6353e2766e47b650c963f21cfff294654b10b3a14c67e26a4e3683634", + "sha256:94b7742734bceeff6d8db5edb31ac844cb68fc7f13617eca859ff1b78bb20ba1", + "sha256:962aebf2dd01bbb2cdb64580e61760f1afc470781f9ecd5fe8f3d8dcd8cf4556", + "sha256:9c8d9eacdce840b72eee7924c752c31b675f8aec74790e08cff184a4ea8aa9c1", + "sha256:af5b929debc336f6bab9b0da6915f9ee5e41444012aed6a79a3c7e80d7662fdf", + "sha256:b9cdb87fc77e9a3eabdc42a512368538d648fa0760ad30cf97788076985c790a", + "sha256:c5e6380b90b389454669dc67d0a39fb4dc166416e01308fcddd694236b8329ef", + "sha256:d60c90fe2bfbee735397bf75a2f2c4e70c5deab51cd40c6e4fa98fae018c8db6", + "sha256:d8582c8b1b1063249da1588854251d8a91df1e210a328aeb0ece39da2b2b763b", + "sha256:ddbf86ba3aa0ad8fed2867910d2913ee237d55920b55f1d619049b3399f04efc", + "sha256:e46bc0664c5c8a0545857aa7a096289f8db148e7f9cca2d0b760113e8994bddc", + "sha256:f6437f70ec7fed0ca3a0eef1146591bb754b418bb6c6b21db74f0333d624e135", + "sha256:f71693c3396530c6b00773b029ea85e59272557e9bd6077195a6593e4229892a", + "sha256:f79f7455f8fbd43e8e9d61914ecf7f48ba1c8e271801996fef8d6a8f3cc9f39f" + ], + "index": "pypi", + "version": "==1.23.0" + }, + "grpcio-tools": { + "hashes": [ + "sha256:056f2a274edda4315e825ac2e3a9536f5415b43aa51669196860c8de6e76d847", + "sha256:0c953251585fdcd422072e4b7f4243fce215f22e21db94ec83c5970e41db6e18", + "sha256:142a73f5769f37bf2e4a8e4a77ef60f7af5f55635f60428322b49c87bd8f9cc0", + "sha256:1b333e2a068d8ef89a01eb23a098d2a789659c3178de79da9bd3d0ffb944cc6d", + "sha256:2124f19cc51d63405a0204ae38ef355732ab0a235975ab41ff6f6f9701905432", + "sha256:24c3a04adfb6c6f1bc4a2f8498d7661ca296ae352b498e538832c22ddde7bf81", + "sha256:3a2054e9640cbdd0ce8a345afb86be52875c5a8f9f5973a5c64791a8002da2dd", + "sha256:3fd15a09eecef83440ac849dcda2ff522f8ee1603ebfcdbb0e9b320ef2012e41", + "sha256:457e7a7dfa0b6bb608a766edba6f20c9d626a790df802016b930ad242fec4470", + "sha256:49ad5661d54ff0d164e4b441ee5e05191187d497380afa16d36d72eb8ef048de", + "sha256:561078e425d21a6720c3c3828385d949e24c0765e2852a46ecc3ad3fca2706e5", + "sha256:5a4f65ab06b32dc34112ed114dee3b698c8463670474334ece5b0b531073804c", + "sha256:8883e0e34676356d219a4cd37d239c3ead655cc550836236b52068e091416fff", + "sha256:8d2b45b1faf81098780e07d6a1c207b328b07e913160b8baa7e2e8d89723e06c", + "sha256:b0ebddb6ecc4c161369f93bb3a74c6120a498d3ddc759b64679709a885dd6d4f", + "sha256:b786ba4842c50de865dd3885b5570690a743e84a327b7213dd440eb0e6b996f8", + "sha256:be8efa010f5a80f1862ead80c3b19b5eb97dc954a0f59a1e2487078576105e03", + "sha256:c29106eaff0e2e708a9a89628dc0134ef145d0d3631f0ef421c09f380c30e354", + "sha256:c3c71236a056ec961b2b8b3b7c0b3b5a826283bc69c4a1c6415d23b70fea8243", + "sha256:cbc35031ec2b29af36947d085a7fbbcd8b79b84d563adf6156103d82565f78db", + "sha256:d47307c22744918e803c1eec7263a14f36aaf34fe496bff9ccbcae67c02b40ae", + "sha256:db088c98e563c1bb070da5984c8df08b45b61e4d9c6d2a8a1ffeed2af89fd1f3", + "sha256:df4dd1cb670062abdacc1fbce41cae4e08a4a212d28dd94fdbbf90615d027f73", + "sha256:e3adcf1499ca08d1e036ff44aedf55ed78653d946f4c4426b6e72ab757cc4dec", + "sha256:e3b3e32e0cda4dc382ec5bed8599dab644e4b3fc66a9ab54eb58248e207880b9", + "sha256:ed524195b35304c670755efa1eca579e5c290a66981f97004a5b2c0d12d6897d", + "sha256:edb42432790b1f8ec9f08faf9326d7e5dfe6e1d8c8fe4db39abc0a49c1c76537", + "sha256:eff1f995e5aa4cc941b6bbc45b5b57842f8f62bbe1a99427281c2c70cf42312c", + "sha256:f2fcdc2669662d77b400f80e20315a3661466e3cb3df1730f8083f9e49465cbc", + "sha256:f52ec9926daf48f41389d39d01570967b99c7dbc12bffc134cc3a3c5b5540ba2", + "sha256:fd007d67fdfbd2a13bf8a8c8ced8353b42a92ca72dbee54e951d8ddbc6ca12bc", + "sha256:ff9045e928dbb7943ea8559bfabebee95a43a830e00bf52c16202d2d805780fb" + ], + "index": "pypi", + "version": "==1.23.0" + }, + "protobuf": { + "hashes": [ + "sha256:00a1b0b352dc7c809749526d1688a64b62ea400c5b05416f93cfb1b11a036295", + "sha256:01acbca2d2c8c3f7f235f1842440adbe01bbc379fa1cbdd80753801432b3fae9", + "sha256:0a795bca65987b62d6b8a2d934aa317fd1a4d06a6dd4df36312f5b0ade44a8d9", + "sha256:0ec035114213b6d6e7713987a759d762dd94e9f82284515b3b7331f34bfaec7f", + "sha256:31b18e1434b4907cb0113e7a372cd4d92c047ce7ba0fa7ea66a404d6388ed2c1", + "sha256:32a3abf79b0bef073c70656e86d5bd68a28a1fbb138429912c4fc07b9d426b07", + "sha256:55f85b7808766e5e3f526818f5e2aeb5ba2edcc45bcccede46a3ccc19b569cb0", + "sha256:64ab9bc971989cbdd648c102a96253fdf0202b0c38f15bd34759a8707bdd5f64", + "sha256:64cf847e843a465b6c1ba90fb6c7f7844d54dbe9eb731e86a60981d03f5b2e6e", + "sha256:917c8662b585470e8fd42f052661fc66d59fccaae450a60044307dcbf82a3335", + "sha256:afed9003d7f2be2c3df20f64220c30faec441073731511728a2cb4cab4cd46a6", + "sha256:bf8e05d638b585d1752c5a84247134a0350d3a8b73d3632489a014a9f6f1e758", + "sha256:d831b047bd69becaf64019a47179eb22118a50dd008340655266a906c69c6417", + "sha256:de2760583ed28749ff885789c1cbc6c9c06d6de92fc825740ab99deb2f25ea4d", + "sha256:eabc4cf1bc19689af8022ba52fd668564a8d96e0d08f3b4732d26a64255216a4", + "sha256:fcff6086c86fb1628d94ea455c7b9de898afc50378042927a59df8065a79a549" + ], + "index": "pypi", + "version": "==3.9.1" + }, + "six": { + "hashes": [ + "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", + "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" + ], + "version": "==1.12.0" + } + }, + "develop": {} +} From 9c8d843990fa13b0b8af2b03662ae5dd00402e1e Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 19 Oct 2019 14:09:56 +0800 Subject: [PATCH 04/50] add instruction --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index e01c9c5..addc220 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ gRPC-Mate - An enterprise ready micro service project base on [gRPC](https://grpc.io/) ======================================== -for java based project, please check out +for java based project, please check out [grpc-mate-java](https://github.com/email2liyang/grpc-mate/tree/master/grpc-mate-java) +for python based project, please check out [grpc-mate-python](https://github.com/email2liyang/grpc-mate/tree/master/grpc-mate-python) From d3beb72a07f02c1d94be3c95ebc03d9bccee21dd Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 19 Oct 2019 14:10:36 +0800 Subject: [PATCH 05/50] format --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index addc220..c5b65d8 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ gRPC-Mate - An enterprise ready micro service project base on [gRPC](https://grpc.io/) ======================================== -for java based project, please check out [grpc-mate-java](https://github.com/email2liyang/grpc-mate/tree/master/grpc-mate-java) -for python based project, please check out [grpc-mate-python](https://github.com/email2liyang/grpc-mate/tree/master/grpc-mate-python) + +* for java based project, please check out [grpc-mate-java](https://github.com/email2liyang/grpc-mate/tree/master/grpc-mate-java) +* for python based project, please check out [grpc-mate-python](https://github.com/email2liyang/grpc-mate/tree/master/grpc-mate-python) From eb670e0f4be5c7b0055f282ca37c189890420ff7 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 19 Oct 2019 14:45:21 +0800 Subject: [PATCH 06/50] add grpc stub --- grpc-mate-python/Makefile | 7 + grpc-mate-python/grpc_mate/__init__.py | 0 grpc-mate-python/grpc_mate/helloworld_pb2.py | 134 +++++ .../grpc_mate/helloworld_pb2_grpc.py | 46 ++ .../grpc_mate/product_common_pb2.py | 166 ++++++ .../grpc_mate/product_common_pb2_grpc.py | 3 + .../grpc_mate/product_search_engine_pb2.py | 487 ++++++++++++++++++ .../product_search_engine_pb2_grpc.py | 186 +++++++ grpc-mate-python/protobuffers/google | 1 + grpc-mate-python/protobuffers/grpc_mate | 1 + 10 files changed, 1031 insertions(+) create mode 100644 grpc-mate-python/Makefile create mode 100644 grpc-mate-python/grpc_mate/__init__.py create mode 100644 grpc-mate-python/grpc_mate/helloworld_pb2.py create mode 100644 grpc-mate-python/grpc_mate/helloworld_pb2_grpc.py create mode 100644 grpc-mate-python/grpc_mate/product_common_pb2.py create mode 100644 grpc-mate-python/grpc_mate/product_common_pb2_grpc.py create mode 100644 grpc-mate-python/grpc_mate/product_search_engine_pb2.py create mode 100644 grpc-mate-python/grpc_mate/product_search_engine_pb2_grpc.py create mode 120000 grpc-mate-python/protobuffers/google create mode 120000 grpc-mate-python/protobuffers/grpc_mate diff --git a/grpc-mate-python/Makefile b/grpc-mate-python/Makefile new file mode 100644 index 0000000..d6e6835 --- /dev/null +++ b/grpc-mate-python/Makefile @@ -0,0 +1,7 @@ +freeze: + pipenv lock -r > requirements.txt + +protoc: + rm -fR grpc_mate/* && \ + python -m grpc_tools.protoc -Iprotobuffers --python_out=. --grpc_python_out=. protobuffers/grpc_mate/*.proto && \ + touch grpc_mate/__init__.py \ No newline at end of file diff --git a/grpc-mate-python/grpc_mate/__init__.py b/grpc-mate-python/grpc_mate/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/grpc-mate-python/grpc_mate/helloworld_pb2.py b/grpc-mate-python/grpc_mate/helloworld_pb2.py new file mode 100644 index 0000000..ac9e530 --- /dev/null +++ b/grpc-mate-python/grpc_mate/helloworld_pb2.py @@ -0,0 +1,134 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: grpc_mate/helloworld.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='grpc_mate/helloworld.proto', + package='', + syntax='proto3', + serialized_options=_b('\n io.datanerd.generated.helloworldP\001'), + serialized_pb=_b('\n\x1agrpc_mate/helloworld.proto\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t23\n\x07Greeter\x12(\n\x08SayHello\x12\r.HelloRequest\x1a\x0b.HelloReply\"\x00\x42$\n io.datanerd.generated.helloworldP\x01\x62\x06proto3') +) + + + + +_HELLOREQUEST = _descriptor.Descriptor( + name='HelloRequest', + full_name='HelloRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='name', full_name='HelloRequest.name', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=30, + serialized_end=58, +) + + +_HELLOREPLY = _descriptor.Descriptor( + name='HelloReply', + full_name='HelloReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='message', full_name='HelloReply.message', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=60, + serialized_end=89, +) + +DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST +DESCRIPTOR.message_types_by_name['HelloReply'] = _HELLOREPLY +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HelloRequest = _reflection.GeneratedProtocolMessageType('HelloRequest', (_message.Message,), { + 'DESCRIPTOR' : _HELLOREQUEST, + '__module__' : 'grpc_mate.helloworld_pb2' + # @@protoc_insertion_point(class_scope:HelloRequest) + }) +_sym_db.RegisterMessage(HelloRequest) + +HelloReply = _reflection.GeneratedProtocolMessageType('HelloReply', (_message.Message,), { + 'DESCRIPTOR' : _HELLOREPLY, + '__module__' : 'grpc_mate.helloworld_pb2' + # @@protoc_insertion_point(class_scope:HelloReply) + }) +_sym_db.RegisterMessage(HelloReply) + + +DESCRIPTOR._options = None + +_GREETER = _descriptor.ServiceDescriptor( + name='Greeter', + full_name='Greeter', + file=DESCRIPTOR, + index=0, + serialized_options=None, + serialized_start=91, + serialized_end=142, + methods=[ + _descriptor.MethodDescriptor( + name='SayHello', + full_name='Greeter.SayHello', + index=0, + containing_service=None, + input_type=_HELLOREQUEST, + output_type=_HELLOREPLY, + serialized_options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_GREETER) + +DESCRIPTOR.services_by_name['Greeter'] = _GREETER + +# @@protoc_insertion_point(module_scope) diff --git a/grpc-mate-python/grpc_mate/helloworld_pb2_grpc.py b/grpc-mate-python/grpc_mate/helloworld_pb2_grpc.py new file mode 100644 index 0000000..256ecc5 --- /dev/null +++ b/grpc-mate-python/grpc_mate/helloworld_pb2_grpc.py @@ -0,0 +1,46 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +from grpc_mate import helloworld_pb2 as grpc__mate_dot_helloworld__pb2 + + +class GreeterStub(object): + """The greeting service definition. + """ + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.SayHello = channel.unary_unary( + '/Greeter/SayHello', + request_serializer=grpc__mate_dot_helloworld__pb2.HelloRequest.SerializeToString, + response_deserializer=grpc__mate_dot_helloworld__pb2.HelloReply.FromString, + ) + + +class GreeterServicer(object): + """The greeting service definition. + """ + + def SayHello(self, request, context): + """Sends a greeting + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_GreeterServicer_to_server(servicer, server): + rpc_method_handlers = { + 'SayHello': grpc.unary_unary_rpc_method_handler( + servicer.SayHello, + request_deserializer=grpc__mate_dot_helloworld__pb2.HelloRequest.FromString, + response_serializer=grpc__mate_dot_helloworld__pb2.HelloReply.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'Greeter', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/grpc-mate-python/grpc_mate/product_common_pb2.py b/grpc-mate-python/grpc_mate/product_common_pb2.py new file mode 100644 index 0000000..1c49cc3 --- /dev/null +++ b/grpc-mate-python/grpc_mate/product_common_pb2.py @@ -0,0 +1,166 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: grpc_mate/product_common.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='grpc_mate/product_common.proto', + package='', + syntax='proto3', + serialized_options=_b('\n\034io.datanerd.generated.commonP\001Z\010datanerd'), + serialized_pb=_b('\n\x1egrpc_mate/product_common.proto\"\x84\x01\n\x07Product\x12\x12\n\nproduct_id\x18\x01 \x01(\x03\x12\x14\n\x0cproduct_name\x18\x02 \x01(\t\x12\x15\n\rproduct_price\x18\x03 \x01(\x01\x12&\n\x0eproduct_status\x18\x04 \x01(\x0e\x32\x0e.ProductStatus\x12\x10\n\x08\x63\x61tegory\x18\x05 \x01(\t\"\x19\n\tDataChunk\x12\x0c\n\x04\x64\x61ta\x18\x01 \x01(\x0c**\n\rProductStatus\x12\x0b\n\x07InStock\x10\x00\x12\x0c\n\x08OutStock\x10\x01\x42*\n\x1cio.datanerd.generated.commonP\x01Z\x08\x64\x61tanerdb\x06proto3') +) + +_PRODUCTSTATUS = _descriptor.EnumDescriptor( + name='ProductStatus', + full_name='ProductStatus', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='InStock', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='OutStock', index=1, number=1, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=196, + serialized_end=238, +) +_sym_db.RegisterEnumDescriptor(_PRODUCTSTATUS) + +ProductStatus = enum_type_wrapper.EnumTypeWrapper(_PRODUCTSTATUS) +InStock = 0 +OutStock = 1 + + + +_PRODUCT = _descriptor.Descriptor( + name='Product', + full_name='Product', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='product_id', full_name='Product.product_id', index=0, + number=1, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='product_name', full_name='Product.product_name', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='product_price', full_name='Product.product_price', index=2, + number=3, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='product_status', full_name='Product.product_status', index=3, + number=4, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='category', full_name='Product.category', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=35, + serialized_end=167, +) + + +_DATACHUNK = _descriptor.Descriptor( + name='DataChunk', + full_name='DataChunk', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='data', full_name='DataChunk.data', index=0, + number=1, type=12, cpp_type=9, label=1, + has_default_value=False, default_value=_b(""), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=169, + serialized_end=194, +) + +_PRODUCT.fields_by_name['product_status'].enum_type = _PRODUCTSTATUS +DESCRIPTOR.message_types_by_name['Product'] = _PRODUCT +DESCRIPTOR.message_types_by_name['DataChunk'] = _DATACHUNK +DESCRIPTOR.enum_types_by_name['ProductStatus'] = _PRODUCTSTATUS +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Product = _reflection.GeneratedProtocolMessageType('Product', (_message.Message,), { + 'DESCRIPTOR' : _PRODUCT, + '__module__' : 'grpc_mate.product_common_pb2' + # @@protoc_insertion_point(class_scope:Product) + }) +_sym_db.RegisterMessage(Product) + +DataChunk = _reflection.GeneratedProtocolMessageType('DataChunk', (_message.Message,), { + 'DESCRIPTOR' : _DATACHUNK, + '__module__' : 'grpc_mate.product_common_pb2' + # @@protoc_insertion_point(class_scope:DataChunk) + }) +_sym_db.RegisterMessage(DataChunk) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/grpc-mate-python/grpc_mate/product_common_pb2_grpc.py b/grpc-mate-python/grpc_mate/product_common_pb2_grpc.py new file mode 100644 index 0000000..a894352 --- /dev/null +++ b/grpc-mate-python/grpc_mate/product_common_pb2_grpc.py @@ -0,0 +1,3 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + diff --git a/grpc-mate-python/grpc_mate/product_search_engine_pb2.py b/grpc-mate-python/grpc_mate/product_search_engine_pb2.py new file mode 100644 index 0000000..9745ea8 --- /dev/null +++ b/grpc-mate-python/grpc_mate/product_search_engine_pb2.py @@ -0,0 +1,487 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: grpc_mate/product_search_engine.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from grpc_mate import product_common_pb2 as grpc__mate_dot_product__common__pb2 +from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='grpc_mate/product_search_engine.proto', + package='', + syntax='proto3', + serialized_options=_b('\n\030io.datanerd.generated.esP\001Z\010datanerd'), + serialized_pb=_b('\n%grpc_mate/product_search_engine.proto\x1a\x1egrpc_mate/product_common.proto\x1a\x1cgoogle/api/annotations.proto\"|\n\x15UploadProductResponse\x12:\n\rresult_status\x18\x01 \x01(\x0e\x32#.UploadProductResponse.ResultStatus\"\'\n\x0cResultStatus\x12\x0b\n\x07SUCCESS\x10\x00\x12\n\n\x06\x46\x41ILED\x10\x01\"1\n\x1b\x44ownloadProductImageRequest\x12\x12\n\nproduct_id\x18\x01 \x01(\x03\"+\n\x17\x44ownloadProductsRequest\x12\x10\n\x08\x63\x61tegory\x18\x01 \x01(\t\"8\n\x15SearchProductsRequest\x12\x10\n\x08key_word\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x05\"4\n\x16SearchProductsResponse\x12\x1a\n\x08products\x18\x01 \x03(\x0b\x32\x08.Product\"I\n\x1d\x43\x61lculateProductScoreResponse\x12\x19\n\x07product\x18\x01 \x01(\x0b\x32\x08.Product\x12\r\n\x05score\x18\x02 \x01(\x03\"\x1b\n\x0b\x45\x63hoRequest\x12\x0c\n\x04ping\x18\x01 \x01(\t\"\x1c\n\x0c\x45\x63hoResponse\x12\x0c\n\x04pong\x18\x02 \x01(\t2M\n\x14ProductUpdateService\x12\x35\n\rUploadProduct\x12\x08.Product\x1a\x16.UploadProductResponse\"\x00(\x01\x32\xa4\x02\n\x12ProductReadService\x12:\n\x10\x44ownloadProducts\x12\x18.DownloadProductsRequest\x1a\x08.Product\"\x00\x30\x01\x12\x43\n\x0eSearchProducts\x12\x16.SearchProductsRequest\x1a\x17.SearchProductsResponse\"\x00\x12G\n\x15\x43\x61lculateProductScore\x12\x08.Product\x1a\x1e.CalculateProductScoreResponse\"\x00(\x01\x30\x01\x12\x44\n\x14\x44ownloadProductImage\x12\x1c.DownloadProductImageRequest\x1a\n.DataChunk\"\x00\x30\x01\x32P\n\x0b\x45\x63hoService\x12\x41\n\x04\x45\x63ho\x12\x0c.EchoRequest\x1a\r.EchoResponse\"\x1c\x82\xd3\xe4\x93\x02\x16\"\x11/grpc/api/v1/echo:\x01*B&\n\x18io.datanerd.generated.esP\x01Z\x08\x64\x61tanerdb\x06proto3') + , + dependencies=[grpc__mate_dot_product__common__pb2.DESCRIPTOR,google_dot_api_dot_annotations__pb2.DESCRIPTOR,]) + + + +_UPLOADPRODUCTRESPONSE_RESULTSTATUS = _descriptor.EnumDescriptor( + name='ResultStatus', + full_name='UploadProductResponse.ResultStatus', + filename=None, + file=DESCRIPTOR, + values=[ + _descriptor.EnumValueDescriptor( + name='SUCCESS', index=0, number=0, + serialized_options=None, + type=None), + _descriptor.EnumValueDescriptor( + name='FAILED', index=1, number=1, + serialized_options=None, + type=None), + ], + containing_type=None, + serialized_options=None, + serialized_start=188, + serialized_end=227, +) +_sym_db.RegisterEnumDescriptor(_UPLOADPRODUCTRESPONSE_RESULTSTATUS) + + +_UPLOADPRODUCTRESPONSE = _descriptor.Descriptor( + name='UploadProductResponse', + full_name='UploadProductResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='result_status', full_name='UploadProductResponse.result_status', index=0, + number=1, type=14, cpp_type=8, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + _UPLOADPRODUCTRESPONSE_RESULTSTATUS, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=103, + serialized_end=227, +) + + +_DOWNLOADPRODUCTIMAGEREQUEST = _descriptor.Descriptor( + name='DownloadProductImageRequest', + full_name='DownloadProductImageRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='product_id', full_name='DownloadProductImageRequest.product_id', index=0, + number=1, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=229, + serialized_end=278, +) + + +_DOWNLOADPRODUCTSREQUEST = _descriptor.Descriptor( + name='DownloadProductsRequest', + full_name='DownloadProductsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='category', full_name='DownloadProductsRequest.category', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=280, + serialized_end=323, +) + + +_SEARCHPRODUCTSREQUEST = _descriptor.Descriptor( + name='SearchProductsRequest', + full_name='SearchProductsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='key_word', full_name='SearchProductsRequest.key_word', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='limit', full_name='SearchProductsRequest.limit', index=1, + number=2, type=5, cpp_type=1, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=325, + serialized_end=381, +) + + +_SEARCHPRODUCTSRESPONSE = _descriptor.Descriptor( + name='SearchProductsResponse', + full_name='SearchProductsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='products', full_name='SearchProductsResponse.products', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=383, + serialized_end=435, +) + + +_CALCULATEPRODUCTSCORERESPONSE = _descriptor.Descriptor( + name='CalculateProductScoreResponse', + full_name='CalculateProductScoreResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='product', full_name='CalculateProductScoreResponse.product', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='score', full_name='CalculateProductScoreResponse.score', index=1, + number=2, type=3, cpp_type=2, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=437, + serialized_end=510, +) + + +_ECHOREQUEST = _descriptor.Descriptor( + name='EchoRequest', + full_name='EchoRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='ping', full_name='EchoRequest.ping', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=512, + serialized_end=539, +) + + +_ECHORESPONSE = _descriptor.Descriptor( + name='EchoResponse', + full_name='EchoResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='pong', full_name='EchoResponse.pong', index=0, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=541, + serialized_end=569, +) + +_UPLOADPRODUCTRESPONSE.fields_by_name['result_status'].enum_type = _UPLOADPRODUCTRESPONSE_RESULTSTATUS +_UPLOADPRODUCTRESPONSE_RESULTSTATUS.containing_type = _UPLOADPRODUCTRESPONSE +_SEARCHPRODUCTSRESPONSE.fields_by_name['products'].message_type = grpc__mate_dot_product__common__pb2._PRODUCT +_CALCULATEPRODUCTSCORERESPONSE.fields_by_name['product'].message_type = grpc__mate_dot_product__common__pb2._PRODUCT +DESCRIPTOR.message_types_by_name['UploadProductResponse'] = _UPLOADPRODUCTRESPONSE +DESCRIPTOR.message_types_by_name['DownloadProductImageRequest'] = _DOWNLOADPRODUCTIMAGEREQUEST +DESCRIPTOR.message_types_by_name['DownloadProductsRequest'] = _DOWNLOADPRODUCTSREQUEST +DESCRIPTOR.message_types_by_name['SearchProductsRequest'] = _SEARCHPRODUCTSREQUEST +DESCRIPTOR.message_types_by_name['SearchProductsResponse'] = _SEARCHPRODUCTSRESPONSE +DESCRIPTOR.message_types_by_name['CalculateProductScoreResponse'] = _CALCULATEPRODUCTSCORERESPONSE +DESCRIPTOR.message_types_by_name['EchoRequest'] = _ECHOREQUEST +DESCRIPTOR.message_types_by_name['EchoResponse'] = _ECHORESPONSE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +UploadProductResponse = _reflection.GeneratedProtocolMessageType('UploadProductResponse', (_message.Message,), { + 'DESCRIPTOR' : _UPLOADPRODUCTRESPONSE, + '__module__' : 'grpc_mate.product_search_engine_pb2' + # @@protoc_insertion_point(class_scope:UploadProductResponse) + }) +_sym_db.RegisterMessage(UploadProductResponse) + +DownloadProductImageRequest = _reflection.GeneratedProtocolMessageType('DownloadProductImageRequest', (_message.Message,), { + 'DESCRIPTOR' : _DOWNLOADPRODUCTIMAGEREQUEST, + '__module__' : 'grpc_mate.product_search_engine_pb2' + # @@protoc_insertion_point(class_scope:DownloadProductImageRequest) + }) +_sym_db.RegisterMessage(DownloadProductImageRequest) + +DownloadProductsRequest = _reflection.GeneratedProtocolMessageType('DownloadProductsRequest', (_message.Message,), { + 'DESCRIPTOR' : _DOWNLOADPRODUCTSREQUEST, + '__module__' : 'grpc_mate.product_search_engine_pb2' + # @@protoc_insertion_point(class_scope:DownloadProductsRequest) + }) +_sym_db.RegisterMessage(DownloadProductsRequest) + +SearchProductsRequest = _reflection.GeneratedProtocolMessageType('SearchProductsRequest', (_message.Message,), { + 'DESCRIPTOR' : _SEARCHPRODUCTSREQUEST, + '__module__' : 'grpc_mate.product_search_engine_pb2' + # @@protoc_insertion_point(class_scope:SearchProductsRequest) + }) +_sym_db.RegisterMessage(SearchProductsRequest) + +SearchProductsResponse = _reflection.GeneratedProtocolMessageType('SearchProductsResponse', (_message.Message,), { + 'DESCRIPTOR' : _SEARCHPRODUCTSRESPONSE, + '__module__' : 'grpc_mate.product_search_engine_pb2' + # @@protoc_insertion_point(class_scope:SearchProductsResponse) + }) +_sym_db.RegisterMessage(SearchProductsResponse) + +CalculateProductScoreResponse = _reflection.GeneratedProtocolMessageType('CalculateProductScoreResponse', (_message.Message,), { + 'DESCRIPTOR' : _CALCULATEPRODUCTSCORERESPONSE, + '__module__' : 'grpc_mate.product_search_engine_pb2' + # @@protoc_insertion_point(class_scope:CalculateProductScoreResponse) + }) +_sym_db.RegisterMessage(CalculateProductScoreResponse) + +EchoRequest = _reflection.GeneratedProtocolMessageType('EchoRequest', (_message.Message,), { + 'DESCRIPTOR' : _ECHOREQUEST, + '__module__' : 'grpc_mate.product_search_engine_pb2' + # @@protoc_insertion_point(class_scope:EchoRequest) + }) +_sym_db.RegisterMessage(EchoRequest) + +EchoResponse = _reflection.GeneratedProtocolMessageType('EchoResponse', (_message.Message,), { + 'DESCRIPTOR' : _ECHORESPONSE, + '__module__' : 'grpc_mate.product_search_engine_pb2' + # @@protoc_insertion_point(class_scope:EchoResponse) + }) +_sym_db.RegisterMessage(EchoResponse) + + +DESCRIPTOR._options = None + +_PRODUCTUPDATESERVICE = _descriptor.ServiceDescriptor( + name='ProductUpdateService', + full_name='ProductUpdateService', + file=DESCRIPTOR, + index=0, + serialized_options=None, + serialized_start=571, + serialized_end=648, + methods=[ + _descriptor.MethodDescriptor( + name='UploadProduct', + full_name='ProductUpdateService.UploadProduct', + index=0, + containing_service=None, + input_type=grpc__mate_dot_product__common__pb2._PRODUCT, + output_type=_UPLOADPRODUCTRESPONSE, + serialized_options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_PRODUCTUPDATESERVICE) + +DESCRIPTOR.services_by_name['ProductUpdateService'] = _PRODUCTUPDATESERVICE + + +_PRODUCTREADSERVICE = _descriptor.ServiceDescriptor( + name='ProductReadService', + full_name='ProductReadService', + file=DESCRIPTOR, + index=1, + serialized_options=None, + serialized_start=651, + serialized_end=943, + methods=[ + _descriptor.MethodDescriptor( + name='DownloadProducts', + full_name='ProductReadService.DownloadProducts', + index=0, + containing_service=None, + input_type=_DOWNLOADPRODUCTSREQUEST, + output_type=grpc__mate_dot_product__common__pb2._PRODUCT, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='SearchProducts', + full_name='ProductReadService.SearchProducts', + index=1, + containing_service=None, + input_type=_SEARCHPRODUCTSREQUEST, + output_type=_SEARCHPRODUCTSRESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='CalculateProductScore', + full_name='ProductReadService.CalculateProductScore', + index=2, + containing_service=None, + input_type=grpc__mate_dot_product__common__pb2._PRODUCT, + output_type=_CALCULATEPRODUCTSCORERESPONSE, + serialized_options=None, + ), + _descriptor.MethodDescriptor( + name='DownloadProductImage', + full_name='ProductReadService.DownloadProductImage', + index=3, + containing_service=None, + input_type=_DOWNLOADPRODUCTIMAGEREQUEST, + output_type=grpc__mate_dot_product__common__pb2._DATACHUNK, + serialized_options=None, + ), +]) +_sym_db.RegisterServiceDescriptor(_PRODUCTREADSERVICE) + +DESCRIPTOR.services_by_name['ProductReadService'] = _PRODUCTREADSERVICE + + +_ECHOSERVICE = _descriptor.ServiceDescriptor( + name='EchoService', + full_name='EchoService', + file=DESCRIPTOR, + index=2, + serialized_options=None, + serialized_start=945, + serialized_end=1025, + methods=[ + _descriptor.MethodDescriptor( + name='Echo', + full_name='EchoService.Echo', + index=0, + containing_service=None, + input_type=_ECHOREQUEST, + output_type=_ECHORESPONSE, + serialized_options=_b('\202\323\344\223\002\026\"\021/grpc/api/v1/echo:\001*'), + ), +]) +_sym_db.RegisterServiceDescriptor(_ECHOSERVICE) + +DESCRIPTOR.services_by_name['EchoService'] = _ECHOSERVICE + +# @@protoc_insertion_point(module_scope) diff --git a/grpc-mate-python/grpc_mate/product_search_engine_pb2_grpc.py b/grpc-mate-python/grpc_mate/product_search_engine_pb2_grpc.py new file mode 100644 index 0000000..9fbf202 --- /dev/null +++ b/grpc-mate-python/grpc_mate/product_search_engine_pb2_grpc.py @@ -0,0 +1,186 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + +from grpc_mate import product_common_pb2 as grpc__mate_dot_product__common__pb2 +from grpc_mate import product_search_engine_pb2 as grpc__mate_dot_product__search__engine__pb2 + + +class ProductUpdateServiceStub(object): + # missing associated documentation comment in .proto file + pass + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.UploadProduct = channel.stream_unary( + '/ProductUpdateService/UploadProduct', + request_serializer=grpc__mate_dot_product__common__pb2.Product.SerializeToString, + response_deserializer=grpc__mate_dot_product__search__engine__pb2.UploadProductResponse.FromString, + ) + + +class ProductUpdateServiceServicer(object): + # missing associated documentation comment in .proto file + pass + + def UploadProduct(self, request_iterator, context): + """upload product into elastic search , make it so that we could search on it + used to demo client side stream + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_ProductUpdateServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'UploadProduct': grpc.stream_unary_rpc_method_handler( + servicer.UploadProduct, + request_deserializer=grpc__mate_dot_product__common__pb2.Product.FromString, + response_serializer=grpc__mate_dot_product__search__engine__pb2.UploadProductResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'ProductUpdateService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + +class ProductReadServiceStub(object): + # missing associated documentation comment in .proto file + pass + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.DownloadProducts = channel.unary_stream( + '/ProductReadService/DownloadProducts', + request_serializer=grpc__mate_dot_product__search__engine__pb2.DownloadProductsRequest.SerializeToString, + response_deserializer=grpc__mate_dot_product__common__pb2.Product.FromString, + ) + self.SearchProducts = channel.unary_unary( + '/ProductReadService/SearchProducts', + request_serializer=grpc__mate_dot_product__search__engine__pb2.SearchProductsRequest.SerializeToString, + response_deserializer=grpc__mate_dot_product__search__engine__pb2.SearchProductsResponse.FromString, + ) + self.CalculateProductScore = channel.stream_stream( + '/ProductReadService/CalculateProductScore', + request_serializer=grpc__mate_dot_product__common__pb2.Product.SerializeToString, + response_deserializer=grpc__mate_dot_product__search__engine__pb2.CalculateProductScoreResponse.FromString, + ) + self.DownloadProductImage = channel.unary_stream( + '/ProductReadService/DownloadProductImage', + request_serializer=grpc__mate_dot_product__search__engine__pb2.DownloadProductImageRequest.SerializeToString, + response_deserializer=grpc__mate_dot_product__common__pb2.DataChunk.FromString, + ) + + +class ProductReadServiceServicer(object): + # missing associated documentation comment in .proto file + pass + + def DownloadProducts(self, request, context): + """download product by category + used to demo server side stream + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def SearchProducts(self, request, context): + """search product and return all matched products + used to demo simple grpc call + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def CalculateProductScore(self, request_iterator, context): + """calcualte each proeuct sore based on simple rule + used to demo bi directional stream + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DownloadProductImage(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_ProductReadServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'DownloadProducts': grpc.unary_stream_rpc_method_handler( + servicer.DownloadProducts, + request_deserializer=grpc__mate_dot_product__search__engine__pb2.DownloadProductsRequest.FromString, + response_serializer=grpc__mate_dot_product__common__pb2.Product.SerializeToString, + ), + 'SearchProducts': grpc.unary_unary_rpc_method_handler( + servicer.SearchProducts, + request_deserializer=grpc__mate_dot_product__search__engine__pb2.SearchProductsRequest.FromString, + response_serializer=grpc__mate_dot_product__search__engine__pb2.SearchProductsResponse.SerializeToString, + ), + 'CalculateProductScore': grpc.stream_stream_rpc_method_handler( + servicer.CalculateProductScore, + request_deserializer=grpc__mate_dot_product__common__pb2.Product.FromString, + response_serializer=grpc__mate_dot_product__search__engine__pb2.CalculateProductScoreResponse.SerializeToString, + ), + 'DownloadProductImage': grpc.unary_stream_rpc_method_handler( + servicer.DownloadProductImage, + request_deserializer=grpc__mate_dot_product__search__engine__pb2.DownloadProductImageRequest.FromString, + response_serializer=grpc__mate_dot_product__common__pb2.DataChunk.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'ProductReadService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) + + +class EchoServiceStub(object): + # missing associated documentation comment in .proto file + pass + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.Echo = channel.unary_unary( + '/EchoService/Echo', + request_serializer=grpc__mate_dot_product__search__engine__pb2.EchoRequest.SerializeToString, + response_deserializer=grpc__mate_dot_product__search__engine__pb2.EchoResponse.FromString, + ) + + +class EchoServiceServicer(object): + # missing associated documentation comment in .proto file + pass + + def Echo(self, request, context): + # missing associated documentation comment in .proto file + pass + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + +def add_EchoServiceServicer_to_server(servicer, server): + rpc_method_handlers = { + 'Echo': grpc.unary_unary_rpc_method_handler( + servicer.Echo, + request_deserializer=grpc__mate_dot_product__search__engine__pb2.EchoRequest.FromString, + response_serializer=grpc__mate_dot_product__search__engine__pb2.EchoResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + 'EchoService', rpc_method_handlers) + server.add_generic_rpc_handlers((generic_handler,)) diff --git a/grpc-mate-python/protobuffers/google b/grpc-mate-python/protobuffers/google new file mode 120000 index 0000000..f4559ed --- /dev/null +++ b/grpc-mate-python/protobuffers/google @@ -0,0 +1 @@ +../../protobuffers/google \ No newline at end of file diff --git a/grpc-mate-python/protobuffers/grpc_mate b/grpc-mate-python/protobuffers/grpc_mate new file mode 120000 index 0000000..8141156 --- /dev/null +++ b/grpc-mate-python/protobuffers/grpc_mate @@ -0,0 +1 @@ +../../protobuffers/grpc_mate \ No newline at end of file From c09380b697eb7445ed25f7404efd454da2f53f0f Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 19 Oct 2019 14:53:33 +0800 Subject: [PATCH 07/50] generate google --- grpc-mate-python/Makefile | 7 +- grpc-mate-python/google/__init__.py | 0 grpc-mate-python/google/api/__init__.py | 0 .../google/api/annotations_pb2.py | 46 ++++ .../google/api/annotations_pb2_grpc.py | 3 + grpc-mate-python/google/api/http_pb2.py | 236 ++++++++++++++++++ grpc-mate-python/google/api/http_pb2_grpc.py | 3 + 7 files changed, 293 insertions(+), 2 deletions(-) create mode 100644 grpc-mate-python/google/__init__.py create mode 100644 grpc-mate-python/google/api/__init__.py create mode 100644 grpc-mate-python/google/api/annotations_pb2.py create mode 100644 grpc-mate-python/google/api/annotations_pb2_grpc.py create mode 100644 grpc-mate-python/google/api/http_pb2.py create mode 100644 grpc-mate-python/google/api/http_pb2_grpc.py diff --git a/grpc-mate-python/Makefile b/grpc-mate-python/Makefile index d6e6835..07ca78d 100644 --- a/grpc-mate-python/Makefile +++ b/grpc-mate-python/Makefile @@ -3,5 +3,8 @@ freeze: protoc: rm -fR grpc_mate/* && \ - python -m grpc_tools.protoc -Iprotobuffers --python_out=. --grpc_python_out=. protobuffers/grpc_mate/*.proto && \ - touch grpc_mate/__init__.py \ No newline at end of file + rm -fR google/* && \ + python -m grpc_tools.protoc -Iprotobuffers --python_out=. --grpc_python_out=. protobuffers/grpc_mate/*.proto protobuffers/google/api/*.proto && \ + touch grpc_mate/__init__.py + touch google/__init__.py + touch google/api/__init__.py \ No newline at end of file diff --git a/grpc-mate-python/google/__init__.py b/grpc-mate-python/google/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/grpc-mate-python/google/api/__init__.py b/grpc-mate-python/google/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/grpc-mate-python/google/api/annotations_pb2.py b/grpc-mate-python/google/api/annotations_pb2.py new file mode 100644 index 0000000..e72a7f8 --- /dev/null +++ b/grpc-mate-python/google/api/annotations_pb2.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/annotations.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from google.api import http_pb2 as google_dot_api_dot_http__pb2 +from google.protobuf import descriptor_pb2 as google_dot_protobuf_dot_descriptor__pb2 + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/annotations.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\020AnnotationsProtoP\001ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\242\002\004GAPI'), + serialized_pb=_b('\n\x1cgoogle/api/annotations.proto\x12\ngoogle.api\x1a\x15google/api/http.proto\x1a google/protobuf/descriptor.proto:E\n\x04http\x12\x1e.google.protobuf.MethodOptions\x18\xb0\xca\xbc\" \x01(\x0b\x32\x14.google.api.HttpRuleBn\n\x0e\x63om.google.apiB\x10\x41nnotationsProtoP\x01ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\xa2\x02\x04GAPIb\x06proto3') + , + dependencies=[google_dot_api_dot_http__pb2.DESCRIPTOR,google_dot_protobuf_dot_descriptor__pb2.DESCRIPTOR,]) + + +HTTP_FIELD_NUMBER = 72295728 +http = _descriptor.FieldDescriptor( + name='http', full_name='google.api.http', index=0, + number=72295728, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=True, extension_scope=None, + serialized_options=None, file=DESCRIPTOR) + +DESCRIPTOR.extensions_by_name['http'] = http +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +http.message_type = google_dot_api_dot_http__pb2._HTTPRULE +google_dot_protobuf_dot_descriptor__pb2.MethodOptions.RegisterExtension(http) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/grpc-mate-python/google/api/annotations_pb2_grpc.py b/grpc-mate-python/google/api/annotations_pb2_grpc.py new file mode 100644 index 0000000..a894352 --- /dev/null +++ b/grpc-mate-python/google/api/annotations_pb2_grpc.py @@ -0,0 +1,3 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + diff --git a/grpc-mate-python/google/api/http_pb2.py b/grpc-mate-python/google/api/http_pb2.py new file mode 100644 index 0000000..fdf6238 --- /dev/null +++ b/grpc-mate-python/google/api/http_pb2.py @@ -0,0 +1,236 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: google/api/http.proto + +import sys +_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1')) +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor.FileDescriptor( + name='google/api/http.proto', + package='google.api', + syntax='proto3', + serialized_options=_b('\n\016com.google.apiB\tHttpProtoP\001ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\370\001\001\242\002\004GAPI'), + serialized_pb=_b('\n\x15google/api/http.proto\x12\ngoogle.api\"+\n\x04Http\x12#\n\x05rules\x18\x01 \x03(\x0b\x32\x14.google.api.HttpRule\"\xea\x01\n\x08HttpRule\x12\x10\n\x08selector\x18\x01 \x01(\t\x12\r\n\x03get\x18\x02 \x01(\tH\x00\x12\r\n\x03put\x18\x03 \x01(\tH\x00\x12\x0e\n\x04post\x18\x04 \x01(\tH\x00\x12\x10\n\x06\x64\x65lete\x18\x05 \x01(\tH\x00\x12\x0f\n\x05patch\x18\x06 \x01(\tH\x00\x12/\n\x06\x63ustom\x18\x08 \x01(\x0b\x32\x1d.google.api.CustomHttpPatternH\x00\x12\x0c\n\x04\x62ody\x18\x07 \x01(\t\x12\x31\n\x13\x61\x64\x64itional_bindings\x18\x0b \x03(\x0b\x32\x14.google.api.HttpRuleB\t\n\x07pattern\"/\n\x11\x43ustomHttpPattern\x12\x0c\n\x04kind\x18\x01 \x01(\t\x12\x0c\n\x04path\x18\x02 \x01(\tBj\n\x0e\x63om.google.apiB\tHttpProtoP\x01ZAgoogle.golang.org/genproto/googleapis/api/annotations;annotations\xf8\x01\x01\xa2\x02\x04GAPIb\x06proto3') +) + + + + +_HTTP = _descriptor.Descriptor( + name='Http', + full_name='google.api.Http', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='rules', full_name='google.api.Http.rules', index=0, + number=1, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=37, + serialized_end=80, +) + + +_HTTPRULE = _descriptor.Descriptor( + name='HttpRule', + full_name='google.api.HttpRule', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='selector', full_name='google.api.HttpRule.selector', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='get', full_name='google.api.HttpRule.get', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='put', full_name='google.api.HttpRule.put', index=2, + number=3, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='post', full_name='google.api.HttpRule.post', index=3, + number=4, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='delete', full_name='google.api.HttpRule.delete', index=4, + number=5, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='patch', full_name='google.api.HttpRule.patch', index=5, + number=6, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='custom', full_name='google.api.HttpRule.custom', index=6, + number=8, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='body', full_name='google.api.HttpRule.body', index=7, + number=7, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='additional_bindings', full_name='google.api.HttpRule.additional_bindings', index=8, + number=11, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='pattern', full_name='google.api.HttpRule.pattern', + index=0, containing_type=None, fields=[]), + ], + serialized_start=83, + serialized_end=317, +) + + +_CUSTOMHTTPPATTERN = _descriptor.Descriptor( + name='CustomHttpPattern', + full_name='google.api.CustomHttpPattern', + filename=None, + file=DESCRIPTOR, + containing_type=None, + fields=[ + _descriptor.FieldDescriptor( + name='kind', full_name='google.api.CustomHttpPattern.kind', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + _descriptor.FieldDescriptor( + name='path', full_name='google.api.CustomHttpPattern.path', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=_b("").decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=319, + serialized_end=366, +) + +_HTTP.fields_by_name['rules'].message_type = _HTTPRULE +_HTTPRULE.fields_by_name['custom'].message_type = _CUSTOMHTTPPATTERN +_HTTPRULE.fields_by_name['additional_bindings'].message_type = _HTTPRULE +_HTTPRULE.oneofs_by_name['pattern'].fields.append( + _HTTPRULE.fields_by_name['get']) +_HTTPRULE.fields_by_name['get'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern'] +_HTTPRULE.oneofs_by_name['pattern'].fields.append( + _HTTPRULE.fields_by_name['put']) +_HTTPRULE.fields_by_name['put'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern'] +_HTTPRULE.oneofs_by_name['pattern'].fields.append( + _HTTPRULE.fields_by_name['post']) +_HTTPRULE.fields_by_name['post'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern'] +_HTTPRULE.oneofs_by_name['pattern'].fields.append( + _HTTPRULE.fields_by_name['delete']) +_HTTPRULE.fields_by_name['delete'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern'] +_HTTPRULE.oneofs_by_name['pattern'].fields.append( + _HTTPRULE.fields_by_name['patch']) +_HTTPRULE.fields_by_name['patch'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern'] +_HTTPRULE.oneofs_by_name['pattern'].fields.append( + _HTTPRULE.fields_by_name['custom']) +_HTTPRULE.fields_by_name['custom'].containing_oneof = _HTTPRULE.oneofs_by_name['pattern'] +DESCRIPTOR.message_types_by_name['Http'] = _HTTP +DESCRIPTOR.message_types_by_name['HttpRule'] = _HTTPRULE +DESCRIPTOR.message_types_by_name['CustomHttpPattern'] = _CUSTOMHTTPPATTERN +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Http = _reflection.GeneratedProtocolMessageType('Http', (_message.Message,), { + 'DESCRIPTOR' : _HTTP, + '__module__' : 'google.api.http_pb2' + # @@protoc_insertion_point(class_scope:google.api.Http) + }) +_sym_db.RegisterMessage(Http) + +HttpRule = _reflection.GeneratedProtocolMessageType('HttpRule', (_message.Message,), { + 'DESCRIPTOR' : _HTTPRULE, + '__module__' : 'google.api.http_pb2' + # @@protoc_insertion_point(class_scope:google.api.HttpRule) + }) +_sym_db.RegisterMessage(HttpRule) + +CustomHttpPattern = _reflection.GeneratedProtocolMessageType('CustomHttpPattern', (_message.Message,), { + 'DESCRIPTOR' : _CUSTOMHTTPPATTERN, + '__module__' : 'google.api.http_pb2' + # @@protoc_insertion_point(class_scope:google.api.CustomHttpPattern) + }) +_sym_db.RegisterMessage(CustomHttpPattern) + + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/grpc-mate-python/google/api/http_pb2_grpc.py b/grpc-mate-python/google/api/http_pb2_grpc.py new file mode 100644 index 0000000..a894352 --- /dev/null +++ b/grpc-mate-python/google/api/http_pb2_grpc.py @@ -0,0 +1,3 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +import grpc + From ae50bca181918997e9204f85cbbcfcae1ab73821 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 19 Oct 2019 17:03:23 +0800 Subject: [PATCH 08/50] dev the hello world grpc service --- grpc-mate-python/Pipfile | 1 + grpc-mate-python/Pipfile.lock | 187 ++++++++++--------- grpc-mate-python/README.md | 5 + grpc-mate-python/server/__init__.py | 0 grpc-mate-python/server/logging.yaml | 23 +++ grpc-mate-python/server/server.py | 30 +++ grpc-mate-python/service/__init__.py | 0 grpc-mate-python/service/greeter_servicer.py | 13 ++ 8 files changed, 175 insertions(+), 84 deletions(-) create mode 100644 grpc-mate-python/README.md create mode 100644 grpc-mate-python/server/__init__.py create mode 100644 grpc-mate-python/server/logging.yaml create mode 100644 grpc-mate-python/server/server.py create mode 100644 grpc-mate-python/service/__init__.py create mode 100644 grpc-mate-python/service/greeter_servicer.py diff --git a/grpc-mate-python/Pipfile b/grpc-mate-python/Pipfile index 02a82fe..63ddde4 100644 --- a/grpc-mate-python/Pipfile +++ b/grpc-mate-python/Pipfile @@ -9,6 +9,7 @@ verify_ssl = true grpcio = "*" grpcio-tools = "*" protobuf = "*" +pyyaml = "*" [requires] python_version = "3.6" diff --git a/grpc-mate-python/Pipfile.lock b/grpc-mate-python/Pipfile.lock index 179ba61..1782bad 100644 --- a/grpc-mate-python/Pipfile.lock +++ b/grpc-mate-python/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "f4866f7ed86e41249fcf150afb9f7c5147f89f60b3dfcce7a26d981ee81ae061" + "sha256": "76a3073b1e942c9d53a18b9b3265926c8aec4348e9c620813538c6e49355ac83" }, "pipfile-spec": 6, "requires": { @@ -18,101 +18,120 @@ "default": { "grpcio": { "hashes": [ - "sha256:1303578092f1f6e4bfbc354c04ac422856c393723d3ffa032fff0f7cb5cfd693", - "sha256:229c6b313cd82bec8f979b059d87f03cc1a48939b543fe170b5a9c5cf6a6bc69", - "sha256:3cd3d99a8b5568d0d186f9520c16121a0f2a4bcad8e2b9884b76fb88a85a7774", - "sha256:41cfb222db358227521f9638a6fbc397f310042a4db5539a19dea01547c621cd", - "sha256:43330501660f636fd6547d1e196e395cd1e2c2ae57d62219d6184a668ffebda0", - "sha256:45d7a2bd8b4f25a013296683f4140d636cdbb507d94a382ea5029a21e76b1648", - "sha256:47dc935658a13b25108823dabd010194ddea9610357c5c1ef1ad7b3f5157ebee", - "sha256:480aa7e2b56238badce0b9413a96d5b4c90c3bfbd79eba5a0501e92328d9669e", - "sha256:4a0934c8b0f97e1d8c18e76c45afc0d02d33ab03125258179f2ac6c7a13f3626", - "sha256:5624dab19e950f99e560400c59d87b685809e4cfcb2c724103f1ab14c06071f7", - "sha256:60515b1405bb3dadc55e6ca99429072dad3e736afcf5048db5452df5572231ff", - "sha256:610f97ebae742a57d336a69b09a9c7d7de1f62aa54aaa8adc635b38f55ba4382", - "sha256:64ea189b2b0859d1f7b411a09185028744d494ef09029630200cc892e366f169", - "sha256:686090c6c1e09e4f49585b8508d0a31d58bc3895e4049ea55b197d1381e9f70f", - "sha256:7745c365195bb0605e3d47b480a2a4d1baa8a41a5fd0a20de5fa48900e2c886a", - "sha256:79491e0d2b77a1c438116bf9e5f9e2e04e78b78524615e2ce453eff62db59a09", - "sha256:825177dd4c601c487836b7d6b4ba268db59787157911c623ba59a7c03c8d3adc", - "sha256:8a060e1f72fb94eee8a035ed29f1201ce903ad14cbe27bda56b4a22a8abda045", - "sha256:90168cc6353e2766e47b650c963f21cfff294654b10b3a14c67e26a4e3683634", - "sha256:94b7742734bceeff6d8db5edb31ac844cb68fc7f13617eca859ff1b78bb20ba1", - "sha256:962aebf2dd01bbb2cdb64580e61760f1afc470781f9ecd5fe8f3d8dcd8cf4556", - "sha256:9c8d9eacdce840b72eee7924c752c31b675f8aec74790e08cff184a4ea8aa9c1", - "sha256:af5b929debc336f6bab9b0da6915f9ee5e41444012aed6a79a3c7e80d7662fdf", - "sha256:b9cdb87fc77e9a3eabdc42a512368538d648fa0760ad30cf97788076985c790a", - "sha256:c5e6380b90b389454669dc67d0a39fb4dc166416e01308fcddd694236b8329ef", - "sha256:d60c90fe2bfbee735397bf75a2f2c4e70c5deab51cd40c6e4fa98fae018c8db6", - "sha256:d8582c8b1b1063249da1588854251d8a91df1e210a328aeb0ece39da2b2b763b", - "sha256:ddbf86ba3aa0ad8fed2867910d2913ee237d55920b55f1d619049b3399f04efc", - "sha256:e46bc0664c5c8a0545857aa7a096289f8db148e7f9cca2d0b760113e8994bddc", - "sha256:f6437f70ec7fed0ca3a0eef1146591bb754b418bb6c6b21db74f0333d624e135", - "sha256:f71693c3396530c6b00773b029ea85e59272557e9bd6077195a6593e4229892a", - "sha256:f79f7455f8fbd43e8e9d61914ecf7f48ba1c8e271801996fef8d6a8f3cc9f39f" + "sha256:0302331e014fc4bac028b6ad480b33f7abfe20b9bdcca7be417124dda8f22115", + "sha256:0aa0cce9c5eb1261b32173a20ed42b51308d55ce28ecc2021e868b3cb90d9503", + "sha256:0c83947575300499adbc308e986d754e7f629be0bdd9bea1ffdd5cf76e1f1eff", + "sha256:0ca26ff968d45efd4ef73447c4d4b34322ea8c7d06fbb6907ce9e5db78f1bbcb", + "sha256:0cf80a7955760c2498f8821880242bb657d70998065ff0d2a082de5ffce230a7", + "sha256:0d40706e57d9833fe0e023a08b468f33940e8909affa12547874216d36bba208", + "sha256:11872069156de34c6f3f9a1deb46cc88bc35dfde88262c4c73eb22b39b16fc55", + "sha256:16065227faae0ab0abf1789bfb92a2cd2ab5da87630663f93f8178026da40e0d", + "sha256:1e33778277685f6fabb22539136269c87c029e39b6321ef1a639b756a1c0a408", + "sha256:2b16be15b1ae656bc7a36642b8c7045be2dde2048bb4b67478003e9d9db8022a", + "sha256:3701dfca3ada27ceef0d17f728ce9dfef155ed20c57979c2b05083082258c6c1", + "sha256:41912ecaf482abf2de74c69f509878f99223f5dd6b2de1a09c955afd4de3cf9b", + "sha256:4332cbd20544fe7406910137590f38b5b3a1f6170258e038652cf478c639430f", + "sha256:44068ecbdc6467c2bff4d8198816c8a2701b6dd1ec16078fceb6adc7c1f577d6", + "sha256:53115960e37059420e2d16a4b04b00dd2ab3b6c3c67babd01ffbfdcd7881a69b", + "sha256:6e7027bcd4070414751e2a5e60706facb98a1fc636497c9bac5442fe37b8ae6b", + "sha256:6ff57fb2f07b7226b5bec89e8e921ea9bd220f35f11e094f2ba38f09eecd49c6", + "sha256:73240e244d7644654bbda1f309f4911748b6a1804b7a8897ddbe8a04c90f7407", + "sha256:785234bbc469bc75e26c868789a2080ffb30bd6e93930167797729889ad06b0b", + "sha256:82f9d3c7f91d2d1885631335c003c5d45ae1cd69cc0bc4893f21fef50b8151bc", + "sha256:86bdc2a965510658407a1372eb61f0c92f763fdfb2795e4d038944da4320c950", + "sha256:95e925b56676a55e6282b3de80a1cbad5774072159779c61eac02791dface049", + "sha256:96673bb4f14bd3263613526d1e7e33fdb38a9130e3ce87bf52314965706e1900", + "sha256:970014205e76920484679035b6fb4b16e02fc977e5aac4d22025da849c79dab9", + "sha256:ace5e8bf11a1571f855f5dab38a9bd34109b6c9bc2864abf24a597598c7e3695", + "sha256:ad375f03eb3b9cb75a24d91eab8609e134d34605f199efc41e20dd642bdac855", + "sha256:b819c4c7dcf0de76788ce5f95daad6d4e753d6da2b6a5f84e5bb5b5ce95fddc4", + "sha256:c17943fd340cbd906db49f3f03c7545e5a66b617e8348b2c7a0d2c759d216af1", + "sha256:d21247150dea86dabd3b628d8bc4b563036db3d332b3f4db3c5b1b0b122cb4f6", + "sha256:d4d500a7221116de9767229ff5dd10db91f789448d85befb0adf5a37b0cd83b5", + "sha256:e2a942a3cfccbbca21a90c144867112698ef36486345c285da9e98c466f22b22", + "sha256:e983273dca91cb8a5043bc88322eb48e2b8d4e4998ff441a1ee79ced89db3909" ], "index": "pypi", - "version": "==1.23.0" + "version": "==1.24.1" }, "grpcio-tools": { "hashes": [ - "sha256:056f2a274edda4315e825ac2e3a9536f5415b43aa51669196860c8de6e76d847", - "sha256:0c953251585fdcd422072e4b7f4243fce215f22e21db94ec83c5970e41db6e18", - "sha256:142a73f5769f37bf2e4a8e4a77ef60f7af5f55635f60428322b49c87bd8f9cc0", - "sha256:1b333e2a068d8ef89a01eb23a098d2a789659c3178de79da9bd3d0ffb944cc6d", - "sha256:2124f19cc51d63405a0204ae38ef355732ab0a235975ab41ff6f6f9701905432", - "sha256:24c3a04adfb6c6f1bc4a2f8498d7661ca296ae352b498e538832c22ddde7bf81", - "sha256:3a2054e9640cbdd0ce8a345afb86be52875c5a8f9f5973a5c64791a8002da2dd", - "sha256:3fd15a09eecef83440ac849dcda2ff522f8ee1603ebfcdbb0e9b320ef2012e41", - "sha256:457e7a7dfa0b6bb608a766edba6f20c9d626a790df802016b930ad242fec4470", - "sha256:49ad5661d54ff0d164e4b441ee5e05191187d497380afa16d36d72eb8ef048de", - "sha256:561078e425d21a6720c3c3828385d949e24c0765e2852a46ecc3ad3fca2706e5", - "sha256:5a4f65ab06b32dc34112ed114dee3b698c8463670474334ece5b0b531073804c", - "sha256:8883e0e34676356d219a4cd37d239c3ead655cc550836236b52068e091416fff", - "sha256:8d2b45b1faf81098780e07d6a1c207b328b07e913160b8baa7e2e8d89723e06c", - "sha256:b0ebddb6ecc4c161369f93bb3a74c6120a498d3ddc759b64679709a885dd6d4f", - "sha256:b786ba4842c50de865dd3885b5570690a743e84a327b7213dd440eb0e6b996f8", - "sha256:be8efa010f5a80f1862ead80c3b19b5eb97dc954a0f59a1e2487078576105e03", - "sha256:c29106eaff0e2e708a9a89628dc0134ef145d0d3631f0ef421c09f380c30e354", - "sha256:c3c71236a056ec961b2b8b3b7c0b3b5a826283bc69c4a1c6415d23b70fea8243", - "sha256:cbc35031ec2b29af36947d085a7fbbcd8b79b84d563adf6156103d82565f78db", - "sha256:d47307c22744918e803c1eec7263a14f36aaf34fe496bff9ccbcae67c02b40ae", - "sha256:db088c98e563c1bb070da5984c8df08b45b61e4d9c6d2a8a1ffeed2af89fd1f3", - "sha256:df4dd1cb670062abdacc1fbce41cae4e08a4a212d28dd94fdbbf90615d027f73", - "sha256:e3adcf1499ca08d1e036ff44aedf55ed78653d946f4c4426b6e72ab757cc4dec", - "sha256:e3b3e32e0cda4dc382ec5bed8599dab644e4b3fc66a9ab54eb58248e207880b9", - "sha256:ed524195b35304c670755efa1eca579e5c290a66981f97004a5b2c0d12d6897d", - "sha256:edb42432790b1f8ec9f08faf9326d7e5dfe6e1d8c8fe4db39abc0a49c1c76537", - "sha256:eff1f995e5aa4cc941b6bbc45b5b57842f8f62bbe1a99427281c2c70cf42312c", - "sha256:f2fcdc2669662d77b400f80e20315a3661466e3cb3df1730f8083f9e49465cbc", - "sha256:f52ec9926daf48f41389d39d01570967b99c7dbc12bffc134cc3a3c5b5540ba2", - "sha256:fd007d67fdfbd2a13bf8a8c8ced8353b42a92ca72dbee54e951d8ddbc6ca12bc", - "sha256:ff9045e928dbb7943ea8559bfabebee95a43a830e00bf52c16202d2d805780fb" + "sha256:0a849994d7d6411ca6147bb1db042b61ba6232eb5c90c69de5380a441bf80a75", + "sha256:0db96ed52816471ceec8807aedf5cb4fd133ca201f614464cb46ca58584edf84", + "sha256:1b98720459204e9afa33928e4fd53aeec6598afb7f704ed497f6926c67f12b9b", + "sha256:200479310cc083c41a5020f6e5e916a99ee0f7c588b6affe317b96a839120bf4", + "sha256:25543b8f2e59ddcc9929d6f6111faa5c474b21580d2996f93347bb55f2ecba84", + "sha256:2d4609996616114c155c1e697a9faf604d81f2508cd9a4168a0bafd53c799e24", + "sha256:2fdb2a1ed2b3e43514d9c29c9de415c953a46caabbc8a9b7de1439a0c1bd3b89", + "sha256:3886a7983d8ae19df0c11a54114d6546fcdf76cf18cdccf25c3b14200fd5478a", + "sha256:408d111b9341f107bdafc523e2345471547ffe8a4104e6f2ce690b7a25c4bae5", + "sha256:60b3dd5e76c1389fc836bf83675985b92d158ff9a8d3d6d3f0a670f0c227ef13", + "sha256:629be7ce8504530b4adbf0425a44dd53007ccb6212344804294888c9662cc38f", + "sha256:6af3dde07b1051e954230e650a6ef74073cf993cf473c2078580f8a73c4fe46a", + "sha256:7a1e77539d28e90517c55561f40f7872f1348d0e23f25a38d68abbfb5b0eff88", + "sha256:87917a18b3b5951b6c9badd7b5ef09f63f61611966b58427b856bdf5c1d68e91", + "sha256:8823d0ebd185a77edb506e286c88d06847f75620a033ad96ef9c0fd7efc1d859", + "sha256:8bd3e12e1969beb813b861a2a65d4f2d4faaa87de0b60bf7f848da2d8ffc4eb2", + "sha256:8f37e9acc46e75ed9786ece89afeacd86182893eacc3f0642d81531b90fbe25f", + "sha256:9b358dd2f4142e89d760a52a7a8f4ec5dbaf955e7ada09f703f3a5d05dddd12e", + "sha256:9cb43007c4a8aa7adaacf896f5109b578028f23d259615e3fa5866e38855b311", + "sha256:9cf594bfbfbf84dcd462b20a4a753362be7ed376d2b5020a083dac24400b7b6c", + "sha256:ab79940e5c5ed949e1f95e7f417dd916b0992d29f45d073dd64501a76d128e2c", + "sha256:ba8aab6c78a82755477bb8c79f3be0824b297422d1edb21b94ae5a45407bf3ba", + "sha256:bcc00b83bf39f6e60a13f0b24ec3951f4d2ae810b01e6e125b7ff238a85da1ac", + "sha256:c1fcf5cbe6a2ecdc587b469156520b9128ccdb7c5908060c7d9712cd97e76db5", + "sha256:c6e640d39b9615388b59036b29970292b15f4519043e43833e28c674f740d1f7", + "sha256:c6ea2c385da620049b17f0135cf9307a4750e9d9c9988e15bfeeaf1f209c4ada", + "sha256:cec4f37120f93fe2ab4ab9a7eab9a877163d74c232c93a275a624971f8557b81", + "sha256:d2dbb42d237bcdecb7284535ec074c85bbf880124c1cbbff362ed3bd81ed7d41", + "sha256:d5c98a41abd4f7de43b256c21bbba2a97c57e25bf6a170927a90638b18f7509c", + "sha256:dcf5965a24179aa7dcfa00b5ff70f4f2f202e663657e0c74a642307beecda053", + "sha256:e11e3aacf0200d6e00a9b74534e0174738768fe1c41e5aa2f4aab881d6b43afd", + "sha256:e550816bdb2e49bba94bcd7f342004a8adbc46e9a25c8c4ed3fd58f2435c655f" ], "index": "pypi", - "version": "==1.23.0" + "version": "==1.24.1" }, "protobuf": { "hashes": [ - "sha256:00a1b0b352dc7c809749526d1688a64b62ea400c5b05416f93cfb1b11a036295", - "sha256:01acbca2d2c8c3f7f235f1842440adbe01bbc379fa1cbdd80753801432b3fae9", - "sha256:0a795bca65987b62d6b8a2d934aa317fd1a4d06a6dd4df36312f5b0ade44a8d9", - "sha256:0ec035114213b6d6e7713987a759d762dd94e9f82284515b3b7331f34bfaec7f", - "sha256:31b18e1434b4907cb0113e7a372cd4d92c047ce7ba0fa7ea66a404d6388ed2c1", - "sha256:32a3abf79b0bef073c70656e86d5bd68a28a1fbb138429912c4fc07b9d426b07", - "sha256:55f85b7808766e5e3f526818f5e2aeb5ba2edcc45bcccede46a3ccc19b569cb0", - "sha256:64ab9bc971989cbdd648c102a96253fdf0202b0c38f15bd34759a8707bdd5f64", - "sha256:64cf847e843a465b6c1ba90fb6c7f7844d54dbe9eb731e86a60981d03f5b2e6e", - "sha256:917c8662b585470e8fd42f052661fc66d59fccaae450a60044307dcbf82a3335", - "sha256:afed9003d7f2be2c3df20f64220c30faec441073731511728a2cb4cab4cd46a6", - "sha256:bf8e05d638b585d1752c5a84247134a0350d3a8b73d3632489a014a9f6f1e758", - "sha256:d831b047bd69becaf64019a47179eb22118a50dd008340655266a906c69c6417", - "sha256:de2760583ed28749ff885789c1cbc6c9c06d6de92fc825740ab99deb2f25ea4d", - "sha256:eabc4cf1bc19689af8022ba52fd668564a8d96e0d08f3b4732d26a64255216a4", - "sha256:fcff6086c86fb1628d94ea455c7b9de898afc50378042927a59df8065a79a549" + "sha256:125713564d8cfed7610e52444c9769b8dcb0b55e25cc7841f2290ee7bc86636f", + "sha256:1accdb7a47e51503be64d9a57543964ba674edac103215576399d2d0e34eac77", + "sha256:27003d12d4f68e3cbea9eb67427cab3bfddd47ff90670cb367fcd7a3a89b9657", + "sha256:3264f3c431a631b0b31e9db2ae8c927b79fc1a7b1b06b31e8e5bcf2af91fe896", + "sha256:3c5ab0f5c71ca5af27143e60613729e3488bb45f6d3f143dc918a20af8bab0bf", + "sha256:45dcf8758873e3f69feab075e5f3177270739f146255225474ee0b90429adef6", + "sha256:56a77d61a91186cc5676d8e11b36a5feb513873e4ae88d2ee5cf530d52bbcd3b", + "sha256:5984e4947bbcef5bd849d6244aec507d31786f2dd3344139adc1489fb403b300", + "sha256:6b0441da73796dd00821763bb4119674eaf252776beb50ae3883bed179a60b2a", + "sha256:6f6677c5ade94d4fe75a912926d6796d5c71a2a90c2aeefe0d6f211d75c74789", + "sha256:84a825a9418d7196e2acc48f8746cf1ee75877ed2f30433ab92a133f3eaf8fbe", + "sha256:b842c34fe043ccf78b4a6cf1019d7b80113707d68c88842d061fa2b8fb6ddedc", + "sha256:ca33d2f09dae149a1dcf942d2d825ebb06343b77b437198c9e2ef115cf5d5bc1", + "sha256:db83b5c12c0cd30150bb568e6feb2435c49ce4e68fe2d7b903113f0e221e58fe", + "sha256:f50f3b1c5c1c1334ca7ce9cad5992f098f460ffd6388a3cabad10b66c2006b09", + "sha256:f99f127909731cafb841c52f9216e447d3e4afb99b17bebfad327a75aee206de" ], "index": "pypi", - "version": "==3.9.1" + "version": "==3.10.0" + }, + "pyyaml": { + "hashes": [ + "sha256:0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9", + "sha256:01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4", + "sha256:5124373960b0b3f4aa7df1707e63e9f109b5263eca5976c66e08b1c552d4eaf8", + "sha256:5ca4f10adbddae56d824b2c09668e91219bb178a1eee1faa56af6f99f11bf696", + "sha256:7907be34ffa3c5a32b60b95f4d95ea25361c951383a894fec31be7252b2b6f34", + "sha256:7ec9b2a4ed5cad025c2278a1e6a19c011c80a3caaac804fd2d329e9cc2c287c9", + "sha256:87ae4c829bb25b9fe99cf71fbb2140c448f534e24c998cc60f39ae4f94396a73", + "sha256:9de9919becc9cc2ff03637872a440195ac4241c80536632fffeb6a1e25a74299", + "sha256:a5a85b10e450c66b49f98846937e8cfca1db3127a9d5d1e31ca45c3d0bef4c5b", + "sha256:b0997827b4f6a7c286c01c5f60384d218dca4ed7d9efa945c3e1aa623d5709ae", + "sha256:b631ef96d3222e62861443cc89d6563ba3eeb816eeb96b2629345ab795e53681", + "sha256:bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41", + "sha256:f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8" + ], + "index": "pypi", + "version": "==5.1.2" }, "six": { "hashes": [ diff --git a/grpc-mate-python/README.md b/grpc-mate-python/README.md new file mode 100644 index 0000000..add96d8 --- /dev/null +++ b/grpc-mate-python/README.md @@ -0,0 +1,5 @@ +gRPC-Mate - An enterprise ready micro service project base on [gRPC](https://github.com/grpc/grpc) +======================================== +gRPC-Mate demostrate best practice for gRPC based micro service. + + diff --git a/grpc-mate-python/server/__init__.py b/grpc-mate-python/server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/grpc-mate-python/server/logging.yaml b/grpc-mate-python/server/logging.yaml new file mode 100644 index 0000000..3882351 --- /dev/null +++ b/grpc-mate-python/server/logging.yaml @@ -0,0 +1,23 @@ +version: 1 +formatters: + simple: + format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s' +handlers: + console: + class: logging.StreamHandler + level: DEBUG + formatter: simple + stream: ext://sys.stdout +loggers: + __main__: + level: DEBUG + handlers: [console] + propagate: no + service.greeter_servicer: + level: DEBUG + handlers: [console] + propagate: no +root: + level: INFO + handlers: [console] + propagate: yes \ No newline at end of file diff --git a/grpc-mate-python/server/server.py b/grpc-mate-python/server/server.py new file mode 100644 index 0000000..f8d1d53 --- /dev/null +++ b/grpc-mate-python/server/server.py @@ -0,0 +1,30 @@ +import logging.config +import yaml + + +from concurrent import futures + +import grpc + +import grpc_mate.helloworld_pb2_grpc +from service.greeter_servicer import GreeterServicer + +# Create a custom logger +with open('logging.yaml', 'r') as f: + config = yaml.safe_load(f.read()) + logging.config.dictConfig(config) + +logger = logging.getLogger(__name__) + + +def serve(): + server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) + grpc_mate.helloworld_pb2_grpc.add_GreeterServicer_to_server(GreeterServicer(), server) + server.add_insecure_port('[::]:8080') + server.start() + logger.debug('grpc server started at port 8080') + server.wait_for_termination() + + +if __name__ == '__main__': + serve() diff --git a/grpc-mate-python/service/__init__.py b/grpc-mate-python/service/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/grpc-mate-python/service/greeter_servicer.py b/grpc-mate-python/service/greeter_servicer.py new file mode 100644 index 0000000..b1b07dc --- /dev/null +++ b/grpc-mate-python/service/greeter_servicer.py @@ -0,0 +1,13 @@ +import logging + +import grpc_mate.helloworld_pb2 +import grpc_mate.helloworld_pb2_grpc + +logger = logging.getLogger(__name__) + + +class GreeterServicer(grpc_mate.helloworld_pb2_grpc.GreeterServicer): + + def SayHello(self, request, context): + logger.debug(f"get request {request.name}") + return grpc_mate.helloworld_pb2.HelloReply(message=f"hello {request.name}") From 2285dab90a3627aee13d71e5ba7403e24c38278b Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 19 Oct 2019 17:16:27 +0800 Subject: [PATCH 09/50] add setup python env --- grpc-mate-python/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/grpc-mate-python/README.md b/grpc-mate-python/README.md index add96d8..150c080 100644 --- a/grpc-mate-python/README.md +++ b/grpc-mate-python/README.md @@ -2,4 +2,5 @@ gRPC-Mate - An enterprise ready micro service project base on [gRPC](https://git ======================================== gRPC-Mate demostrate best practice for gRPC based micro service. +* [how to setup python development env](https://www.vipmind.me/programing/python/set-up-python-development-env-with-pyenv-and-pipenv.html) From dab42097282cbf847f454efb2fafa42302398bfd Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sun, 20 Oct 2019 18:44:14 +0800 Subject: [PATCH 10/50] add new doc --- grpc-mate-python/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/grpc-mate-python/README.md b/grpc-mate-python/README.md index 150c080..09f3872 100644 --- a/grpc-mate-python/README.md +++ b/grpc-mate-python/README.md @@ -3,4 +3,4 @@ gRPC-Mate - An enterprise ready micro service project base on [gRPC](https://git gRPC-Mate demostrate best practice for gRPC based micro service. * [how to setup python development env](https://www.vipmind.me/programing/python/set-up-python-development-env-with-pyenv-and-pipenv.html) - +* [how to bootstrap simple grpc server](https://www.vipmind.me/programing/python/setup-grpc-server-project-in-python.html) From 13ed87fbe3865535efeac114d1435e8dc7db3b78 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sun, 20 Oct 2019 19:38:40 +0800 Subject: [PATCH 11/50] add pytest-grpc --- grpc-mate-python/Pipfile | 1 + grpc-mate-python/Pipfile.lock | 88 ++++++++++++++++++++++++++++++++++- 2 files changed, 88 insertions(+), 1 deletion(-) diff --git a/grpc-mate-python/Pipfile b/grpc-mate-python/Pipfile index 63ddde4..0e7004d 100644 --- a/grpc-mate-python/Pipfile +++ b/grpc-mate-python/Pipfile @@ -10,6 +10,7 @@ grpcio = "*" grpcio-tools = "*" protobuf = "*" pyyaml = "*" +pytest-grpc = "*" [requires] python_version = "3.6" diff --git a/grpc-mate-python/Pipfile.lock b/grpc-mate-python/Pipfile.lock index 1782bad..e0e1e9e 100644 --- a/grpc-mate-python/Pipfile.lock +++ b/grpc-mate-python/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "76a3073b1e942c9d53a18b9b3265926c8aec4348e9c620813538c6e49355ac83" + "sha256": "0d909d9edc84f7d10be7a38e3c341a97ce4c10c49631b13506f07a75532cc780" }, "pipfile-spec": 6, "requires": { @@ -16,6 +16,20 @@ ] }, "default": { + "atomicwrites": { + "hashes": [ + "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", + "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" + ], + "version": "==1.3.0" + }, + "attrs": { + "hashes": [ + "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", + "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + ], + "version": "==19.3.0" + }, "grpcio": { "hashes": [ "sha256:0302331e014fc4bac028b6ad480b33f7abfe20b9bdcca7be417124dda8f22115", @@ -92,6 +106,35 @@ "index": "pypi", "version": "==1.24.1" }, + "importlib-metadata": { + "hashes": [ + "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", + "sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af" + ], + "markers": "python_version < '3.8'", + "version": "==0.23" + }, + "more-itertools": { + "hashes": [ + "sha256:409cd48d4db7052af495b09dec721011634af3753ae1ef92d2b32f73a745f832", + "sha256:92b8c4b06dac4f0611c0729b2f2ede52b2e1bac1ab48f089c7ddc12e26bb60c4" + ], + "version": "==7.2.0" + }, + "packaging": { + "hashes": [ + "sha256:28b924174df7a2fa32c1953825ff29c61e2f5e082343165438812f00d3a7fc47", + "sha256:d9551545c6d761f3def1677baf08ab2a3ca17c56879e70fecba2fc4dde4ed108" + ], + "version": "==19.2" + }, + "pluggy": { + "hashes": [ + "sha256:0db4b7601aae1d35b4a033282da476845aa19185c1e6964b25cf324b5e4ec3e6", + "sha256:fa5fa1622fa6dd5c030e9cad086fa19ef6a0cf6d7a2d12318e10cb49d6d68f34" + ], + "version": "==0.13.0" + }, "protobuf": { "hashes": [ "sha256:125713564d8cfed7610e52444c9769b8dcb0b55e25cc7841f2290ee7bc86636f", @@ -114,6 +157,35 @@ "index": "pypi", "version": "==3.10.0" }, + "py": { + "hashes": [ + "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", + "sha256:dc639b046a6e2cff5bbe40194ad65936d6ba360b52b3c3fe1d08a82dd50b5e53" + ], + "version": "==1.8.0" + }, + "pyparsing": { + "hashes": [ + "sha256:6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80", + "sha256:d9338df12903bbf5d65a0e4e87c2161968b10d2e489652bb47001d82a9b028b4" + ], + "version": "==2.4.2" + }, + "pytest": { + "hashes": [ + "sha256:7e4800063ccfc306a53c461442526c5571e1462f61583506ce97e4da6a1d88c8", + "sha256:ca563435f4941d0cb34767301c27bc65c510cb82e90b9ecf9cb52dc2c63caaa0" + ], + "version": "==5.2.1" + }, + "pytest-grpc": { + "hashes": [ + "sha256:28d75d2eea55518327289690053679b15ae867e54e7dff184c36316766b745ce", + "sha256:6884dea2279c874be59dccc25d69aa93cf7e00e1636dbe23b84144a8f81095fa" + ], + "index": "pypi", + "version": "==0.7.0" + }, "pyyaml": { "hashes": [ "sha256:0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9", @@ -139,6 +211,20 @@ "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" ], "version": "==1.12.0" + }, + "wcwidth": { + "hashes": [ + "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", + "sha256:f4ebe71925af7b40a864553f761ed559b43544f8f71746c2d756c7fe788ade7c" + ], + "version": "==0.1.7" + }, + "zipp": { + "hashes": [ + "sha256:3718b1cbcd963c7d4c5511a8240812904164b7f381b647143a89d3b98f9bcd8e", + "sha256:f06903e9f1f43b12d371004b4ac7b06ab39a44adc747266928ae6debfa7b3335" + ], + "version": "==0.6.0" } }, "develop": {} From eb7812fb82d29de6bf803ee078646940eaf68ba0 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sun, 20 Oct 2019 20:11:38 +0800 Subject: [PATCH 12/50] add pytest based test --- grpc-mate-python/tests/__init__.py | 0 grpc-mate-python/tests/service/__init__.py | 0 .../tests/service/test_greeter_servicer.py | 31 +++++++++++++++++++ 3 files changed, 31 insertions(+) create mode 100644 grpc-mate-python/tests/__init__.py create mode 100644 grpc-mate-python/tests/service/__init__.py create mode 100644 grpc-mate-python/tests/service/test_greeter_servicer.py diff --git a/grpc-mate-python/tests/__init__.py b/grpc-mate-python/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/grpc-mate-python/tests/service/__init__.py b/grpc-mate-python/tests/service/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/grpc-mate-python/tests/service/test_greeter_servicer.py b/grpc-mate-python/tests/service/test_greeter_servicer.py new file mode 100644 index 0000000..b0a8527 --- /dev/null +++ b/grpc-mate-python/tests/service/test_greeter_servicer.py @@ -0,0 +1,31 @@ +import pytest +from grpc_mate.helloworld_pb2 import HelloRequest + + +@pytest.fixture(scope='module') +def grpc_add_to_server(): + from grpc_mate.helloworld_pb2_grpc import add_GreeterServicer_to_server + + return add_GreeterServicer_to_server + + +@pytest.fixture(scope='module') +def grpc_servicer(): + from service.greeter_servicer import GreeterServicer + + return GreeterServicer() + + +@pytest.fixture(scope='module') +def grpc_stub_cls(grpc_channel): + from grpc_mate.helloworld_pb2_grpc import GreeterStub + + return GreeterStub + + +def test_SayHello(grpc_stub): + hello_request = HelloRequest(name='ivan') + response = grpc_stub.SayHello(hello_request) + + assert response.message == f'hello {hello_request.name}' + From 7d3bbec0a364a5dba94c62ff9b2daa814e2ab447 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Tue, 22 Oct 2019 20:10:53 +0800 Subject: [PATCH 13/50] add integration test --- grpc-mate-python/tests/service/test_greeter_servicer.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/grpc-mate-python/tests/service/test_greeter_servicer.py b/grpc-mate-python/tests/service/test_greeter_servicer.py index b0a8527..d93882e 100644 --- a/grpc-mate-python/tests/service/test_greeter_servicer.py +++ b/grpc-mate-python/tests/service/test_greeter_servicer.py @@ -1,3 +1,4 @@ +import grpc import pytest from grpc_mate.helloworld_pb2 import HelloRequest @@ -29,3 +30,11 @@ def test_SayHello(grpc_stub): assert response.message == f'hello {hello_request.name}' + +def integration_test_SayHello(): + from grpc_mate.helloworld_pb2_grpc import GreeterStub + channel = grpc.insecure_channel('localhost:8080') + stub = GreeterStub(channel) + hello_request = HelloRequest(name='local') + response = stub.SayHello(hello_request) + assert response.message == f'hello {hello_request.name}' From 33b15ab47f8d4519c7246a1c62e80d9b9b553598 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Wed, 23 Oct 2019 21:14:44 +0800 Subject: [PATCH 14/50] def ProductUpdateServiceServicer --- grpc-mate-python/service/product_update_servicer.py | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 grpc-mate-python/service/product_update_servicer.py diff --git a/grpc-mate-python/service/product_update_servicer.py b/grpc-mate-python/service/product_update_servicer.py new file mode 100644 index 0000000..67b2c6f --- /dev/null +++ b/grpc-mate-python/service/product_update_servicer.py @@ -0,0 +1,10 @@ +import logging + +import grpc_mate.product_search_engine_pb2_grpc + +logger = logging.getLogger(__name__) + + +class ProductUpdateServiceServicer(grpc_mate.product_search_engine_pb2_grpc.ProductUpdateServiceServicer): + def UploadProduct(self, request_iterator, context): + return super().UploadProduct(request_iterator, context) From 82a6b3d0fbd6f17331c67a4afd3dbeae6fdb7229 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Wed, 23 Oct 2019 21:20:34 +0800 Subject: [PATCH 15/50] add sqlalchemy --- grpc-mate-python/Pipfile | 1 + grpc-mate-python/Pipfile.lock | 173 +++++++++++++++++++++------------- 2 files changed, 107 insertions(+), 67 deletions(-) diff --git a/grpc-mate-python/Pipfile b/grpc-mate-python/Pipfile index 0e7004d..24b71d4 100644 --- a/grpc-mate-python/Pipfile +++ b/grpc-mate-python/Pipfile @@ -11,6 +11,7 @@ grpcio-tools = "*" protobuf = "*" pyyaml = "*" pytest-grpc = "*" +sqlalchemy = "*" [requires] python_version = "3.6" diff --git a/grpc-mate-python/Pipfile.lock b/grpc-mate-python/Pipfile.lock index e0e1e9e..b68a66c 100644 --- a/grpc-mate-python/Pipfile.lock +++ b/grpc-mate-python/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "0d909d9edc84f7d10be7a38e3c341a97ce4c10c49631b13506f07a75532cc780" + "sha256": "6831c6173ddd58aeac8ac259a9f49db97125d5dcb4738c2a102fe18d8b01e618" }, "pipfile-spec": 6, "requires": { @@ -32,79 +32,111 @@ }, "grpcio": { "hashes": [ - "sha256:0302331e014fc4bac028b6ad480b33f7abfe20b9bdcca7be417124dda8f22115", - "sha256:0aa0cce9c5eb1261b32173a20ed42b51308d55ce28ecc2021e868b3cb90d9503", - "sha256:0c83947575300499adbc308e986d754e7f629be0bdd9bea1ffdd5cf76e1f1eff", - "sha256:0ca26ff968d45efd4ef73447c4d4b34322ea8c7d06fbb6907ce9e5db78f1bbcb", - "sha256:0cf80a7955760c2498f8821880242bb657d70998065ff0d2a082de5ffce230a7", - "sha256:0d40706e57d9833fe0e023a08b468f33940e8909affa12547874216d36bba208", - "sha256:11872069156de34c6f3f9a1deb46cc88bc35dfde88262c4c73eb22b39b16fc55", - "sha256:16065227faae0ab0abf1789bfb92a2cd2ab5da87630663f93f8178026da40e0d", - "sha256:1e33778277685f6fabb22539136269c87c029e39b6321ef1a639b756a1c0a408", - "sha256:2b16be15b1ae656bc7a36642b8c7045be2dde2048bb4b67478003e9d9db8022a", - "sha256:3701dfca3ada27ceef0d17f728ce9dfef155ed20c57979c2b05083082258c6c1", - "sha256:41912ecaf482abf2de74c69f509878f99223f5dd6b2de1a09c955afd4de3cf9b", - "sha256:4332cbd20544fe7406910137590f38b5b3a1f6170258e038652cf478c639430f", - "sha256:44068ecbdc6467c2bff4d8198816c8a2701b6dd1ec16078fceb6adc7c1f577d6", - "sha256:53115960e37059420e2d16a4b04b00dd2ab3b6c3c67babd01ffbfdcd7881a69b", - "sha256:6e7027bcd4070414751e2a5e60706facb98a1fc636497c9bac5442fe37b8ae6b", - "sha256:6ff57fb2f07b7226b5bec89e8e921ea9bd220f35f11e094f2ba38f09eecd49c6", - "sha256:73240e244d7644654bbda1f309f4911748b6a1804b7a8897ddbe8a04c90f7407", - "sha256:785234bbc469bc75e26c868789a2080ffb30bd6e93930167797729889ad06b0b", - "sha256:82f9d3c7f91d2d1885631335c003c5d45ae1cd69cc0bc4893f21fef50b8151bc", - "sha256:86bdc2a965510658407a1372eb61f0c92f763fdfb2795e4d038944da4320c950", - "sha256:95e925b56676a55e6282b3de80a1cbad5774072159779c61eac02791dface049", - "sha256:96673bb4f14bd3263613526d1e7e33fdb38a9130e3ce87bf52314965706e1900", - "sha256:970014205e76920484679035b6fb4b16e02fc977e5aac4d22025da849c79dab9", - "sha256:ace5e8bf11a1571f855f5dab38a9bd34109b6c9bc2864abf24a597598c7e3695", - "sha256:ad375f03eb3b9cb75a24d91eab8609e134d34605f199efc41e20dd642bdac855", - "sha256:b819c4c7dcf0de76788ce5f95daad6d4e753d6da2b6a5f84e5bb5b5ce95fddc4", - "sha256:c17943fd340cbd906db49f3f03c7545e5a66b617e8348b2c7a0d2c759d216af1", - "sha256:d21247150dea86dabd3b628d8bc4b563036db3d332b3f4db3c5b1b0b122cb4f6", - "sha256:d4d500a7221116de9767229ff5dd10db91f789448d85befb0adf5a37b0cd83b5", - "sha256:e2a942a3cfccbbca21a90c144867112698ef36486345c285da9e98c466f22b22", - "sha256:e983273dca91cb8a5043bc88322eb48e2b8d4e4998ff441a1ee79ced89db3909" + "sha256:01cb705eafba1108e2a947ba0457da4f6a1e8142c729fc61702b5fdd11009eb1", + "sha256:0b5a79e29f167d3cd06faad6b15babbc2661066daaacf79373c3a8e67ca1fca1", + "sha256:1097a61a0e97b3580642e6e1460a3a1f1ba1815e2a70d6057173bcc495417076", + "sha256:13970e665a4ec4cec7d067d7d3504a0398c657d91d26c581144ad9044e429c9a", + "sha256:1557817cea6e0b87fad2a3e20da385170efb03a313db164e8078955add2dfa1b", + "sha256:1b0fb036a2f9dd93d9a35c57c26420eeb4b571fcb14b51cddf5b1e73ea5d882b", + "sha256:24d9e58d08e8cd545d8a3247a18654aff0e5e60414701696a8098fbb0d792b75", + "sha256:2c38b586163d2b91567fe5e6d9e7798f792012365adc838a64b66b22dce3f4d4", + "sha256:2df3ab4348507de60e1cbf75196403df1b9b4c4d4dc5bd11ac4eb63c46f691c7", + "sha256:32f70f7c90454ea568b868af2e96616743718d9233d23f62407e98caed81dfbf", + "sha256:3af2a49d576820045c9c880ff29a5a96d020fe31b35d248519bfc6ccb8be4eac", + "sha256:4ff7d63800a63db031ebac6a6f581ae84877c959401c24c28f2cc51fd36c47ad", + "sha256:502aaa8be56f0ae69cda66bc27e1fb5531ceaa27ca515ec3c34f6178b1297180", + "sha256:55358ce3ec283222e435f7dbc6603521438458f3c65f7c1cb33b8dabf56d70d8", + "sha256:5583b01c67f85fa64a2c3fb085e5517c88b9c1500a2cce12d473cd99d0ed2e49", + "sha256:58d9a5557d3eb7b734a3cea8b16c891099a522b3953a45a30bd4c034f75fc913", + "sha256:5911f042c4ab177757eec5bcb4e2e9a2e823d888835d24577321bf55f02938fa", + "sha256:5e16ea922f4e5017c04fd94e2639b1006e03097e9dd0cbb7a1c852af3ea8bf2e", + "sha256:656e19d3f1b9050ee01b457f92838a9679d7cf84c995f708780f44484048705e", + "sha256:6a1435449a82008c451c7e1a82a834387b9108f9a8d27910f86e7c482f5568e9", + "sha256:6ff02ca6cbed0ddb76e93ba0f8beb6a8c77d83a84eb7cafe2ae3399a8b9d69ea", + "sha256:76de68f60102f333bf4817f38e81ecbee68b850f5a5da9f355235e948ac40981", + "sha256:7c6d7ddd50fc6548ea1dfe09c62509c4f95b8b40082287747be05aa8feb15ee2", + "sha256:836b9d29507de729129e363276fe7c7d6a34c7961e0f155787025552b15d22c0", + "sha256:869242b2baf8a888a4fe0548f86abc47cb4b48bdfd76ae62d6456e939c202e65", + "sha256:8954b24bd08641d906ee50b2d638efc76df893fbd0913149b80484fd0eac40c9", + "sha256:8cdea65d1abb2e698420db8daf20c8d272fbd9d96a51b26a713c1c76f237d181", + "sha256:90161840b4fe9636f91ed0d3ea1e7e615e488cbea4e77594c889e5f3d7a776db", + "sha256:90fb6316b4d7d36700c40db4335902b78dcae13b5466673c21fd3b08a3c1b0c6", + "sha256:91b34f58db2611c9a93ecf751028f97fba1f06e65f49b38f272f6aa5d2977331", + "sha256:9474944a96a33eb8734fa8dc5805403d57973a3526204a5e1c1780d02e0572b6", + "sha256:9a36275db2a4774ac16c6822e7af816ee048071d5030b4c035fd53942b361935", + "sha256:9cbe26e2976b994c5f7c2d35a63354674d6ca0ce62f5b513f078bf63c1745229", + "sha256:9eaeabb3c0eecd6ddd0c16767fd12d130e2cebb8c2618f959a278b1ff336ddc3", + "sha256:a2bc7e10ebcf4be503ae427f9887e75c0cc24e88ce467a8e6eaca6bd2862406e", + "sha256:a5b42e6292ba51b8e67e09fc256963ba4ca9c04026de004d2fe59cc17e3c3776", + "sha256:bd6ec1233c86c0b9bb5d03ec30dbe3ffbfa53335790320d99a7ae9018c5450f2", + "sha256:bef57530816af54d66b1f4c70a8f851f320cb6f84d4b5a0b422b0e9811ea4e59", + "sha256:c146a63eaadc6589b732780061f3c94cd0574388d372baccbb3c1597a9ebdb7a", + "sha256:c2efd3b130dc639d615b6f58980e1bfd1b177ad821f30827afa5001aa30ddd48", + "sha256:c888b18f7392e6cc79a33a803e7ebd7890ac3318f571fca6b356526f35b53b12", + "sha256:ca30721fda297ae22f16bc37aa7ed244970ddfdcb98247570cdd26daaad4665e", + "sha256:cf5f5340dd682ab034baa52f423a0f91326489c262ac9617fa06309ec05880e9", + "sha256:d0726aa0d9b57c56985db5952e90fb1033a317074f2877db5307cdd6eede1564", + "sha256:df442945b2dd6f8ae0e20b403e0fd4548cd5c2aad69200047cc3251257b78f65", + "sha256:e08e758c31919d167c0867539bd3b2441629ef00aa595e3ea2b635273659f40a", + "sha256:e4864339deeeaefaad34dd3a432ee618a039fca28efb292949c855e00878203c", + "sha256:f4cd049cb94d9f517b1cab5668a3b345968beba093bc79a637e671000b3540ec" ], "index": "pypi", - "version": "==1.24.1" + "version": "==1.24.3" }, "grpcio-tools": { "hashes": [ - "sha256:0a849994d7d6411ca6147bb1db042b61ba6232eb5c90c69de5380a441bf80a75", - "sha256:0db96ed52816471ceec8807aedf5cb4fd133ca201f614464cb46ca58584edf84", - "sha256:1b98720459204e9afa33928e4fd53aeec6598afb7f704ed497f6926c67f12b9b", - "sha256:200479310cc083c41a5020f6e5e916a99ee0f7c588b6affe317b96a839120bf4", - "sha256:25543b8f2e59ddcc9929d6f6111faa5c474b21580d2996f93347bb55f2ecba84", - "sha256:2d4609996616114c155c1e697a9faf604d81f2508cd9a4168a0bafd53c799e24", - "sha256:2fdb2a1ed2b3e43514d9c29c9de415c953a46caabbc8a9b7de1439a0c1bd3b89", - "sha256:3886a7983d8ae19df0c11a54114d6546fcdf76cf18cdccf25c3b14200fd5478a", - "sha256:408d111b9341f107bdafc523e2345471547ffe8a4104e6f2ce690b7a25c4bae5", - "sha256:60b3dd5e76c1389fc836bf83675985b92d158ff9a8d3d6d3f0a670f0c227ef13", - "sha256:629be7ce8504530b4adbf0425a44dd53007ccb6212344804294888c9662cc38f", - "sha256:6af3dde07b1051e954230e650a6ef74073cf993cf473c2078580f8a73c4fe46a", - "sha256:7a1e77539d28e90517c55561f40f7872f1348d0e23f25a38d68abbfb5b0eff88", - "sha256:87917a18b3b5951b6c9badd7b5ef09f63f61611966b58427b856bdf5c1d68e91", - "sha256:8823d0ebd185a77edb506e286c88d06847f75620a033ad96ef9c0fd7efc1d859", - "sha256:8bd3e12e1969beb813b861a2a65d4f2d4faaa87de0b60bf7f848da2d8ffc4eb2", - "sha256:8f37e9acc46e75ed9786ece89afeacd86182893eacc3f0642d81531b90fbe25f", - "sha256:9b358dd2f4142e89d760a52a7a8f4ec5dbaf955e7ada09f703f3a5d05dddd12e", - "sha256:9cb43007c4a8aa7adaacf896f5109b578028f23d259615e3fa5866e38855b311", - "sha256:9cf594bfbfbf84dcd462b20a4a753362be7ed376d2b5020a083dac24400b7b6c", - "sha256:ab79940e5c5ed949e1f95e7f417dd916b0992d29f45d073dd64501a76d128e2c", - "sha256:ba8aab6c78a82755477bb8c79f3be0824b297422d1edb21b94ae5a45407bf3ba", - "sha256:bcc00b83bf39f6e60a13f0b24ec3951f4d2ae810b01e6e125b7ff238a85da1ac", - "sha256:c1fcf5cbe6a2ecdc587b469156520b9128ccdb7c5908060c7d9712cd97e76db5", - "sha256:c6e640d39b9615388b59036b29970292b15f4519043e43833e28c674f740d1f7", - "sha256:c6ea2c385da620049b17f0135cf9307a4750e9d9c9988e15bfeeaf1f209c4ada", - "sha256:cec4f37120f93fe2ab4ab9a7eab9a877163d74c232c93a275a624971f8557b81", - "sha256:d2dbb42d237bcdecb7284535ec074c85bbf880124c1cbbff362ed3bd81ed7d41", - "sha256:d5c98a41abd4f7de43b256c21bbba2a97c57e25bf6a170927a90638b18f7509c", - "sha256:dcf5965a24179aa7dcfa00b5ff70f4f2f202e663657e0c74a642307beecda053", - "sha256:e11e3aacf0200d6e00a9b74534e0174738768fe1c41e5aa2f4aab881d6b43afd", - "sha256:e550816bdb2e49bba94bcd7f342004a8adbc46e9a25c8c4ed3fd58f2435c655f" + "sha256:02b527b1e05f9ad446b0b70d5c4615493a93aab3ddf9ca1495939f97a6df9de9", + "sha256:06e92200d48e45d91ff04ebc833481c47273227df7538e3abc8917f0df57c73b", + "sha256:107f5b81190193b5032a60c55483be3f8cbb0a0951c5ba6a1c2d2e7d6c720cd6", + "sha256:12a9aba25bf9f7015f39cf22437a4f29974878a8e8623f33e3069e168926c752", + "sha256:12c251d48c217502b9c092c4450d9f1bfe81c049934ad4e31de1cb71814798a4", + "sha256:14ff158a7994f3d938593834cc2c8fd375ad8cc7768821d56353ffa02015e995", + "sha256:177bdfecf5c3093fdc4ca7599a7065ce867ccea8e2d401378e5411d6d7c5634b", + "sha256:1ecaa56b142bdc8548c9545def4cf3ca5e1eabda5d90bd48cd52e18368e07cc5", + "sha256:23caa6a0268247d5644a73b5595740c78f39b0376523f0bc84b25778c34aee5a", + "sha256:269a353037a99a03637fef1174ece25e9334bdace4b5f7a393374d439ecc7133", + "sha256:275ad665a40622d53d1ed1ddbb8f7973c16a3569c6b5a9530876c2b2bbf5ca2b", + "sha256:27f4750251a49227e5aa66f562a021cefe5844297b62975a9509bcbba35b7194", + "sha256:2cb00f6d504d48b9adccbb30c181b6e9e90c891d13d85d832c841042253c11bd", + "sha256:2ce979dc1dfce40be30c76af7f7257f85ca81d291f6eb4c943fb9ad26333183f", + "sha256:38edeed6e516337db581a6943f7cbaf2f284ba1df80811e1667f267752be0153", + "sha256:422407165166f48c65885ee7b251c6fe71f9475877389ae6cb88d48c539419a0", + "sha256:4b933a26fb0c7e724a571a6e48d25f02aa1fa0acedce58ca8dd768d555c21129", + "sha256:4f935a365ab7e9bcd2f1f4455965704f06212e2cea3e32d5b8453f9ba4852880", + "sha256:5005776a674867072b57fbb07e4f74ef60fefbbae2c2bddb15b9f64a119cebf4", + "sha256:559eee2e579a85981ee9461a64213e130653c3e213689e1fd8b9bf60330a58c7", + "sha256:5efc92721a364e049ad3a174d5b20a21009fae9db04b3e5020ed0b534d9c022f", + "sha256:63395b9216444bb1d83728d6e7bad4178da4eee667655c4e8305de13d78fd10f", + "sha256:65433b58a592da216d01e877a4d5766a341bb32b58d384dabeb093496056b228", + "sha256:6bb3ba89b5134e2b38749aefcf3206fce7a6c30cdcce9e14938d5d792a6c07e1", + "sha256:7a98160c255e38b7a99cc27b2f1c925ef7d8ec4a615ad9ef67ca346372818523", + "sha256:7fd5daecba6eb1bad14854aec933f992d84ca702e766789bc60cef6c6a3c3077", + "sha256:8889079e97f0e08097d81201097e00b32d67324bcfd61ddd3c42734b440a1f86", + "sha256:89426e7157ba45c1fd64e94456b50e2120f70031427c5f686af783dd9a10f258", + "sha256:896a58626d04df9f80dc156abca582dfa7b1de3ed64b4b2f212faedff19cb9d0", + "sha256:8b8195098afc83cca778af37fe8eebffb4d13f440ddaed8e42ecc5212912e82f", + "sha256:8f32aaeef3f21273dd8a1d2127ceae4da9c32a3df924627500c9b15b2bec3c5e", + "sha256:91d1455213e76dc884a6210eb3465b08a99e6861515c169ead0725e6d21f2502", + "sha256:9a9d3ba59bddd9bf24b931f79f7e5675dec1850a3e5e3f33d408648e4489c9be", + "sha256:9ac91409150f0e9a5f6fb6bacb022b578a52601db638bb4305fe89acdf5be46e", + "sha256:9c22bf4b2e6c214fe44dca8976b58090ec10ee5d6f8e2856a51a05f44347cad3", + "sha256:b1f537e528abb3be681a9735fa110b641e33b9fb83e0b61c777e1dd7df71d73e", + "sha256:b837da888d2af02755aaa386012450a171e069c3d738e282b69a020f7551fe39", + "sha256:bf19f2940a99a0a45218c6063c7a7fc23a696077b8c48f78496231f018f4a329", + "sha256:bf8332d68096eac48572d783133d733f8fac2e3a5de4ef5a1bfcc47648b1fa5c", + "sha256:c6b31d51bdeae6dfce880c1675e189ca86311f8632ebb4616bb43448a5e7ffa8", + "sha256:d08e4870c4285ba275e7b1f509c6f92b3f1fe25a5a11268268d63d0ab96febdb", + "sha256:de9ef57eff471e6314db7723545c84988a495755d7097ed2052b37612e6f8836", + "sha256:e37ad8f060cfdd214395221d73262628837747ee09f44537d7ded364df91eabd", + "sha256:e7e97bca1eeb3795594e5f16ea8c08359fdc9242e6057858b7a692dd22b10f18", + "sha256:e96b0fbbb32ebc85e810d5bdd00b1e325f1da3fc47b668752cee8bde00749fec", + "sha256:e9923b323ec3a58018829110faed8c43e3a0655a58312735b597e4cf8f685b99", + "sha256:eb13439cefe14b347390271b47c5eac390fcc3bb04318c870fe1a26173fe5e3f", + "sha256:fd4c3b38134be7b8fc6caffa42b83c7314ceb62baa8b7e1682d31969523d5014" ], "index": "pypi", - "version": "==1.24.1" + "version": "==1.24.3" }, "importlib-metadata": { "hashes": [ @@ -212,6 +244,13 @@ ], "version": "==1.12.0" }, + "sqlalchemy": { + "hashes": [ + "sha256:0f0768b5db594517e1f5e1572c73d14cf295140756431270d89496dc13d5e46c" + ], + "index": "pypi", + "version": "==1.3.10" + }, "wcwidth": { "hashes": [ "sha256:3df37372226d6e63e1b1e1eda15c594bca98a22d33a23832a90998faa96bc65e", From 13eb0ab2e16c0a7eaa85ba2ed0a7f82ca82e761c Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Thu, 24 Oct 2019 20:36:44 +0800 Subject: [PATCH 16/50] start to practice sqlalchemy --- grpc-mate-python/data_store/__init__.py | 0 grpc-mate-python/data_store/db.py | 2 ++ grpc-mate-python/data_store/models.py | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 grpc-mate-python/data_store/__init__.py create mode 100644 grpc-mate-python/data_store/db.py create mode 100644 grpc-mate-python/data_store/models.py diff --git a/grpc-mate-python/data_store/__init__.py b/grpc-mate-python/data_store/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/grpc-mate-python/data_store/db.py b/grpc-mate-python/data_store/db.py new file mode 100644 index 0000000..11c04be --- /dev/null +++ b/grpc-mate-python/data_store/db.py @@ -0,0 +1,2 @@ +from sqlalchemy import create_engine +engine = create_engine('sqlite:///:memory:', echo=True) diff --git a/grpc-mate-python/data_store/models.py b/grpc-mate-python/data_store/models.py new file mode 100644 index 0000000..14a1fce --- /dev/null +++ b/grpc-mate-python/data_store/models.py @@ -0,0 +1,21 @@ +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy import Column, Integer, String +from data_store.db import engine + +Base = declarative_base() + + +class User(Base): + __tablename__ = 'users' + + id = Column(Integer, primary_key=True) + name = Column(String) + fullname = Column(String(50)) + nickname = Column(String(50)) + + def __repr__(self) -> str: + return f'' + + +Base.metadata.create_all(engine) + From e4e00f542a2c22886da611e9741e385f2c9c4609 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Fri, 25 Oct 2019 19:41:07 +0800 Subject: [PATCH 17/50] test other sql alchemy features --- grpc-mate-python/data_store/db.py | 7 +++++ grpc-mate-python/data_store/models.py | 39 ++++++++++++++++++++++++--- 2 files changed, 42 insertions(+), 4 deletions(-) diff --git a/grpc-mate-python/data_store/db.py b/grpc-mate-python/data_store/db.py index 11c04be..9b0c5ad 100644 --- a/grpc-mate-python/data_store/db.py +++ b/grpc-mate-python/data_store/db.py @@ -1,2 +1,9 @@ from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + engine = create_engine('sqlite:///:memory:', echo=True) +Session = sessionmaker(bind=engine) + + +def get_session(): + return Session() diff --git a/grpc-mate-python/data_store/models.py b/grpc-mate-python/data_store/models.py index 14a1fce..952ac68 100644 --- a/grpc-mate-python/data_store/models.py +++ b/grpc-mate-python/data_store/models.py @@ -1,6 +1,7 @@ from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy import Column, Integer, String -from data_store.db import engine +from sqlalchemy import Column, Integer, String, ForeignKey +from sqlalchemy.orm import relationship +from data_store.db import engine, get_session Base = declarative_base() @@ -13,9 +14,39 @@ class User(Base): fullname = Column(String(50)) nickname = Column(String(50)) + addresses = relationship("Address", back_populates="user") + def __repr__(self) -> str: - return f'' + return f'' + + +class Address(Base): + __tablename__ = 'addresses' + id = Column(Integer, primary_key=True) + email_address = Column(String, nullable=False) + user_id = Column(Integer, ForeignKey('users.id')) + + user = relationship("User", back_populates="addresses") + + def __repr__(self): + return f'
' + + +def create_user(): + jack = User(name='jack', fullname='Jack Bean', nickname='gjffdd') + jack.addresses = [ + Address(email_address='jack@google.com'), + Address(email_address='j25@yahoo.com')] + session = get_session() + session.add(jack) + session.commit() + + print(session.query(User).one()) +def create_schema(): + Base.metadata.create_all(engine) -Base.metadata.create_all(engine) +if __name__ == '__main__': + create_schema() + create_user() From ee93ab6a652cf83f4198fee3a4c514a34572608b Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 26 Oct 2019 17:02:25 +0800 Subject: [PATCH 18/50] define product model --- grpc-mate-python/data_store/__init__.py | 8 +++ grpc-mate-python/data_store/db.py | 21 +++++--- grpc-mate-python/data_store/models.py | 51 +++++-------------- grpc-mate-python/tests/data_store/__init__.py | 0 .../tests/data_store/test_models.py | 24 +++++++++ 5 files changed, 59 insertions(+), 45 deletions(-) create mode 100644 grpc-mate-python/tests/data_store/__init__.py create mode 100644 grpc-mate-python/tests/data_store/test_models.py diff --git a/grpc-mate-python/data_store/__init__.py b/grpc-mate-python/data_store/__init__.py index e69de29..9d08207 100644 --- a/grpc-mate-python/data_store/__init__.py +++ b/grpc-mate-python/data_store/__init__.py @@ -0,0 +1,8 @@ +import os + +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +db_url = os.getenv('db_url', 'sqlite:///:memory:') +engine = create_engine(db_url, echo=True) +Session = sessionmaker(bind=engine) diff --git a/grpc-mate-python/data_store/db.py b/grpc-mate-python/data_store/db.py index 9b0c5ad..37d7d35 100644 --- a/grpc-mate-python/data_store/db.py +++ b/grpc-mate-python/data_store/db.py @@ -1,9 +1,16 @@ -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker +from data_store import Session +from contextlib import contextmanager -engine = create_engine('sqlite:///:memory:', echo=True) -Session = sessionmaker(bind=engine) - -def get_session(): - return Session() +@contextmanager +def session_scope(): + """Provide a transactional scope around a series of operations.""" + session = Session() + try: + yield session + session.commit() + except: + session.rollback() + raise + finally: + session.close() diff --git a/grpc-mate-python/data_store/models.py b/grpc-mate-python/data_store/models.py index 952ac68..03def81 100644 --- a/grpc-mate-python/data_store/models.py +++ b/grpc-mate-python/data_store/models.py @@ -1,50 +1,25 @@ +from sqlalchemy import Column, SMALLINT, Integer, String, DECIMAL, ForeignKey from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship -from data_store.db import engine, get_session -Base = declarative_base() - - -class User(Base): - __tablename__ = 'users' - - id = Column(Integer, primary_key=True) - name = Column(String) - fullname = Column(String(50)) - nickname = Column(String(50)) - - addresses = relationship("Address", back_populates="user") +from data_store import engine +from data_store.db import session_scope - def __repr__(self) -> str: - return f'' - - -class Address(Base): - __tablename__ = 'addresses' - id = Column(Integer, primary_key=True) - email_address = Column(String, nullable=False) - user_id = Column(Integer, ForeignKey('users.id')) - - user = relationship("User", back_populates="addresses") +Base = declarative_base() - def __repr__(self): - return f'
' +class DBProduct(Base): + __tablename__ = 'products' + product_id = Column(Integer, primary_key=True) + product_name = Column(String(200)) + product_price = Column(DECIMAL(10, 2)) + product_status = Column(SMALLINT) + category = Column(String(50)) -def create_user(): - jack = User(name='jack', fullname='Jack Bean', nickname='gjffdd') - jack.addresses = [ - Address(email_address='jack@google.com'), - Address(email_address='j25@yahoo.com')] - session = get_session() - session.add(jack) - session.commit() - print(session.query(User).one()) -def create_schema(): - Base.metadata.create_all(engine) +def msg(): + print("in models") if __name__ == '__main__': diff --git a/grpc-mate-python/tests/data_store/__init__.py b/grpc-mate-python/tests/data_store/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/grpc-mate-python/tests/data_store/test_models.py b/grpc-mate-python/tests/data_store/test_models.py new file mode 100644 index 0000000..b7adb4f --- /dev/null +++ b/grpc-mate-python/tests/data_store/test_models.py @@ -0,0 +1,24 @@ +import pytest + +from data_store import engine +from data_store.db import session_scope +from data_store.models import Base, DBProduct +from grpc_mate.product_common_pb2 import InStock + + +@pytest.fixture(autouse=True, scope='function') +def create_schema(): + if engine.url.__str__() == 'sqlite:///:memory:': + Base.metadata.create_all(engine) + + +def test_db_products(): + product = DBProduct(product_name='iPhone', product_price=2015.60, product_status=InStock, category='IT') + with session_scope() as session: + session.add(product) + my_product = session.query(DBProduct).one() + assert my_product.product_id is not None + assert my_product.product_name == product.product_name + assert my_product.product_price == product.product_price + assert my_product.product_status == product.product_status + assert my_product.category == product.category From cc6a67bbd79540f6297426b592a54a703cf0bedc Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 26 Oct 2019 17:06:50 +0800 Subject: [PATCH 19/50] delete test code --- grpc-mate-python/data_store/models.py | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/grpc-mate-python/data_store/models.py b/grpc-mate-python/data_store/models.py index 03def81..05014b3 100644 --- a/grpc-mate-python/data_store/models.py +++ b/grpc-mate-python/data_store/models.py @@ -1,9 +1,5 @@ -from sqlalchemy import Column, SMALLINT, Integer, String, DECIMAL, ForeignKey +from sqlalchemy import Column, SMALLINT, Integer, String, DECIMAL from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship - -from data_store import engine -from data_store.db import session_scope Base = declarative_base() @@ -15,13 +11,3 @@ class DBProduct(Base): product_price = Column(DECIMAL(10, 2)) product_status = Column(SMALLINT) category = Column(String(50)) - - - -def msg(): - print("in models") - - -if __name__ == '__main__': - create_schema() - create_user() From 540ddc5e1d8d88eff706c5e69b1f09f770d6b783 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 26 Oct 2019 17:18:57 +0800 Subject: [PATCH 20/50] use faker --- grpc-mate-python/Pipfile | 4 +- grpc-mate-python/Pipfile.lock | 160 +++++++++++------- .../tests/data_store/test_models.py | 7 +- 3 files changed, 107 insertions(+), 64 deletions(-) diff --git a/grpc-mate-python/Pipfile b/grpc-mate-python/Pipfile index 24b71d4..e6261f7 100644 --- a/grpc-mate-python/Pipfile +++ b/grpc-mate-python/Pipfile @@ -4,13 +4,15 @@ url = "https://pypi.org/simple" verify_ssl = true [dev-packages] +faker = "*" +v = {editable = true,version = "*"} +pytest-grpc = "*" [packages] grpcio = "*" grpcio-tools = "*" protobuf = "*" pyyaml = "*" -pytest-grpc = "*" sqlalchemy = "*" [requires] diff --git a/grpc-mate-python/Pipfile.lock b/grpc-mate-python/Pipfile.lock index b68a66c..942a032 100644 --- a/grpc-mate-python/Pipfile.lock +++ b/grpc-mate-python/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "6831c6173ddd58aeac8ac259a9f49db97125d5dcb4738c2a102fe18d8b01e618" + "sha256": "c1d06d026e32295b043809e896a091125df55674b8a7f33ba42c575f2a627bc0" }, "pipfile-spec": 6, "requires": { @@ -16,20 +16,6 @@ ] }, "default": { - "atomicwrites": { - "hashes": [ - "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", - "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" - ], - "version": "==1.3.0" - }, - "attrs": { - "hashes": [ - "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", - "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" - ], - "version": "==19.3.0" - }, "grpcio": { "hashes": [ "sha256:01cb705eafba1108e2a947ba0457da4f6a1e8142c729fc61702b5fdd11009eb1", @@ -138,6 +124,85 @@ "index": "pypi", "version": "==1.24.3" }, + "protobuf": { + "hashes": [ + "sha256:125713564d8cfed7610e52444c9769b8dcb0b55e25cc7841f2290ee7bc86636f", + "sha256:1accdb7a47e51503be64d9a57543964ba674edac103215576399d2d0e34eac77", + "sha256:27003d12d4f68e3cbea9eb67427cab3bfddd47ff90670cb367fcd7a3a89b9657", + "sha256:3264f3c431a631b0b31e9db2ae8c927b79fc1a7b1b06b31e8e5bcf2af91fe896", + "sha256:3c5ab0f5c71ca5af27143e60613729e3488bb45f6d3f143dc918a20af8bab0bf", + "sha256:45dcf8758873e3f69feab075e5f3177270739f146255225474ee0b90429adef6", + "sha256:56a77d61a91186cc5676d8e11b36a5feb513873e4ae88d2ee5cf530d52bbcd3b", + "sha256:5984e4947bbcef5bd849d6244aec507d31786f2dd3344139adc1489fb403b300", + "sha256:6b0441da73796dd00821763bb4119674eaf252776beb50ae3883bed179a60b2a", + "sha256:6f6677c5ade94d4fe75a912926d6796d5c71a2a90c2aeefe0d6f211d75c74789", + "sha256:84a825a9418d7196e2acc48f8746cf1ee75877ed2f30433ab92a133f3eaf8fbe", + "sha256:b842c34fe043ccf78b4a6cf1019d7b80113707d68c88842d061fa2b8fb6ddedc", + "sha256:ca33d2f09dae149a1dcf942d2d825ebb06343b77b437198c9e2ef115cf5d5bc1", + "sha256:db83b5c12c0cd30150bb568e6feb2435c49ce4e68fe2d7b903113f0e221e58fe", + "sha256:f50f3b1c5c1c1334ca7ce9cad5992f098f460ffd6388a3cabad10b66c2006b09", + "sha256:f99f127909731cafb841c52f9216e447d3e4afb99b17bebfad327a75aee206de" + ], + "index": "pypi", + "version": "==3.10.0" + }, + "pyyaml": { + "hashes": [ + "sha256:0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9", + "sha256:01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4", + "sha256:5124373960b0b3f4aa7df1707e63e9f109b5263eca5976c66e08b1c552d4eaf8", + "sha256:5ca4f10adbddae56d824b2c09668e91219bb178a1eee1faa56af6f99f11bf696", + "sha256:7907be34ffa3c5a32b60b95f4d95ea25361c951383a894fec31be7252b2b6f34", + "sha256:7ec9b2a4ed5cad025c2278a1e6a19c011c80a3caaac804fd2d329e9cc2c287c9", + "sha256:87ae4c829bb25b9fe99cf71fbb2140c448f534e24c998cc60f39ae4f94396a73", + "sha256:9de9919becc9cc2ff03637872a440195ac4241c80536632fffeb6a1e25a74299", + "sha256:a5a85b10e450c66b49f98846937e8cfca1db3127a9d5d1e31ca45c3d0bef4c5b", + "sha256:b0997827b4f6a7c286c01c5f60384d218dca4ed7d9efa945c3e1aa623d5709ae", + "sha256:b631ef96d3222e62861443cc89d6563ba3eeb816eeb96b2629345ab795e53681", + "sha256:bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41", + "sha256:f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8" + ], + "index": "pypi", + "version": "==5.1.2" + }, + "six": { + "hashes": [ + "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", + "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" + ], + "version": "==1.12.0" + }, + "sqlalchemy": { + "hashes": [ + "sha256:0f0768b5db594517e1f5e1572c73d14cf295140756431270d89496dc13d5e46c" + ], + "index": "pypi", + "version": "==1.3.10" + } + }, + "develop": { + "atomicwrites": { + "hashes": [ + "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", + "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" + ], + "version": "==1.3.0" + }, + "attrs": { + "hashes": [ + "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", + "sha256:f7b7ce16570fe9965acd6d30101a28f62fb4a7f9e926b3bbc9b61f8b04247e72" + ], + "version": "==19.3.0" + }, + "faker": { + "hashes": [ + "sha256:5902379d8df308a204fc11c4f621590ee83975805a6c7b2228203b9defa45250", + "sha256:5e8c755c619f332d5ec28b7586389665f136bcf528e165eb925e87c06a63eda7" + ], + "index": "pypi", + "version": "==2.0.3" + }, "importlib-metadata": { "hashes": [ "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", @@ -167,28 +232,6 @@ ], "version": "==0.13.0" }, - "protobuf": { - "hashes": [ - "sha256:125713564d8cfed7610e52444c9769b8dcb0b55e25cc7841f2290ee7bc86636f", - "sha256:1accdb7a47e51503be64d9a57543964ba674edac103215576399d2d0e34eac77", - "sha256:27003d12d4f68e3cbea9eb67427cab3bfddd47ff90670cb367fcd7a3a89b9657", - "sha256:3264f3c431a631b0b31e9db2ae8c927b79fc1a7b1b06b31e8e5bcf2af91fe896", - "sha256:3c5ab0f5c71ca5af27143e60613729e3488bb45f6d3f143dc918a20af8bab0bf", - "sha256:45dcf8758873e3f69feab075e5f3177270739f146255225474ee0b90429adef6", - "sha256:56a77d61a91186cc5676d8e11b36a5feb513873e4ae88d2ee5cf530d52bbcd3b", - "sha256:5984e4947bbcef5bd849d6244aec507d31786f2dd3344139adc1489fb403b300", - "sha256:6b0441da73796dd00821763bb4119674eaf252776beb50ae3883bed179a60b2a", - "sha256:6f6677c5ade94d4fe75a912926d6796d5c71a2a90c2aeefe0d6f211d75c74789", - "sha256:84a825a9418d7196e2acc48f8746cf1ee75877ed2f30433ab92a133f3eaf8fbe", - "sha256:b842c34fe043ccf78b4a6cf1019d7b80113707d68c88842d061fa2b8fb6ddedc", - "sha256:ca33d2f09dae149a1dcf942d2d825ebb06343b77b437198c9e2ef115cf5d5bc1", - "sha256:db83b5c12c0cd30150bb568e6feb2435c49ce4e68fe2d7b903113f0e221e58fe", - "sha256:f50f3b1c5c1c1334ca7ce9cad5992f098f460ffd6388a3cabad10b66c2006b09", - "sha256:f99f127909731cafb841c52f9216e447d3e4afb99b17bebfad327a75aee206de" - ], - "index": "pypi", - "version": "==3.10.0" - }, "py": { "hashes": [ "sha256:64f65755aee5b381cea27766a3a147c3f15b9b6b9ac88676de66ba2ae36793fa", @@ -205,10 +248,10 @@ }, "pytest": { "hashes": [ - "sha256:7e4800063ccfc306a53c461442526c5571e1462f61583506ce97e4da6a1d88c8", - "sha256:ca563435f4941d0cb34767301c27bc65c510cb82e90b9ecf9cb52dc2c63caaa0" + "sha256:27abc3fef618a01bebb1f0d6d303d2816a99aa87a5968ebc32fe971be91eb1e6", + "sha256:58cee9e09242937e136dbb3dab466116ba20d6b7828c7620f23947f37eb4dae4" ], - "version": "==5.2.1" + "version": "==5.2.2" }, "pytest-grpc": { "hashes": [ @@ -218,24 +261,12 @@ "index": "pypi", "version": "==0.7.0" }, - "pyyaml": { + "python-dateutil": { "hashes": [ - "sha256:0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9", - "sha256:01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4", - "sha256:5124373960b0b3f4aa7df1707e63e9f109b5263eca5976c66e08b1c552d4eaf8", - "sha256:5ca4f10adbddae56d824b2c09668e91219bb178a1eee1faa56af6f99f11bf696", - "sha256:7907be34ffa3c5a32b60b95f4d95ea25361c951383a894fec31be7252b2b6f34", - "sha256:7ec9b2a4ed5cad025c2278a1e6a19c011c80a3caaac804fd2d329e9cc2c287c9", - "sha256:87ae4c829bb25b9fe99cf71fbb2140c448f534e24c998cc60f39ae4f94396a73", - "sha256:9de9919becc9cc2ff03637872a440195ac4241c80536632fffeb6a1e25a74299", - "sha256:a5a85b10e450c66b49f98846937e8cfca1db3127a9d5d1e31ca45c3d0bef4c5b", - "sha256:b0997827b4f6a7c286c01c5f60384d218dca4ed7d9efa945c3e1aa623d5709ae", - "sha256:b631ef96d3222e62861443cc89d6563ba3eeb816eeb96b2629345ab795e53681", - "sha256:bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41", - "sha256:f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8" + "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", + "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" ], - "index": "pypi", - "version": "==5.1.2" + "version": "==2.8.0" }, "six": { "hashes": [ @@ -244,12 +275,20 @@ ], "version": "==1.12.0" }, - "sqlalchemy": { + "text-unidecode": { "hashes": [ - "sha256:0f0768b5db594517e1f5e1572c73d14cf295140756431270d89496dc13d5e46c" + "sha256:1311f10e8b895935241623731c2ba64f4c455287888b18189350b67134a822e8", + "sha256:bad6603bb14d279193107714b288be206cac565dfa49aa5b105294dd5c4aab93" + ], + "version": "==1.3" + }, + "v": { + "hashes": [ + "sha256:2d5a8f79a36aaebe62ef2c7068e3ec7f86656078202edabfdbf74715dc822d36", + "sha256:cd6b6b20b4a611f209c88bcdfb7211321f85662efb2bdd53a7b40314d0a84618" ], "index": "pypi", - "version": "==1.3.10" + "version": "==0.0.0" }, "wcwidth": { "hashes": [ @@ -265,6 +304,5 @@ ], "version": "==0.6.0" } - }, - "develop": {} + } } diff --git a/grpc-mate-python/tests/data_store/test_models.py b/grpc-mate-python/tests/data_store/test_models.py index b7adb4f..97120d1 100644 --- a/grpc-mate-python/tests/data_store/test_models.py +++ b/grpc-mate-python/tests/data_store/test_models.py @@ -1,10 +1,11 @@ import pytest - +from decimal import Decimal from data_store import engine from data_store.db import session_scope from data_store.models import Base, DBProduct from grpc_mate.product_common_pb2 import InStock +from faker import Faker @pytest.fixture(autouse=True, scope='function') def create_schema(): @@ -13,7 +14,9 @@ def create_schema(): def test_db_products(): - product = DBProduct(product_name='iPhone', product_price=2015.60, product_status=InStock, category='IT') + faker = Faker() + product = DBProduct(product_name=faker.name(), product_price=Decimal(faker.random_int() / 100), + product_status=InStock, category=faker.name()) with session_scope() as session: session.add(product) my_product = session.query(DBProduct).one() From dc0f612533c42ece9bdc37b5b899cfc9d88bf30d Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 26 Oct 2019 17:28:06 +0800 Subject: [PATCH 21/50] fmt the code --- grpc-mate-python/tests/data_store/test_models.py | 1 + 1 file changed, 1 insertion(+) diff --git a/grpc-mate-python/tests/data_store/test_models.py b/grpc-mate-python/tests/data_store/test_models.py index 97120d1..931036a 100644 --- a/grpc-mate-python/tests/data_store/test_models.py +++ b/grpc-mate-python/tests/data_store/test_models.py @@ -7,6 +7,7 @@ from faker import Faker + @pytest.fixture(autouse=True, scope='function') def create_schema(): if engine.url.__str__() == 'sqlite:///:memory:': From 447d66e56dc846280b196cee5965b8254382eaac Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 26 Oct 2019 21:21:44 +0800 Subject: [PATCH 22/50] set grpc product attr dynamically --- grpc-mate-python/tests/data_store/test_models.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/grpc-mate-python/tests/data_store/test_models.py b/grpc-mate-python/tests/data_store/test_models.py index 931036a..d284210 100644 --- a/grpc-mate-python/tests/data_store/test_models.py +++ b/grpc-mate-python/tests/data_store/test_models.py @@ -1,11 +1,12 @@ -import pytest from decimal import Decimal + +import pytest +from faker import Faker + from data_store import engine from data_store.db import session_scope from data_store.models import Base, DBProduct -from grpc_mate.product_common_pb2 import InStock - -from faker import Faker +from grpc_mate.product_common_pb2 import InStock, Product @pytest.fixture(autouse=True, scope='function') @@ -18,11 +19,18 @@ def test_db_products(): faker = Faker() product = DBProduct(product_name=faker.name(), product_price=Decimal(faker.random_int() / 100), product_status=InStock, category=faker.name()) + my_product = None with session_scope() as session: session.add(product) my_product = session.query(DBProduct).one() + session.expunge(my_product) assert my_product.product_id is not None assert my_product.product_name == product.product_name assert my_product.product_price == product.product_price assert my_product.product_status == product.product_status assert my_product.category == product.category + + # copy the db product to grpc product + grpc_product = Product() + for k in grpc_product.DESCRIPTOR.fields_by_name: + setattr(grpc_product, k, my_product.__dict__[k]) From 5e6ec7c56ee734eefd08d48fedc17577d7bcbae7 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Mon, 28 Oct 2019 19:36:12 +0800 Subject: [PATCH 23/50] format the code --- grpc-mate-python/tests/data_store/test_models.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/grpc-mate-python/tests/data_store/test_models.py b/grpc-mate-python/tests/data_store/test_models.py index d284210..2195135 100644 --- a/grpc-mate-python/tests/data_store/test_models.py +++ b/grpc-mate-python/tests/data_store/test_models.py @@ -17,8 +17,10 @@ def create_schema(): def test_db_products(): faker = Faker() - product = DBProduct(product_name=faker.name(), product_price=Decimal(faker.random_int() / 100), - product_status=InStock, category=faker.name()) + product = DBProduct(product_name=faker.name(), + product_price=Decimal(faker.random_int() / 100), + product_status=InStock, + category=faker.name()) my_product = None with session_scope() as session: session.add(product) From 61dda6beeb0da32a556ce86a348f26ca6c4fde68 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Mon, 28 Oct 2019 19:40:31 +0800 Subject: [PATCH 24/50] add more link in read me --- grpc-mate-python/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/grpc-mate-python/README.md b/grpc-mate-python/README.md index 09f3872..3724d2d 100644 --- a/grpc-mate-python/README.md +++ b/grpc-mate-python/README.md @@ -4,3 +4,5 @@ gRPC-Mate demostrate best practice for gRPC based micro service. * [how to setup python development env](https://www.vipmind.me/programing/python/set-up-python-development-env-with-pyenv-and-pipenv.html) * [how to bootstrap simple grpc server](https://www.vipmind.me/programing/python/setup-grpc-server-project-in-python.html) +* [how to do unit test for grpc servicer](https://www.vipmind.me/programing/python/write-unit-test-for-grpc-with-pytest-and-pytest-grpc.html) +* [how to use sqlalchemy to persist data](https://www.vipmind.me/programing/python/sqlalchemy-makes-python-orm-easy.html) From ee19d584f3372ee06038ee2e5da03608f0f63d86 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Tue, 29 Oct 2019 20:26:35 +0800 Subject: [PATCH 25/50] dev ProductUpdateServiceServicer --- .../service/product_update_servicer.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/grpc-mate-python/service/product_update_servicer.py b/grpc-mate-python/service/product_update_servicer.py index 67b2c6f..b855c17 100644 --- a/grpc-mate-python/service/product_update_servicer.py +++ b/grpc-mate-python/service/product_update_servicer.py @@ -1,10 +1,25 @@ import logging import grpc_mate.product_search_engine_pb2_grpc +from data_store.db import session_scope +from data_store.models import DBProduct +from grpc_mate.product_search_engine_pb2 import UploadProductResponse logger = logging.getLogger(__name__) class ProductUpdateServiceServicer(grpc_mate.product_search_engine_pb2_grpc.ProductUpdateServiceServicer): def UploadProduct(self, request_iterator, context): - return super().UploadProduct(request_iterator, context) + with session_scope() as session: + for product in request_iterator: + db_product = DBProduct(product_name=product.product_name, + product_price=product.product_price, + product_status=product.product_status, + category=product.category) + # TODO(IL) test it out + # for k in product.DESCRIPTOR.fields_by_name: + # setattr(db_product, k, product.__dict__[k]) + # db_product.product_id = None + session.add(db_product) + + return UploadProductResponse(result_status=UploadProductResponse.SUCCESS) From 1384850f634b44619a17fd6b5e83cf2daf2d0d60 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Tue, 29 Oct 2019 20:46:04 +0800 Subject: [PATCH 26/50] test nested enum --- .../tests/service/test_product_update_servicer.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 grpc-mate-python/tests/service/test_product_update_servicer.py diff --git a/grpc-mate-python/tests/service/test_product_update_servicer.py b/grpc-mate-python/tests/service/test_product_update_servicer.py new file mode 100644 index 0000000..6668cb7 --- /dev/null +++ b/grpc-mate-python/tests/service/test_product_update_servicer.py @@ -0,0 +1,12 @@ +from grpc_mate.product_search_engine_pb2 import UploadProductResponse + + +def test_UploadProductResponse_enum(): + """ + see https://developers.google.com/protocol-buffers/docs/reference/python-generated#enum on how to use enum + see https://github.com/protocolbuffers/protobuf/blob/master/python/google/protobuf/internal/enum_type_wrapper.py + for method in all enums + :return: + """ + upload_product_response = UploadProductResponse(result_status=UploadProductResponse.SUCCESS) + assert upload_product_response.result_status == UploadProductResponse.ResultStatus.Value('SUCCESS') From 9dfa62a5f8afbf4518ff3e51d96f6ba09f24a39a Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Wed, 30 Oct 2019 21:36:08 +0800 Subject: [PATCH 27/50] add test for upload products --- grpc-mate-python/Makefile | 5 ++- .../service/test_product_update_servicer.py | 36 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/grpc-mate-python/Makefile b/grpc-mate-python/Makefile index 07ca78d..061be92 100644 --- a/grpc-mate-python/Makefile +++ b/grpc-mate-python/Makefile @@ -7,4 +7,7 @@ protoc: python -m grpc_tools.protoc -Iprotobuffers --python_out=. --grpc_python_out=. protobuffers/grpc_mate/*.proto protobuffers/google/api/*.proto && \ touch grpc_mate/__init__.py touch google/__init__.py - touch google/api/__init__.py \ No newline at end of file + touch google/api/__init__.py + +pytest: + pytest --grpc-fake-server \ No newline at end of file diff --git a/grpc-mate-python/tests/service/test_product_update_servicer.py b/grpc-mate-python/tests/service/test_product_update_servicer.py index 6668cb7..2cf6e69 100644 --- a/grpc-mate-python/tests/service/test_product_update_servicer.py +++ b/grpc-mate-python/tests/service/test_product_update_servicer.py @@ -1,5 +1,41 @@ +import pytest + +from grpc_mate.product_common_pb2 import Product, InStock from grpc_mate.product_search_engine_pb2 import UploadProductResponse +from data_store import engine +from data_store.models import Base + + +@pytest.fixture(scope='module') +def grpc_add_to_server(): + from grpc_mate.product_search_engine_pb2_grpc import add_ProductUpdateServiceServicer_to_server + return add_ProductUpdateServiceServicer_to_server + + +@pytest.fixture(scope='module') +def grpc_servicer(): + from service.product_update_servicer import ProductUpdateServiceServicer + + return ProductUpdateServiceServicer() + + +@pytest.fixture(scope='module') +def grpc_stub_cls(grpc_channel): + from grpc_mate.product_search_engine_pb2_grpc import ProductUpdateServiceStub + + return ProductUpdateServiceStub + +@pytest.fixture(autouse=True, scope='module') +def create_schema(): + if engine.url.__str__() == 'sqlite:///:memory:': + Base.metadata.create_all(engine) + +def test_UploadProduct(grpc_stub): + products = [ + Product(product_name='product_name_1', product_price=1.0, product_status=InStock, category='category_1')] + grpc_stub.UploadProduct(iter(products)) + def test_UploadProductResponse_enum(): """ From ee5252eb2bf72782a88670c88641162426457e62 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Wed, 30 Oct 2019 21:36:25 +0800 Subject: [PATCH 28/50] format --- .../tests/service/test_product_update_servicer.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/grpc-mate-python/tests/service/test_product_update_servicer.py b/grpc-mate-python/tests/service/test_product_update_servicer.py index 2cf6e69..58b8492 100644 --- a/grpc-mate-python/tests/service/test_product_update_servicer.py +++ b/grpc-mate-python/tests/service/test_product_update_servicer.py @@ -1,10 +1,9 @@ import pytest -from grpc_mate.product_common_pb2 import Product, InStock -from grpc_mate.product_search_engine_pb2 import UploadProductResponse - from data_store import engine from data_store.models import Base +from grpc_mate.product_common_pb2 import Product, InStock +from grpc_mate.product_search_engine_pb2 import UploadProductResponse @pytest.fixture(scope='module') @@ -26,11 +25,13 @@ def grpc_stub_cls(grpc_channel): return ProductUpdateServiceStub + @pytest.fixture(autouse=True, scope='module') def create_schema(): if engine.url.__str__() == 'sqlite:///:memory:': Base.metadata.create_all(engine) + def test_UploadProduct(grpc_stub): products = [ Product(product_name='product_name_1', product_price=1.0, product_status=InStock, category='category_1')] From 778107653d4f6b73287a8a66c74d0da26c4a4fb2 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Thu, 31 Oct 2019 20:18:19 +0800 Subject: [PATCH 29/50] test update service --- .../service/product_update_servicer.py | 12 +++----- .../tests/data_store/test_models.py | 10 ++----- .../service/test_product_update_servicer.py | 30 +++++++++++++++++-- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/grpc-mate-python/service/product_update_servicer.py b/grpc-mate-python/service/product_update_servicer.py index b855c17..5cb137d 100644 --- a/grpc-mate-python/service/product_update_servicer.py +++ b/grpc-mate-python/service/product_update_servicer.py @@ -12,14 +12,10 @@ class ProductUpdateServiceServicer(grpc_mate.product_search_engine_pb2_grpc.Prod def UploadProduct(self, request_iterator, context): with session_scope() as session: for product in request_iterator: - db_product = DBProduct(product_name=product.product_name, - product_price=product.product_price, - product_status=product.product_status, - category=product.category) - # TODO(IL) test it out - # for k in product.DESCRIPTOR.fields_by_name: - # setattr(db_product, k, product.__dict__[k]) - # db_product.product_id = None + db_product = DBProduct() + for k in product.DESCRIPTOR.fields_by_name: + setattr(db_product, k, getattr(product, k)) + db_product.product_id = None session.add(db_product) return UploadProductResponse(result_status=UploadProductResponse.SUCCESS) diff --git a/grpc-mate-python/tests/data_store/test_models.py b/grpc-mate-python/tests/data_store/test_models.py index 2195135..76ad14d 100644 --- a/grpc-mate-python/tests/data_store/test_models.py +++ b/grpc-mate-python/tests/data_store/test_models.py @@ -6,13 +6,15 @@ from data_store import engine from data_store.db import session_scope from data_store.models import Base, DBProduct -from grpc_mate.product_common_pb2 import InStock, Product +from grpc_mate.product_common_pb2 import InStock @pytest.fixture(autouse=True, scope='function') def create_schema(): if engine.url.__str__() == 'sqlite:///:memory:': Base.metadata.create_all(engine) + yield None + Base.metadata.drop_all(engine) def test_db_products(): @@ -21,7 +23,6 @@ def test_db_products(): product_price=Decimal(faker.random_int() / 100), product_status=InStock, category=faker.name()) - my_product = None with session_scope() as session: session.add(product) my_product = session.query(DBProduct).one() @@ -31,8 +32,3 @@ def test_db_products(): assert my_product.product_price == product.product_price assert my_product.product_status == product.product_status assert my_product.category == product.category - - # copy the db product to grpc product - grpc_product = Product() - for k in grpc_product.DESCRIPTOR.fields_by_name: - setattr(grpc_product, k, my_product.__dict__[k]) diff --git a/grpc-mate-python/tests/service/test_product_update_servicer.py b/grpc-mate-python/tests/service/test_product_update_servicer.py index 58b8492..3bc779e 100644 --- a/grpc-mate-python/tests/service/test_product_update_servicer.py +++ b/grpc-mate-python/tests/service/test_product_update_servicer.py @@ -1,7 +1,8 @@ import pytest from data_store import engine -from data_store.models import Base +from data_store.models import Base, DBProduct +from data_store.db import session_scope from grpc_mate.product_common_pb2 import Product, InStock from grpc_mate.product_search_engine_pb2 import UploadProductResponse @@ -26,16 +27,39 @@ def grpc_stub_cls(grpc_channel): return ProductUpdateServiceStub -@pytest.fixture(autouse=True, scope='module') +@pytest.fixture(autouse=True, scope='function') def create_schema(): if engine.url.__str__() == 'sqlite:///:memory:': Base.metadata.create_all(engine) + yield None + Base.metadata.drop_all(engine) -def test_UploadProduct(grpc_stub): + +def test_UploadProduct_insert_one(grpc_stub): products = [ Product(product_name='product_name_1', product_price=1.0, product_status=InStock, category='category_1')] grpc_stub.UploadProduct(iter(products)) + with session_scope() as session: + rows = session.query(DBProduct).count() + assert rows == 1 + my_product = session.query(DBProduct).one() + product = products[0] + assert my_product.product_id is not None + assert my_product.product_name == product.product_name + assert my_product.product_price == product.product_price + assert my_product.product_status == product.product_status + assert my_product.category == product.category + + +def test_UploadProduct_insert_two(grpc_stub): + products = [ + Product(product_name='product_name_1', product_price=1.0, product_status=InStock, category='category_1'), + Product(product_name='product_name_2', product_price=2.0, product_status=InStock, category='category_2')] + grpc_stub.UploadProduct(iter(products)) + with session_scope() as session: + rows = session.query(DBProduct).count() + assert rows == 2 def test_UploadProductResponse_enum(): From 720a461edb697887f091b0913299b744be1071de Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Thu, 31 Oct 2019 20:55:24 +0800 Subject: [PATCH 30/50] add new blog --- grpc-mate-python/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/grpc-mate-python/README.md b/grpc-mate-python/README.md index 3724d2d..7a8dfd8 100644 --- a/grpc-mate-python/README.md +++ b/grpc-mate-python/README.md @@ -6,3 +6,4 @@ gRPC-Mate demostrate best practice for gRPC based micro service. * [how to bootstrap simple grpc server](https://www.vipmind.me/programing/python/setup-grpc-server-project-in-python.html) * [how to do unit test for grpc servicer](https://www.vipmind.me/programing/python/write-unit-test-for-grpc-with-pytest-and-pytest-grpc.html) * [how to use sqlalchemy to persist data](https://www.vipmind.me/programing/python/sqlalchemy-makes-python-orm-easy.html) +* [how to use protobuf enum in python](https://www.vipmind.me/programing/python/understand-protobuf-enum-in-python.html) From a79f20765bc772f41960475301446c57d8bfa753 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Fri, 1 Nov 2019 19:26:40 +0800 Subject: [PATCH 31/50] add client stream servicer to server --- grpc-mate-python/server/server.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/grpc-mate-python/server/server.py b/grpc-mate-python/server/server.py index f8d1d53..f3e1e30 100644 --- a/grpc-mate-python/server/server.py +++ b/grpc-mate-python/server/server.py @@ -1,13 +1,14 @@ import logging.config import yaml - from concurrent import futures import grpc import grpc_mate.helloworld_pb2_grpc from service.greeter_servicer import GreeterServicer +import grpc_mate.product_search_engine_pb2_grpc +from service.product_update_servicer import ProductUpdateServiceServicer # Create a custom logger with open('logging.yaml', 'r') as f: @@ -20,6 +21,8 @@ def serve(): server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) grpc_mate.helloworld_pb2_grpc.add_GreeterServicer_to_server(GreeterServicer(), server) + grpc_mate.product_search_engine_pb2_grpc.add_ProductUpdateServiceServicer_to_server(ProductUpdateServiceServicer(), + server) server.add_insecure_port('[::]:8080') server.start() logger.debug('grpc server started at port 8080') From f52236cafd3cf3cccd11f9f1cb791191386bf9ba Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Fri, 1 Nov 2019 19:27:37 +0800 Subject: [PATCH 32/50] add doc --- grpc-mate-python/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/grpc-mate-python/README.md b/grpc-mate-python/README.md index 7a8dfd8..7d8046c 100644 --- a/grpc-mate-python/README.md +++ b/grpc-mate-python/README.md @@ -7,3 +7,4 @@ gRPC-Mate demostrate best practice for gRPC based micro service. * [how to do unit test for grpc servicer](https://www.vipmind.me/programing/python/write-unit-test-for-grpc-with-pytest-and-pytest-grpc.html) * [how to use sqlalchemy to persist data](https://www.vipmind.me/programing/python/sqlalchemy-makes-python-orm-easy.html) * [how to use protobuf enum in python](https://www.vipmind.me/programing/python/understand-protobuf-enum-in-python.html) +* [how to do client streaming](https://www.vipmind.me/programing/python/how-to-do-grpc-client-stream-upload.html) From 02037817d4c640fecc800b52c535df1766081831 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 2 Nov 2019 15:07:38 +0800 Subject: [PATCH 33/50] dev SearchProducts --- .../service/product_read_servicer.py | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 grpc-mate-python/service/product_read_servicer.py diff --git a/grpc-mate-python/service/product_read_servicer.py b/grpc-mate-python/service/product_read_servicer.py new file mode 100644 index 0000000..d54ebd1 --- /dev/null +++ b/grpc-mate-python/service/product_read_servicer.py @@ -0,0 +1,38 @@ +import logging + +import grpc_mate.product_search_engine_pb2_grpc +from data_store.db import session_scope +from data_store.models import DBProduct +from grpc_mate.product_common_pb2 import Product +from grpc_mate.product_search_engine_pb2 import SearchProductsResponse + +logger = logging.getLogger(__name__) + + +def db_product_to_protobuf_product(db_product): + # copy the db product to grpc product + protobuf_product = Product() + for k in protobuf_product.DESCRIPTOR.fields_by_name: + setattr(protobuf_product, k, db_product.__dict__[k]) + return protobuf_product + + +class ProductReadServiceServicer(grpc_mate.product_search_engine_pb2_grpc.ProductReadServiceServicer): + def DownloadProducts(self, request, context): + return super().DownloadProducts(request, context) + + def SearchProducts(self, request, context): + with session_scope() as session: + result = session.query(DBProduct) \ + .filter(DBProduct.product_name.ilike('%{request.key_word}%')) \ + .order_by(DBProduct.product_id.asc()) \ + .limit(limit=request.limit) \ + .all() + products = list(map(db_product_to_protobuf_product, result)) + return SearchProductsResponse(products=products) + + def CalculateProductScore(self, request_iterator, context): + return super().CalculateProductScore(request_iterator, context) + + def DownloadProductImage(self, request, context): + return super().DownloadProductImage(request, context) From 50ef85b07c0293cec725e7602185679022f8cf15 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 2 Nov 2019 18:31:02 +0800 Subject: [PATCH 34/50] add unit test for SearchProducts --- .../service/product_read_servicer.py | 2 +- .../tests/data_store/test_models.py | 10 +-- .../service/test_product_read_servicer.py | 80 +++++++++++++++++++ 3 files changed, 86 insertions(+), 6 deletions(-) create mode 100644 grpc-mate-python/tests/service/test_product_read_servicer.py diff --git a/grpc-mate-python/service/product_read_servicer.py b/grpc-mate-python/service/product_read_servicer.py index d54ebd1..97ff6f5 100644 --- a/grpc-mate-python/service/product_read_servicer.py +++ b/grpc-mate-python/service/product_read_servicer.py @@ -24,7 +24,7 @@ def DownloadProducts(self, request, context): def SearchProducts(self, request, context): with session_scope() as session: result = session.query(DBProduct) \ - .filter(DBProduct.product_name.ilike('%{request.key_word}%')) \ + .filter(DBProduct.product_name.like(f'%{request.key_word}%')) \ .order_by(DBProduct.product_id.asc()) \ .limit(limit=request.limit) \ .all() diff --git a/grpc-mate-python/tests/data_store/test_models.py b/grpc-mate-python/tests/data_store/test_models.py index 76ad14d..58a169f 100644 --- a/grpc-mate-python/tests/data_store/test_models.py +++ b/grpc-mate-python/tests/data_store/test_models.py @@ -27,8 +27,8 @@ def test_db_products(): session.add(product) my_product = session.query(DBProduct).one() session.expunge(my_product) - assert my_product.product_id is not None - assert my_product.product_name == product.product_name - assert my_product.product_price == product.product_price - assert my_product.product_status == product.product_status - assert my_product.category == product.category + assert my_product.product_id is not None + assert my_product.product_name == product.product_name + assert my_product.product_price == product.product_price + assert my_product.product_status == product.product_status + assert my_product.category == product.category diff --git a/grpc-mate-python/tests/service/test_product_read_servicer.py b/grpc-mate-python/tests/service/test_product_read_servicer.py new file mode 100644 index 0000000..11dc4c0 --- /dev/null +++ b/grpc-mate-python/tests/service/test_product_read_servicer.py @@ -0,0 +1,80 @@ +from decimal import Decimal + +import pytest +from faker import Faker + +from data_store import engine +from data_store.db import session_scope +from data_store.models import Base, DBProduct +from grpc_mate.product_common_pb2 import InStock +from grpc_mate.product_search_engine_pb2 import SearchProductsRequest + + +@pytest.fixture(scope='module') +def grpc_add_to_server(): + from grpc_mate.product_search_engine_pb2_grpc import add_ProductReadServiceServicer_to_server + return add_ProductReadServiceServicer_to_server + + +@pytest.fixture(scope='module') +def grpc_servicer(): + from service.product_read_servicer import ProductReadServiceServicer + + return ProductReadServiceServicer() + + +@pytest.fixture(scope='module') +def grpc_stub_cls(grpc_channel): + from grpc_mate.product_search_engine_pb2_grpc import ProductReadServiceStub + + return ProductReadServiceStub + + +@pytest.fixture(autouse=True, scope='function') +def create_schema(): + if engine.url.__str__() == 'sqlite:///:memory:': + Base.metadata.create_all(engine) + yield None + Base.metadata.drop_all(engine) + + +def test_SearchProducts_none_exist(grpc_stub): + faker = Faker() + keyword = faker.name() + + response = grpc_stub.SearchProducts(SearchProductsRequest(key_word=keyword, limit=2)) + assert len(response.products) == 0 + + +def test_SearchProducts_exist(grpc_stub): + faker = Faker() + keyword = faker.name() + product = DBProduct(product_name=keyword, + product_price=Decimal(faker.random_int() / 100), + product_status=InStock, + category=faker.name()) + # save to db + with session_scope() as session: + session.add(product) + + response = grpc_stub.SearchProducts(SearchProductsRequest(key_word=keyword, limit=2)) + assert len(response.products) == 1 + assert keyword in response.products[0].product_name + + +def test_SearchProducts_limit(grpc_stub): + faker = Faker() + keyword = faker.name() + # save to db + with session_scope() as session: + for idx in range(5): + product = DBProduct(product_name=f'{keyword}_{idx}', + product_price=Decimal(faker.random_int() / 100), + product_status=InStock, + category=faker.name()) + session.add(product) + + response = grpc_stub.SearchProducts(SearchProductsRequest(key_word=keyword, limit=2)) + assert len(response.products) == 2 + assert keyword in response.products[0].product_name + assert keyword in response.products[1].product_name From 809eab4b98d429463212a16557860ea92eba86fb Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 2 Nov 2019 20:33:06 +0800 Subject: [PATCH 35/50] dev DownloadProducts --- grpc-mate-python/service/product_read_servicer.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/grpc-mate-python/service/product_read_servicer.py b/grpc-mate-python/service/product_read_servicer.py index 97ff6f5..649477a 100644 --- a/grpc-mate-python/service/product_read_servicer.py +++ b/grpc-mate-python/service/product_read_servicer.py @@ -19,7 +19,12 @@ def db_product_to_protobuf_product(db_product): class ProductReadServiceServicer(grpc_mate.product_search_engine_pb2_grpc.ProductReadServiceServicer): def DownloadProducts(self, request, context): - return super().DownloadProducts(request, context) + with session_scope() as session: + result = session.query(DBProduct) \ + .filter(DBProduct.category == request.category) \ + .all() + for product in result: + yield db_product_to_protobuf_product(product) def SearchProducts(self, request, context): with session_scope() as session: From c2f22c113ff550539ae941f54d08b1fc3c12080b Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Mon, 4 Nov 2019 20:16:27 +0800 Subject: [PATCH 36/50] impl server stream --- .../service/test_product_read_servicer.py | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/grpc-mate-python/tests/service/test_product_read_servicer.py b/grpc-mate-python/tests/service/test_product_read_servicer.py index 11dc4c0..645d286 100644 --- a/grpc-mate-python/tests/service/test_product_read_servicer.py +++ b/grpc-mate-python/tests/service/test_product_read_servicer.py @@ -7,7 +7,7 @@ from data_store.db import session_scope from data_store.models import Base, DBProduct from grpc_mate.product_common_pb2 import InStock -from grpc_mate.product_search_engine_pb2 import SearchProductsRequest +from grpc_mate.product_search_engine_pb2 import SearchProductsRequest, DownloadProductsRequest @pytest.fixture(scope='module') @@ -78,3 +78,20 @@ def test_SearchProducts_limit(grpc_stub): assert len(response.products) == 2 assert keyword in response.products[0].product_name assert keyword in response.products[1].product_name + + +def test_DownloadProducts_exist(grpc_stub): + faker = Faker() + category = faker.name() + # save to db + with session_scope() as session: + for idx in range(5): + product = DBProduct(product_name=f'{faker.name()}_{idx}', + product_price=Decimal(faker.random_int() / 100), + product_status=InStock, + category=category) + session.add(product) + result = grpc_stub.DownloadProducts(DownloadProductsRequest(category=category)) + + # assert we have 5 items + assert len(list(result)) == 5 From 82478f6559e6670e809fa2d3a626e2272e743bdc Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Mon, 4 Nov 2019 20:32:34 +0800 Subject: [PATCH 37/50] add test_DownloadProducts_none_exist --- .../tests/service/test_product_read_servicer.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/grpc-mate-python/tests/service/test_product_read_servicer.py b/grpc-mate-python/tests/service/test_product_read_servicer.py index 645d286..2fed42d 100644 --- a/grpc-mate-python/tests/service/test_product_read_servicer.py +++ b/grpc-mate-python/tests/service/test_product_read_servicer.py @@ -95,3 +95,12 @@ def test_DownloadProducts_exist(grpc_stub): # assert we have 5 items assert len(list(result)) == 5 + + +def test_DownloadProducts_none_exist(grpc_stub): + faker = Faker() + category = faker.name() + result = grpc_stub.DownloadProducts(DownloadProductsRequest(category=category)) + + # assert we have 0 items + assert len(list(result)) == 0 From 1d98090bdce12d7f0f19aa0ca3d8bc9e5f9d0c5f Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Wed, 6 Nov 2019 19:51:07 +0800 Subject: [PATCH 38/50] add bi-stream --- .../service/product_read_servicer.py | 5 +++-- .../tests/service/test_product_read_servicer.py | 17 ++++++++++++++++- .../service/test_product_update_servicer.py | 2 -- 3 files changed, 19 insertions(+), 5 deletions(-) diff --git a/grpc-mate-python/service/product_read_servicer.py b/grpc-mate-python/service/product_read_servicer.py index 649477a..d6287ef 100644 --- a/grpc-mate-python/service/product_read_servicer.py +++ b/grpc-mate-python/service/product_read_servicer.py @@ -4,7 +4,7 @@ from data_store.db import session_scope from data_store.models import DBProduct from grpc_mate.product_common_pb2 import Product -from grpc_mate.product_search_engine_pb2 import SearchProductsResponse +from grpc_mate.product_search_engine_pb2 import SearchProductsResponse, CalculateProductScoreResponse logger = logging.getLogger(__name__) @@ -37,7 +37,8 @@ def SearchProducts(self, request, context): return SearchProductsResponse(products=products) def CalculateProductScore(self, request_iterator, context): - return super().CalculateProductScore(request_iterator, context) + for product in request_iterator: + yield CalculateProductScoreResponse(product=product, score=int(product.product_price * 2)) def DownloadProductImage(self, request, context): return super().DownloadProductImage(request, context) diff --git a/grpc-mate-python/tests/service/test_product_read_servicer.py b/grpc-mate-python/tests/service/test_product_read_servicer.py index 2fed42d..fb29648 100644 --- a/grpc-mate-python/tests/service/test_product_read_servicer.py +++ b/grpc-mate-python/tests/service/test_product_read_servicer.py @@ -6,7 +6,7 @@ from data_store import engine from data_store.db import session_scope from data_store.models import Base, DBProduct -from grpc_mate.product_common_pb2 import InStock +from grpc_mate.product_common_pb2 import InStock, Product from grpc_mate.product_search_engine_pb2 import SearchProductsRequest, DownloadProductsRequest @@ -104,3 +104,18 @@ def test_DownloadProducts_none_exist(grpc_stub): # assert we have 0 items assert len(list(result)) == 0 + + +def product_generator(): + for i in range(0, 5): + yield Product(product_id=i, product_name=f'product_name_{i}', product_price=i, product_status=InStock, + category='category') + + +def test_CalculateProductScore(grpc_stub): + product_iterator = product_generator() + result = grpc_stub.CalculateProductScore(product_iterator) + all_result = list(result) + assert len(all_result) == 5 + for response in all_result: + assert int(response.product.product_price * 2) == response.score diff --git a/grpc-mate-python/tests/service/test_product_update_servicer.py b/grpc-mate-python/tests/service/test_product_update_servicer.py index 3bc779e..3bc2a95 100644 --- a/grpc-mate-python/tests/service/test_product_update_servicer.py +++ b/grpc-mate-python/tests/service/test_product_update_servicer.py @@ -35,7 +35,6 @@ def create_schema(): Base.metadata.drop_all(engine) - def test_UploadProduct_insert_one(grpc_stub): products = [ Product(product_name='product_name_1', product_price=1.0, product_status=InStock, category='category_1')] @@ -61,7 +60,6 @@ def test_UploadProduct_insert_two(grpc_stub): rows = session.query(DBProduct).count() assert rows == 2 - def test_UploadProductResponse_enum(): """ see https://developers.google.com/protocol-buffers/docs/reference/python-generated#enum on how to use enum From 87a393e808a096677e71dd361d5f57eb82e8a7f8 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Fri, 8 Nov 2019 19:52:15 +0800 Subject: [PATCH 39/50] add new items in wiki --- grpc-mate-python/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/grpc-mate-python/README.md b/grpc-mate-python/README.md index 7d8046c..f7aa8c0 100644 --- a/grpc-mate-python/README.md +++ b/grpc-mate-python/README.md @@ -8,3 +8,4 @@ gRPC-Mate demostrate best practice for gRPC based micro service. * [how to use sqlalchemy to persist data](https://www.vipmind.me/programing/python/sqlalchemy-makes-python-orm-easy.html) * [how to use protobuf enum in python](https://www.vipmind.me/programing/python/understand-protobuf-enum-in-python.html) * [how to do client streaming](https://www.vipmind.me/programing/python/how-to-do-grpc-client-stream-upload.html) +* [how to do server streaming](https://www.vipmind.me/programing/python/how-to-do-grpc-server-stream.html) From d4f83e42b9ee46b97d3fa0a02d258065d98bf773 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Fri, 8 Nov 2019 19:52:34 +0800 Subject: [PATCH 40/50] test test_CalculateProductScore --- .../tests/service/test_product_read_servicer.py | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) diff --git a/grpc-mate-python/tests/service/test_product_read_servicer.py b/grpc-mate-python/tests/service/test_product_read_servicer.py index fb29648..b282b08 100644 --- a/grpc-mate-python/tests/service/test_product_read_servicer.py +++ b/grpc-mate-python/tests/service/test_product_read_servicer.py @@ -106,16 +106,5 @@ def test_DownloadProducts_none_exist(grpc_stub): assert len(list(result)) == 0 -def product_generator(): - for i in range(0, 5): - yield Product(product_id=i, product_name=f'product_name_{i}', product_price=i, product_status=InStock, - category='category') - - -def test_CalculateProductScore(grpc_stub): - product_iterator = product_generator() - result = grpc_stub.CalculateProductScore(product_iterator) - all_result = list(result) - assert len(all_result) == 5 - for response in all_result: - assert int(response.product.product_price * 2) == response.score + + From acb435b2b9d64095c5d551ab8f9154e8c485cc7b Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sat, 9 Nov 2019 15:52:46 +0800 Subject: [PATCH 41/50] dev DownloadProductImage --- grpc-mate-python/images/python-grpc.png | Bin 0 -> 39300 bytes .../service/product_read_servicer.py | 13 ++++++++++-- .../service/test_product_read_servicer.py | 20 ++++++++++++++---- 3 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 grpc-mate-python/images/python-grpc.png diff --git a/grpc-mate-python/images/python-grpc.png b/grpc-mate-python/images/python-grpc.png new file mode 100644 index 0000000000000000000000000000000000000000..3d3d2f89a7ebd2dce1835fc08016a9c18e0b3525 GIT binary patch literal 39300 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 Date: Sat, 9 Nov 2019 15:58:40 +0800 Subject: [PATCH 42/50] improve import --- .../tests/service/test_product_read_servicer.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/grpc-mate-python/tests/service/test_product_read_servicer.py b/grpc-mate-python/tests/service/test_product_read_servicer.py index 51e69a5..4162582 100644 --- a/grpc-mate-python/tests/service/test_product_read_servicer.py +++ b/grpc-mate-python/tests/service/test_product_read_servicer.py @@ -1,14 +1,15 @@ -from decimal import Decimal -import os import filecmp +import os +from decimal import Decimal from pathlib import Path + import pytest from faker import Faker from data_store import engine from data_store.db import session_scope from data_store.models import Base, DBProduct -from grpc_mate.product_common_pb2 import InStock, Product +from grpc_mate.product_common_pb2 import InStock from grpc_mate.product_search_engine_pb2 import SearchProductsRequest, DownloadProductsRequest, \ DownloadProductImageRequest From c20318f98cd778a90c6d5afa37e85e3c380aa83e Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Sun, 10 Nov 2019 20:15:28 +0800 Subject: [PATCH 43/50] add new doc --- grpc-mate-python/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/grpc-mate-python/README.md b/grpc-mate-python/README.md index f7aa8c0..c41d083 100644 --- a/grpc-mate-python/README.md +++ b/grpc-mate-python/README.md @@ -9,3 +9,5 @@ gRPC-Mate demostrate best practice for gRPC based micro service. * [how to use protobuf enum in python](https://www.vipmind.me/programing/python/understand-protobuf-enum-in-python.html) * [how to do client streaming](https://www.vipmind.me/programing/python/how-to-do-grpc-client-stream-upload.html) * [how to do server streaming](https://www.vipmind.me/programing/python/how-to-do-grpc-server-stream.html) +* [how to output large binary stream via data chunk](https://www.vipmind.me/programing/python/how-to-output-large-binary-stream-via-data-chunk-in-grpc.html) + From 35dc1945e2508f86d5d60e0600babc2c94ca162d Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Wed, 13 Nov 2019 19:18:48 +0800 Subject: [PATCH 44/50] add read servicer into logger --- grpc-mate-python/server/server.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/grpc-mate-python/server/server.py b/grpc-mate-python/server/server.py index f3e1e30..ff5d969 100644 --- a/grpc-mate-python/server/server.py +++ b/grpc-mate-python/server/server.py @@ -1,13 +1,13 @@ import logging.config -import yaml - from concurrent import futures import grpc +import yaml import grpc_mate.helloworld_pb2_grpc -from service.greeter_servicer import GreeterServicer import grpc_mate.product_search_engine_pb2_grpc +from service.greeter_servicer import GreeterServicer +from service.product_read_servicer import ProductReadServiceServicer from service.product_update_servicer import ProductUpdateServiceServicer # Create a custom logger @@ -23,6 +23,8 @@ def serve(): grpc_mate.helloworld_pb2_grpc.add_GreeterServicer_to_server(GreeterServicer(), server) grpc_mate.product_search_engine_pb2_grpc.add_ProductUpdateServiceServicer_to_server(ProductUpdateServiceServicer(), server) + grpc_mate.product_search_engine_pb2_grpc.add_ProductReadServiceServicer_to_server(ProductReadServiceServicer(), + server) server.add_insecure_port('[::]:8080') server.start() logger.debug('grpc server started at port 8080') From 4479822ad7315737cb16ee2341bf14afb4ea053c Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Thu, 14 Nov 2019 19:00:58 +0800 Subject: [PATCH 45/50] add How to config python log in Grpc Server --- grpc-mate-python/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/grpc-mate-python/README.md b/grpc-mate-python/README.md index c41d083..12a295a 100644 --- a/grpc-mate-python/README.md +++ b/grpc-mate-python/README.md @@ -10,4 +10,5 @@ gRPC-Mate demostrate best practice for gRPC based micro service. * [how to do client streaming](https://www.vipmind.me/programing/python/how-to-do-grpc-client-stream-upload.html) * [how to do server streaming](https://www.vipmind.me/programing/python/how-to-do-grpc-server-stream.html) * [how to output large binary stream via data chunk](https://www.vipmind.me/programing/python/how-to-output-large-binary-stream-via-data-chunk-in-grpc.html) +* [How to config python log in Grpc Server](https://www.vipmind.me/programing/python/how-to-config-python-log-in-grpc-server.html) From fbd08cf0cb707bbc4ddf348ba08ceb32d4fa3bc1 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Wed, 20 Nov 2019 19:01:08 +0800 Subject: [PATCH 46/50] update link in readme --- grpc-mate-java/README.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/grpc-mate-java/README.md b/grpc-mate-java/README.md index 9e0ea22..c2f62b1 100644 --- a/grpc-mate-java/README.md +++ b/grpc-mate-java/README.md @@ -39,7 +39,7 @@ the project will demonstrate an online store search service including * use JsonFormat.Printer to convert proto buffer message into json * use JsonFormat.Parser to parse json into proto buffer #### Simple RPC -* [sample](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java#L23) +* [sample](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java#L23) * we could use JsonFormat.Parser to convert es document into protobuf message ```java Product.Builder builder = Product.newBuilder(); @@ -47,7 +47,7 @@ the project will demonstrate an online store search service including responseBuilder.addProducts(builder.build()); ``` #### Server streaming -* [sample](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java#L39) +* [sample](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java#L39) * with server streaming , user could pass PublishSubject to dao layer to connect the real data with ResponseObserver ```java PublishSubject productPublishSubject = PublishSubject.create(); @@ -60,8 +60,8 @@ PublishSubject productPublishSubject = PublishSubject.create(); disposable.dispose(); ``` #### Client streaming -* [sample](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductUpdateService.java#L29) -* use [RxStreamObserver](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/main/java/io/datanerd/es/service/RxStreamObserver.java) to connect grpc StreamObserver and [rxJava](https://github.com/ReactiveX/RxJava) so that in grpc service, we could use rx style programming +* [sample](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductUpdateService.java#L29) +* use [RxStreamObserver](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/RxStreamObserver.java) to connect grpc StreamObserver and [rxJava](https://github.com/ReactiveX/RxJava) so that in grpc service, we could use rx style programming ```java PublishSubject publishSubject = PublishSubject.create(); publishSubject @@ -77,11 +77,11 @@ PublishSubject publishSubject = PublishSubject.create(); .subscribe(); ``` #### Bi-directional streaming -* [sample](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java#L49) +* [sample](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java#L49) * use grpc's InProcessServer to test grpc service #### Interceptors -* [ClientInterceptor](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/test/java/io/datanerd/es/service/CallerInterceptor.java) -* [ServerInterceptor](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceInterceptor.java) +* [ClientInterceptor](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/CallerInterceptor.java) +* [ServerInterceptor](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/server/ServiceInterceptor.java) #### Transfer Large File * grpc is not designed to transfer large files, but we could leverage stream api to transfer any size of data in binary stream * see protobuf definition below we could use stream api to transfer any size of data in any format @@ -92,8 +92,8 @@ message DataChunk { rpc DownloadProductImage(DownloadProductImageRequest) returns(stream DataChunk){ } ``` -* [Server Side](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java#L125-L145) -* [Client Side](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductReadServiceTest.java#L196-L243) +* [Server Side](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java#L125-L145) +* [Client Side](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/ProductReadServiceTest.java#L196-L243) #### Restful endpoint * use [grpc-gateway](https://github.com/grpc-ecosystem/grpc-gateway) to bridge grpc service to restful endpoint * stream is not supported in http 1.1 @@ -124,10 +124,10 @@ curl -XPOST localhost:7070/grpc/api/v1/echo -d '{"ping":"hello"}' {"pong":"hello"}% ``` ### Promethues integration -* use [Auto Value](https://github.com/google/auto/tree/master/value) to define the value class with builder, see [Metric.java](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/main/java/io/datanerd/es/metrics/Metric.java) -* use [CounterFactory.java](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/main/java/io/datanerd/es/metrics/CounterFactory.java) to normalize Prometheus Counter's path and instance -* use CounterFactory to create counter and use the counter to record service metrics see [ProductReadService.java](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java) -* use [NanoHttpD](https://github.com/NanoHttpd/nanohttpd) based [HttpServer.java](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/main/java/io/datanerd/es/server/HttpServer.java) to serve metrics and grpc health info +* use [Auto Value](https://github.com/google/auto/tree/master/value) to define the value class with builder, see [Metric.java](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/Metric.java) +* use [CounterFactory.java](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/metrics/CounterFactory.java) to normalize Prometheus Counter's path and instance +* use CounterFactory to create counter and use the counter to record service metrics see [ProductReadService.java](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/service/ProductReadService.java) +* use [NanoHttpD](https://github.com/NanoHttpd/nanohttpd) based [HttpServer.java](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/main/java/io/datanerd/es/server/HttpServer.java) to serve metrics and grpc health info ### Kubernetes Deployment * [sample](https://github.com/email2liyang/grpc-mate/tree/master/elasticsearch-service/deployment) * use property file to manage system property and add the system property to configmap, so it's easy to debug program locally by specify the property file from system env. @@ -209,7 +209,7 @@ productDao = mock(ProductDao.class); ``` ### Junit best practice * use [testcontainers-java](https://github.com/testcontainers/testcontainers-java), we could launch any docker image to support any env related class -* it's convenient to use JUnit Rule and ClassRule with docker container for test see [TransportClientProviderTest.java](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/test/java/io/datanerd/es/guice/TransportClientProviderTest.java) for more details +* it's convenient to use JUnit Rule and ClassRule with docker container for test see [TransportClientProviderTest.java](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/guice/TransportClientProviderTest.java) for more details ```java @ClassRule public static final GenericContainer esContainer = @@ -231,7 +231,7 @@ MapConfiguration memoryParams = new MapConfiguration(new HashMap<>()); ); ``` * use toProvider(()->xxx); to avoid dedicated provider logic to execute -* use GrpcServerRule with Junit Rule to start a mock grpc server to test grpc, see [EchoServiceTest](https://github.com/email2liyang/grpc-mate/blob/master/elasticsearch-service/src/test/java/io/datanerd/es/service/EchoServiceTest.java) +* use GrpcServerRule with Junit Rule to start a mock grpc server to test grpc, see [EchoServiceTest](https://github.com/email2liyang/grpc-mate/blob/master/grpc-mate-java/elasticsearch-service/src/test/java/io/datanerd/es/service/EchoServiceTest.java) From e080aa75d467f2905f451ba50d65fd9b0b90fa43 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Tue, 3 Dec 2019 13:37:51 +0800 Subject: [PATCH 47/50] add restful support --- grpc-mate-python/Makefile | 10 ++- grpc-mate-python/container_config/deploy.yaml | 65 +++++++++++++++++++ .../container_config/endpoints/Makefile | 18 +++++ .../container_config/endpoints/endpoint.yaml | 26 ++++++++ grpc-mate-python/container_image/Dockerfile | 21 ++++++ grpc-mate-python/container_image/Makefile | 16 +++++ .../container_image/entrypoint.sh | 2 + grpc-mate-python/grpc_mate/helloworld_pb2.py | 20 +++--- grpc-mate-python/requirements.txt | 7 ++ grpc-mate-python/server/server.py | 3 +- protobuffers/grpc_mate/helloworld.proto | 9 ++- 11 files changed, 185 insertions(+), 12 deletions(-) create mode 100644 grpc-mate-python/container_config/deploy.yaml create mode 100644 grpc-mate-python/container_config/endpoints/Makefile create mode 100644 grpc-mate-python/container_config/endpoints/endpoint.yaml create mode 100644 grpc-mate-python/container_image/Dockerfile create mode 100644 grpc-mate-python/container_image/Makefile create mode 100755 grpc-mate-python/container_image/entrypoint.sh create mode 100644 grpc-mate-python/requirements.txt diff --git a/grpc-mate-python/Makefile b/grpc-mate-python/Makefile index 061be92..16a15d8 100644 --- a/grpc-mate-python/Makefile +++ b/grpc-mate-python/Makefile @@ -10,4 +10,12 @@ protoc: touch google/api/__init__.py pytest: - pytest --grpc-fake-server \ No newline at end of file + pytest --grpc-fake-server + +clean: + find data_store/ google/ grpc_mate/ server/ service/ -name "__pycache__" -type d -exec rm -r "{}" \; +tar: + mkdir -p target/ + rm -fR target/* + tar cvf grpc-mate-python.tar data_store/ google/ grpc_mate/ server/ service/ requirements.txt + mv grpc-mate-python.tar target/ \ No newline at end of file diff --git a/grpc-mate-python/container_config/deploy.yaml b/grpc-mate-python/container_config/deploy.yaml new file mode 100644 index 0000000..f7f3b04 --- /dev/null +++ b/grpc-mate-python/container_config/deploy.yaml @@ -0,0 +1,65 @@ +apiVersion: extensions/v1beta1 +kind: Deployment +metadata: + name: grpc-mate-python +spec: + replicas: 1 + template: + metadata: + labels: + app: grpc-mate-python + spec: + imagePullSecrets: + - name: face-staging-docker-registry + containers: + - name: grpc-mate-python + image: us.gcr.io/face-staging/grpc-mate-python:1.0.0 + imagePullPolicy: Always + resources: + requests: + memory: 128Mi + readinessProbe: + exec: + command: + - /bin/bash + - -c + - ps -ef | grep server | grep -v "grep" + initialDelaySeconds: 8 + timeoutSeconds: 10 + livenessProbe: + exec: + command: + - /bin/bash + - -c + - ps -ef | grep server | grep -v "grep" + initialDelaySeconds: 60 + timeoutSeconds: 10 + ports: + - name: grpc + containerPort: 8080 + env: + - name: GOOGLE_APPLICATION_CREDENTIALS + value: /etc/appconfig/face-prod-ops.json + volumeMounts: + - name: google-face-prod-ops-service-account-key + mountPath: /etc/appconfig + - name: esp + image: gcr.io/endpoints-release/endpoints-runtime:1 + args: [ + "--http_port=9000", + "--backend=grpc://127.0.0.1:8080", + "--service=greeter.endpoints.face-prod.cloud.goog", + "--version=2019-12-03r0", + "--service_account_key=/etc/nginx/creds/face-prod-ops.json" + ] + ports: + - name: http + containerPort: 9000 + volumeMounts: + - mountPath: /etc/nginx/creds + name: google-face-prod-ops-service-account-key + readOnly: true + volumes: + - name: google-face-prod-ops-service-account-key + secret: + secretName: google-face-prod-ops-service-account-key diff --git a/grpc-mate-python/container_config/endpoints/Makefile b/grpc-mate-python/container_config/endpoints/Makefile new file mode 100644 index 0000000..a7b510f --- /dev/null +++ b/grpc-mate-python/container_config/endpoints/Makefile @@ -0,0 +1,18 @@ +build: clean + protoc --include_imports \ + --proto_path=../../protobuffers \ + --descriptor_set_out helloworld.pb \ + ../../protobuffers/grpc_mate/helloworld.proto + +config_list: + rm ../../.python-version + gcloud endpoints configs list --service greeter.endpoints.face-prod.cloud.goog + echo "3.6.8" > ../../.python-version + +clean: + rm -f *.pb + +update_prod_spec: build + rm ../../.python-version + gcloud endpoints services deploy helloworld.pb endpoint.yaml + echo "3.6.8" > ../../.python-version \ No newline at end of file diff --git a/grpc-mate-python/container_config/endpoints/endpoint.yaml b/grpc-mate-python/container_config/endpoints/endpoint.yaml new file mode 100644 index 0000000..5a6775f --- /dev/null +++ b/grpc-mate-python/container_config/endpoints/endpoint.yaml @@ -0,0 +1,26 @@ +# The configuration schema is defined by service.proto file +# https://github.com/googleapis/googleapis/blob/master/google/api/service.proto +type: google.api.Service +config_version: 3 + +# +# Name of the service config +# +name: greeter.endpoints.face-prod.cloud.goog + +# +# API title for user interface (Google Cloud Console). +# +title: grpc mate python API + +apis: +- name: Greeter + +endpoints: +- name: greeter.endpoints.face-prod.cloud.goog + allow_cors: true + +usage: + rules: + - selector: "*" + allow_unregistered_calls: true \ No newline at end of file diff --git a/grpc-mate-python/container_image/Dockerfile b/grpc-mate-python/container_image/Dockerfile new file mode 100644 index 0000000..d95c54b --- /dev/null +++ b/grpc-mate-python/container_image/Dockerfile @@ -0,0 +1,21 @@ +FROM centos:7 + +RUN yum update -y +RUN yum install -y sudo curl wget unzip +RUN yum install yum-utils –y +RUN yum install -y python36 python36-libs python36-devel python36-pip + +RUN mkdir /app +WORKDIR /app + +COPY grpc-mate-python.tar /app +RUN tar xvf /app/grpc-mate-python.tar -C /app +RUN pip3 install -r /app/requirements.txt +ENV PYTHONPATH=. + +EXPOSE 8080 + +CMD ["python3","server/server.py"] +#COPY entrypoint.sh /entrypoint.sh +#RUN chmod +x /entrypoint.sh +#ENTRYPOINT ["/entrypoint.sh"] \ No newline at end of file diff --git a/grpc-mate-python/container_image/Makefile b/grpc-mate-python/container_image/Makefile new file mode 100644 index 0000000..fc5b287 --- /dev/null +++ b/grpc-mate-python/container_image/Makefile @@ -0,0 +1,16 @@ +build: + rm -f grpc-mate-python.tar + cp ../target/grpc-mate-python.tar . + docker build -t us.gcr.io/face-staging/grpc-mate-python:1.0.0 . + +push: + docker push us.gcr.io/face-staging/grpc-mate-python:1.0.0 + +run: + docker run --name grpc-mate-python -p 8080:8080 -d us.gcr.io/face-staging/grpc-mate-python:1.0.0 + +rm: + docker rm -f grpc-mate-python + +shell: run + docker exec -it grpc-mate-python bash \ No newline at end of file diff --git a/grpc-mate-python/container_image/entrypoint.sh b/grpc-mate-python/container_image/entrypoint.sh new file mode 100755 index 0000000..0c382cc --- /dev/null +++ b/grpc-mate-python/container_image/entrypoint.sh @@ -0,0 +1,2 @@ +#!/usr/bin/env bash +while true; do sleep 30; done; \ No newline at end of file diff --git a/grpc-mate-python/grpc_mate/helloworld_pb2.py b/grpc-mate-python/grpc_mate/helloworld_pb2.py index ac9e530..d0afdfa 100644 --- a/grpc-mate-python/grpc_mate/helloworld_pb2.py +++ b/grpc-mate-python/grpc_mate/helloworld_pb2.py @@ -13,6 +13,7 @@ _sym_db = _symbol_database.Default() +from google.api import annotations_pb2 as google_dot_api_dot_annotations__pb2 DESCRIPTOR = _descriptor.FileDescriptor( @@ -20,8 +21,9 @@ package='', syntax='proto3', serialized_options=_b('\n io.datanerd.generated.helloworldP\001'), - serialized_pb=_b('\n\x1agrpc_mate/helloworld.proto\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t23\n\x07Greeter\x12(\n\x08SayHello\x12\r.HelloRequest\x1a\x0b.HelloReply\"\x00\x42$\n io.datanerd.generated.helloworldP\x01\x62\x06proto3') -) + serialized_pb=_b('\n\x1agrpc_mate/helloworld.proto\x1a\x1cgoogle/api/annotations.proto\"\x1c\n\x0cHelloRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\x1d\n\nHelloReply\x12\x0f\n\x07message\x18\x01 \x01(\t2S\n\x07Greeter\x12H\n\x08SayHello\x12\r.HelloRequest\x1a\x0b.HelloReply\" \x82\xd3\xe4\x93\x02\x1a\"\x15/api/v1/greeter/hello:\x01*B$\n io.datanerd.generated.helloworldP\x01\x62\x06proto3') + , + dependencies=[google_dot_api_dot_annotations__pb2.DESCRIPTOR,]) @@ -52,8 +54,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=30, - serialized_end=58, + serialized_start=60, + serialized_end=88, ) @@ -83,8 +85,8 @@ extension_ranges=[], oneofs=[ ], - serialized_start=60, - serialized_end=89, + serialized_start=90, + serialized_end=119, ) DESCRIPTOR.message_types_by_name['HelloRequest'] = _HELLOREQUEST @@ -114,8 +116,8 @@ file=DESCRIPTOR, index=0, serialized_options=None, - serialized_start=91, - serialized_end=142, + serialized_start=121, + serialized_end=204, methods=[ _descriptor.MethodDescriptor( name='SayHello', @@ -124,7 +126,7 @@ containing_service=None, input_type=_HELLOREQUEST, output_type=_HELLOREPLY, - serialized_options=None, + serialized_options=_b('\202\323\344\223\002\032\"\025/api/v1/greeter/hello:\001*'), ), ]) _sym_db.RegisterServiceDescriptor(_GREETER) diff --git a/grpc-mate-python/requirements.txt b/grpc-mate-python/requirements.txt new file mode 100644 index 0000000..1852465 --- /dev/null +++ b/grpc-mate-python/requirements.txt @@ -0,0 +1,7 @@ +-i https://pypi.org/simple +grpcio-tools==1.24.3 +grpcio==1.24.3 +protobuf==3.10.0 +pyyaml==5.1.2 +six==1.12.0 +sqlalchemy==1.3.10 diff --git a/grpc-mate-python/server/server.py b/grpc-mate-python/server/server.py index ff5d969..d54e221 100644 --- a/grpc-mate-python/server/server.py +++ b/grpc-mate-python/server/server.py @@ -1,5 +1,6 @@ import logging.config from concurrent import futures +from pathlib import Path import grpc import yaml @@ -11,7 +12,7 @@ from service.product_update_servicer import ProductUpdateServiceServicer # Create a custom logger -with open('logging.yaml', 'r') as f: +with Path(__file__).resolve().parent.joinpath('logging.yaml').open('r') as f: config = yaml.safe_load(f.read()) logging.config.dictConfig(config) diff --git a/protobuffers/grpc_mate/helloworld.proto b/protobuffers/grpc_mate/helloworld.proto index f03ed12..689d973 100644 --- a/protobuffers/grpc_mate/helloworld.proto +++ b/protobuffers/grpc_mate/helloworld.proto @@ -2,10 +2,17 @@ syntax = "proto3"; option java_package = "io.datanerd.generated.helloworld"; option java_multiple_files = true; +import "google/api/annotations.proto"; + // The greeting service definition. service Greeter { // Sends a greeting - rpc SayHello (HelloRequest) returns (HelloReply) {} + rpc SayHello (HelloRequest) returns (HelloReply) { + option (google.api.http) = { + post: "/api/v1/greeter/hello" + body: "*" + }; + } } // The request message containing the user's name. From e0c44394fd37c4398a15b5c812ba8b1c4d1ae43b Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Tue, 10 Dec 2019 20:25:59 +0800 Subject: [PATCH 48/50] add pytest-cov --- grpc-mate-python/Pipfile | 1 + grpc-mate-python/Pipfile.lock | 368 +++++++++++++++++++--------------- grpc-mate-python/pytest.ini | 4 + 3 files changed, 207 insertions(+), 166 deletions(-) create mode 100644 grpc-mate-python/pytest.ini diff --git a/grpc-mate-python/Pipfile b/grpc-mate-python/Pipfile index e6261f7..3c470b7 100644 --- a/grpc-mate-python/Pipfile +++ b/grpc-mate-python/Pipfile @@ -7,6 +7,7 @@ verify_ssl = true faker = "*" v = {editable = true,version = "*"} pytest-grpc = "*" +pytest-cov = "*" [packages] grpcio = "*" diff --git a/grpc-mate-python/Pipfile.lock b/grpc-mate-python/Pipfile.lock index 942a032..3a8beac 100644 --- a/grpc-mate-python/Pipfile.lock +++ b/grpc-mate-python/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "c1d06d026e32295b043809e896a091125df55674b8a7f33ba42c575f2a627bc0" + "sha256": "021f97bb4506bc71fa600c2c366facdb1d7c37c29f761fa246a33408d393cadd" }, "pipfile-spec": 6, "requires": { @@ -18,176 +18,167 @@ "default": { "grpcio": { "hashes": [ - "sha256:01cb705eafba1108e2a947ba0457da4f6a1e8142c729fc61702b5fdd11009eb1", - "sha256:0b5a79e29f167d3cd06faad6b15babbc2661066daaacf79373c3a8e67ca1fca1", - "sha256:1097a61a0e97b3580642e6e1460a3a1f1ba1815e2a70d6057173bcc495417076", - "sha256:13970e665a4ec4cec7d067d7d3504a0398c657d91d26c581144ad9044e429c9a", - "sha256:1557817cea6e0b87fad2a3e20da385170efb03a313db164e8078955add2dfa1b", - "sha256:1b0fb036a2f9dd93d9a35c57c26420eeb4b571fcb14b51cddf5b1e73ea5d882b", - "sha256:24d9e58d08e8cd545d8a3247a18654aff0e5e60414701696a8098fbb0d792b75", - "sha256:2c38b586163d2b91567fe5e6d9e7798f792012365adc838a64b66b22dce3f4d4", - "sha256:2df3ab4348507de60e1cbf75196403df1b9b4c4d4dc5bd11ac4eb63c46f691c7", - "sha256:32f70f7c90454ea568b868af2e96616743718d9233d23f62407e98caed81dfbf", - "sha256:3af2a49d576820045c9c880ff29a5a96d020fe31b35d248519bfc6ccb8be4eac", - "sha256:4ff7d63800a63db031ebac6a6f581ae84877c959401c24c28f2cc51fd36c47ad", - "sha256:502aaa8be56f0ae69cda66bc27e1fb5531ceaa27ca515ec3c34f6178b1297180", - "sha256:55358ce3ec283222e435f7dbc6603521438458f3c65f7c1cb33b8dabf56d70d8", - "sha256:5583b01c67f85fa64a2c3fb085e5517c88b9c1500a2cce12d473cd99d0ed2e49", - "sha256:58d9a5557d3eb7b734a3cea8b16c891099a522b3953a45a30bd4c034f75fc913", - "sha256:5911f042c4ab177757eec5bcb4e2e9a2e823d888835d24577321bf55f02938fa", - "sha256:5e16ea922f4e5017c04fd94e2639b1006e03097e9dd0cbb7a1c852af3ea8bf2e", - "sha256:656e19d3f1b9050ee01b457f92838a9679d7cf84c995f708780f44484048705e", - "sha256:6a1435449a82008c451c7e1a82a834387b9108f9a8d27910f86e7c482f5568e9", - "sha256:6ff02ca6cbed0ddb76e93ba0f8beb6a8c77d83a84eb7cafe2ae3399a8b9d69ea", - "sha256:76de68f60102f333bf4817f38e81ecbee68b850f5a5da9f355235e948ac40981", - "sha256:7c6d7ddd50fc6548ea1dfe09c62509c4f95b8b40082287747be05aa8feb15ee2", - "sha256:836b9d29507de729129e363276fe7c7d6a34c7961e0f155787025552b15d22c0", - "sha256:869242b2baf8a888a4fe0548f86abc47cb4b48bdfd76ae62d6456e939c202e65", - "sha256:8954b24bd08641d906ee50b2d638efc76df893fbd0913149b80484fd0eac40c9", - "sha256:8cdea65d1abb2e698420db8daf20c8d272fbd9d96a51b26a713c1c76f237d181", - "sha256:90161840b4fe9636f91ed0d3ea1e7e615e488cbea4e77594c889e5f3d7a776db", - "sha256:90fb6316b4d7d36700c40db4335902b78dcae13b5466673c21fd3b08a3c1b0c6", - "sha256:91b34f58db2611c9a93ecf751028f97fba1f06e65f49b38f272f6aa5d2977331", - "sha256:9474944a96a33eb8734fa8dc5805403d57973a3526204a5e1c1780d02e0572b6", - "sha256:9a36275db2a4774ac16c6822e7af816ee048071d5030b4c035fd53942b361935", - "sha256:9cbe26e2976b994c5f7c2d35a63354674d6ca0ce62f5b513f078bf63c1745229", - "sha256:9eaeabb3c0eecd6ddd0c16767fd12d130e2cebb8c2618f959a278b1ff336ddc3", - "sha256:a2bc7e10ebcf4be503ae427f9887e75c0cc24e88ce467a8e6eaca6bd2862406e", - "sha256:a5b42e6292ba51b8e67e09fc256963ba4ca9c04026de004d2fe59cc17e3c3776", - "sha256:bd6ec1233c86c0b9bb5d03ec30dbe3ffbfa53335790320d99a7ae9018c5450f2", - "sha256:bef57530816af54d66b1f4c70a8f851f320cb6f84d4b5a0b422b0e9811ea4e59", - "sha256:c146a63eaadc6589b732780061f3c94cd0574388d372baccbb3c1597a9ebdb7a", - "sha256:c2efd3b130dc639d615b6f58980e1bfd1b177ad821f30827afa5001aa30ddd48", - "sha256:c888b18f7392e6cc79a33a803e7ebd7890ac3318f571fca6b356526f35b53b12", - "sha256:ca30721fda297ae22f16bc37aa7ed244970ddfdcb98247570cdd26daaad4665e", - "sha256:cf5f5340dd682ab034baa52f423a0f91326489c262ac9617fa06309ec05880e9", - "sha256:d0726aa0d9b57c56985db5952e90fb1033a317074f2877db5307cdd6eede1564", - "sha256:df442945b2dd6f8ae0e20b403e0fd4548cd5c2aad69200047cc3251257b78f65", - "sha256:e08e758c31919d167c0867539bd3b2441629ef00aa595e3ea2b635273659f40a", - "sha256:e4864339deeeaefaad34dd3a432ee618a039fca28efb292949c855e00878203c", - "sha256:f4cd049cb94d9f517b1cab5668a3b345968beba093bc79a637e671000b3540ec" + "sha256:0419ae5a45f49c7c40d9ae77ae4de9442431b7822851dfbbe56ee0eacb5e5654", + "sha256:1e8631eeee0fb0b4230aeb135e4890035f6ef9159c2a3555fa184468e325691a", + "sha256:24db2fa5438f3815a4edb7a189035051760ca6aa2b0b70a6a948b28bfc63c76b", + "sha256:2adb1cdb7d33e91069517b41249622710a94a1faece1fed31cd36904e4201cde", + "sha256:2cd51f35692b551aeb1fdeb7a256c7c558f6d78fcddff00640942d42f7aeba5f", + "sha256:3247834d24964589f8c2b121b40cd61319b3c2e8d744a6a82008643ef8a378b1", + "sha256:3433cb848b4209717722b62392e575a77a52a34d67c6730138102abc0a441685", + "sha256:39671b7ff77a962bd745746d9d2292c8ed227c5748f16598d16d8631d17dd7e5", + "sha256:40a0b8b2e6f6dd630f8b267eede2f40a848963d0f3c40b1b1f453a4a870f679e", + "sha256:40f9a74c7aa210b3e76eb1c9d56aa8d08722b73426a77626967019df9bbac287", + "sha256:423f76aa504c84cb94594fb88b8a24027c887f1c488cf58f2173f22f4fbd046c", + "sha256:43bd04cec72281a96eb361e1b0232f0f542b46da50bcfe72ef7e5a1b41d00cb3", + "sha256:43e38762635c09e24885d15e3a8e374b72d105d4178ee2cc9491855a8da9c380", + "sha256:4413b11c2385180d7de03add6c8845dd66692b148d36e27ec8c9ef537b2553a1", + "sha256:4450352a87094fd58daf468b04c65a9fa19ad11a0ac8ac7b7ff17d46f873cbc1", + "sha256:49ffda04a6e44de028b3b786278ac9a70043e7905c3eea29eed88b6524d53a29", + "sha256:4a38c4dde4c9120deef43aaabaa44f19186c98659ce554c29788c4071ab2f0a4", + "sha256:50b1febdfd21e2144b56a9aa226829e93a79c354ef22a4e5b013d9965e1ec0ed", + "sha256:559b1a3a8be7395ded2943ea6c2135d096f8cc7039d6d12127110b6496f251fe", + "sha256:5de86c182667ec68cf84019aa0d8ceccf01d352cdca19bf9e373725204bdbf50", + "sha256:5fc069bb481fe3fad0ba24d3baaf69e22dfa6cc1b63290e6dfeaf4ac1e996fb7", + "sha256:6a19d654da49516296515d6f65de4bbcbd734bc57913b21a610cfc45e6df3ff1", + "sha256:7535b3e52f498270e7877dde1c8944d6b7720e93e2e66b89c82a11447b5818f5", + "sha256:7c4e495bcabc308198b8962e60ca12f53b27eb8f03a21ac1d2d711d6dd9ecfca", + "sha256:8a8fc4a0220367cb8370cedac02272d574079ccc32bffbb34d53aaf9e38b5060", + "sha256:8b008515e067232838daca020d1af628bf6520c8cc338bf383284efe6d8bd083", + "sha256:8d1684258e1385e459418f3429e107eec5fb3d75e1f5a8c52e5946b3f329d6ea", + "sha256:8eb5d54b87fb561dc2e00a5c5226c33ffe8dbc13f2e4033a412bafb7b37b194d", + "sha256:94cdef0c61bd014bb7af495e21a1c3a369dd0399c3cd1965b1502043f5c88d94", + "sha256:9d9f3be69c7a5e84c3549a8c4403fa9ac7672da456863d21e390b2bbf45ccad1", + "sha256:9fb6fb5975a448169756da2d124a1beb38c0924ff6c0306d883b6848a9980f38", + "sha256:a5eaae8700b87144d7dfb475aa4675e500ff707292caba3deff41609ddc5b845", + "sha256:aaeac2d552772b76d24eaff67a5d2325bc5205c74c0d4f9fbe71685d4a971db2", + "sha256:bb611e447559b3b5665e12a7da5160c0de6876097f62bf1d23ba66911564868e", + "sha256:bc0d41f4eb07da8b8d3ea85e50b62f6491ab313834db86ae2345be07536a4e5a", + "sha256:bf51051c129b847d1bb63a9b0826346b5f52fb821b15fe5e0d5ef86f268510f5", + "sha256:c948c034d8997526011960db54f512756fb0b4be1b81140a15b4ef094c6594a4", + "sha256:d435a01334157c3b126b4ee5141401d44bdc8440993b18b05e2f267a6647f92d", + "sha256:d46c1f95672b73288e08cdca181e14e84c6229b5879561b7b8cfd48374e09287", + "sha256:d5d58309b42064228b16b0311ff715d6c6e20230e81b35e8d0c8cfa1bbdecad8", + "sha256:dc6e2e91365a1dd6314d615d80291159c7981928b88a4c65654e3fefac83a836", + "sha256:e0dfb5f7a39029a6cbec23affa923b22a2c02207960fd66f109e01d6f632c1eb", + "sha256:eb4bf58d381b1373bd21d50837a53953d625d1693f1b58fed12743c75d3dd321", + "sha256:ebb211a85248dbc396b29320273c1ffde484b898852432613e8df0164c091006", + "sha256:ec759ece4786ae993a5b7dc3b3dead6e9375d89a6c65dfd6860076d2eb2abe7b", + "sha256:f55108397a8fa164268238c3e69cc134e945d1f693572a2f05a028b8d0d2b837", + "sha256:f6c706866d424ff285b85a02de7bbe5ed0ace227766b2c42cbe12f3d9ea5a8aa", + "sha256:f8370ad332b36fbad117440faf0dd4b910e80b9c49db5648afd337abdde9a1b6" ], "index": "pypi", - "version": "==1.24.3" + "version": "==1.25.0" }, "grpcio-tools": { "hashes": [ - "sha256:02b527b1e05f9ad446b0b70d5c4615493a93aab3ddf9ca1495939f97a6df9de9", - "sha256:06e92200d48e45d91ff04ebc833481c47273227df7538e3abc8917f0df57c73b", - "sha256:107f5b81190193b5032a60c55483be3f8cbb0a0951c5ba6a1c2d2e7d6c720cd6", - "sha256:12a9aba25bf9f7015f39cf22437a4f29974878a8e8623f33e3069e168926c752", - "sha256:12c251d48c217502b9c092c4450d9f1bfe81c049934ad4e31de1cb71814798a4", - "sha256:14ff158a7994f3d938593834cc2c8fd375ad8cc7768821d56353ffa02015e995", - "sha256:177bdfecf5c3093fdc4ca7599a7065ce867ccea8e2d401378e5411d6d7c5634b", - "sha256:1ecaa56b142bdc8548c9545def4cf3ca5e1eabda5d90bd48cd52e18368e07cc5", - "sha256:23caa6a0268247d5644a73b5595740c78f39b0376523f0bc84b25778c34aee5a", - "sha256:269a353037a99a03637fef1174ece25e9334bdace4b5f7a393374d439ecc7133", - "sha256:275ad665a40622d53d1ed1ddbb8f7973c16a3569c6b5a9530876c2b2bbf5ca2b", - "sha256:27f4750251a49227e5aa66f562a021cefe5844297b62975a9509bcbba35b7194", - "sha256:2cb00f6d504d48b9adccbb30c181b6e9e90c891d13d85d832c841042253c11bd", - "sha256:2ce979dc1dfce40be30c76af7f7257f85ca81d291f6eb4c943fb9ad26333183f", - "sha256:38edeed6e516337db581a6943f7cbaf2f284ba1df80811e1667f267752be0153", - "sha256:422407165166f48c65885ee7b251c6fe71f9475877389ae6cb88d48c539419a0", - "sha256:4b933a26fb0c7e724a571a6e48d25f02aa1fa0acedce58ca8dd768d555c21129", - "sha256:4f935a365ab7e9bcd2f1f4455965704f06212e2cea3e32d5b8453f9ba4852880", - "sha256:5005776a674867072b57fbb07e4f74ef60fefbbae2c2bddb15b9f64a119cebf4", - "sha256:559eee2e579a85981ee9461a64213e130653c3e213689e1fd8b9bf60330a58c7", - "sha256:5efc92721a364e049ad3a174d5b20a21009fae9db04b3e5020ed0b534d9c022f", - "sha256:63395b9216444bb1d83728d6e7bad4178da4eee667655c4e8305de13d78fd10f", - "sha256:65433b58a592da216d01e877a4d5766a341bb32b58d384dabeb093496056b228", - "sha256:6bb3ba89b5134e2b38749aefcf3206fce7a6c30cdcce9e14938d5d792a6c07e1", - "sha256:7a98160c255e38b7a99cc27b2f1c925ef7d8ec4a615ad9ef67ca346372818523", - "sha256:7fd5daecba6eb1bad14854aec933f992d84ca702e766789bc60cef6c6a3c3077", - "sha256:8889079e97f0e08097d81201097e00b32d67324bcfd61ddd3c42734b440a1f86", - "sha256:89426e7157ba45c1fd64e94456b50e2120f70031427c5f686af783dd9a10f258", - "sha256:896a58626d04df9f80dc156abca582dfa7b1de3ed64b4b2f212faedff19cb9d0", - "sha256:8b8195098afc83cca778af37fe8eebffb4d13f440ddaed8e42ecc5212912e82f", - "sha256:8f32aaeef3f21273dd8a1d2127ceae4da9c32a3df924627500c9b15b2bec3c5e", - "sha256:91d1455213e76dc884a6210eb3465b08a99e6861515c169ead0725e6d21f2502", - "sha256:9a9d3ba59bddd9bf24b931f79f7e5675dec1850a3e5e3f33d408648e4489c9be", - "sha256:9ac91409150f0e9a5f6fb6bacb022b578a52601db638bb4305fe89acdf5be46e", - "sha256:9c22bf4b2e6c214fe44dca8976b58090ec10ee5d6f8e2856a51a05f44347cad3", - "sha256:b1f537e528abb3be681a9735fa110b641e33b9fb83e0b61c777e1dd7df71d73e", - "sha256:b837da888d2af02755aaa386012450a171e069c3d738e282b69a020f7551fe39", - "sha256:bf19f2940a99a0a45218c6063c7a7fc23a696077b8c48f78496231f018f4a329", - "sha256:bf8332d68096eac48572d783133d733f8fac2e3a5de4ef5a1bfcc47648b1fa5c", - "sha256:c6b31d51bdeae6dfce880c1675e189ca86311f8632ebb4616bb43448a5e7ffa8", - "sha256:d08e4870c4285ba275e7b1f509c6f92b3f1fe25a5a11268268d63d0ab96febdb", - "sha256:de9ef57eff471e6314db7723545c84988a495755d7097ed2052b37612e6f8836", - "sha256:e37ad8f060cfdd214395221d73262628837747ee09f44537d7ded364df91eabd", - "sha256:e7e97bca1eeb3795594e5f16ea8c08359fdc9242e6057858b7a692dd22b10f18", - "sha256:e96b0fbbb32ebc85e810d5bdd00b1e325f1da3fc47b668752cee8bde00749fec", - "sha256:e9923b323ec3a58018829110faed8c43e3a0655a58312735b597e4cf8f685b99", - "sha256:eb13439cefe14b347390271b47c5eac390fcc3bb04318c870fe1a26173fe5e3f", - "sha256:fd4c3b38134be7b8fc6caffa42b83c7314ceb62baa8b7e1682d31969523d5014" + "sha256:007c075eb9611379fa8f520a1865b9afd850469495b0e4a46e1349b2dc1744ce", + "sha256:02ae9708bdd3f329b1abe1ee16b1d768b2dd7a036a8a57e342d08ee8ca054cec", + "sha256:2f10226bfea4f947de355008b14fb4711c85fc1121570833a96f0e2cd8de580f", + "sha256:314354c7321c84a6e176a99afe1945c933b8a38b4f837255c8decfef8d07f24e", + "sha256:406b530c283a2bb804a10ee97928290b0b60788cd114ddfce0faa681cccfe4b8", + "sha256:49e7682e505e6a1d35459dae1d8a616a08d5cfa6f05de00235aff2e15786af14", + "sha256:4a5c2b38078fc4b949e4e70f7e25cb80443d1ee9a648ce4223aa3c040a0d3b9b", + "sha256:4b40291d67a1fecb5170ed9ec32016e2ae07908a8fa143d2d37311b2bcbeb2c5", + "sha256:4b72b04cba6ecd1940d6eda07886f80fe71fb2e669f1095ebab58b1eb17a53fa", + "sha256:4cc95d5fddebb9348fafcc4c0147745882794ded7cfd5282b2aa158596c77a8a", + "sha256:4ce0261bd4426482a96467ed9ad8411417a6932c331a5bb35aa1907f618f34f6", + "sha256:5226371a2b569c62be0d0590ccff7bbb9566762f243933efbd4b695f9f108cd5", + "sha256:52aab4cbab10683f8830420c0b55ccdc6344702b4a0940913d71fe928dd731c9", + "sha256:532a19419535a92a1b621222f70d6da7624151fe69afa4a1063be56e7a2b884a", + "sha256:5a8d44add097e0a3a7c27e66a8ed0aa2fd561cda77381e818cf7862d4ad0f629", + "sha256:64f6027887e32a938f00b2344c337c6d4f7c4cf157ec2e84b1dd6b6fddad8e50", + "sha256:651b0441e8d8f302b44fb50397fe73dcd5e61b790533438e690055abdef3b234", + "sha256:67d12ec4548dd2b1f15c9e3a953c8f48d8c3441c2d8bd143fc3af95a1c041c2b", + "sha256:6c029341132a0e64cbd2dba1dda9a125e06a798b9ec864569afdecce626dd5d5", + "sha256:6e64214709f37b347875ac83cfed4e9cfd287f255dab2836521f591620412c40", + "sha256:6f70fc9a82a0145296358720cf24f83a657a745e8b51ec9564f4c9e678c5b872", + "sha256:6fb4739eb5eef051945b16b3c434d08653ea05f0313cf88495ced5d9db641745", + "sha256:79b5b1c172dafb0e76aa95bf572d4c7afc0bf97a1669b2228a0bc151071c4666", + "sha256:7d02755480cec3c0222f35397e810bfaf4cf9f2bf2e626f7f6efc1d40fffb7fa", + "sha256:818f2b8168760cf16e66fe85894a37afcff5378a64939549663a371216618498", + "sha256:834564c2fba02c31179af081bd80aada8dfdcca52c80e241353f6063b6154bd2", + "sha256:8b17347a90a14386641ffe57743bbb01a16a7149c95905364d3c8091ad377bd8", + "sha256:902e13dbaca9733e4668928967b301526197ecffacb8c7a0acc0c7045de8836f", + "sha256:988014c714ca654b3b7ca9f4dabfe487b00e023bfdd9eaf1bb0fed82bf8c4255", + "sha256:9a83d39e198cbed5d093f43790b92945ab74140357ec00e53ae13b421489ffb7", + "sha256:ac7649cff7354d2f04ebe2872f786a1d07547deded61f3d39036ebb569de91bc", + "sha256:b013d93bc6dc5c7bf3642bf30e673daee46f9a4984fbd9588a9cda1071278414", + "sha256:b02701d40f1ccf16bc8c46f56bdbf89e03110bd8fd570c854e72299ce2920c35", + "sha256:b0ef0da2eec959def8ba508b2a763c492f1fb989446a422d1456ac17dc1b19f4", + "sha256:bb8264ccf8ff904a1a396dc757ac1560b24f270b90e7dabb0ae3f637cb351bb3", + "sha256:bbfb58f5c0aa27b599141bb5eacaf8116b55ad89bc5a2c3afd5e965d840ad341", + "sha256:c1a482fdd8952a7f0098f78161a4deef8a500e54babef302548cd9f1e326d42c", + "sha256:c40efc662fa037898488e31756242af68a8ab5729f939bc8c9ba259bc32e7d6a", + "sha256:c5ad07adae3fe62761bc662c554c2734203f0f700616fc58138b852a7ef5e40e", + "sha256:c765512cb5cb4afaf652837b8cc69229dee14c8e92f15a6ea0f4dfd646902dd2", + "sha256:c871f5a89012ae44d9233305d74dfdd2059a78f0cb0303d38a4b6a562c6f9ba7", + "sha256:cc950fb17c1172d0c0129e8c6e787206e7ef8c24a8e39005f8cc297e9faa4f9a", + "sha256:d3619b43009a5c82cb7ef11847518236140d7ffdcc6600e1a151b8b49350693a", + "sha256:dc17a8a8b39cb37380d927d4669882af4ccc7d3ee298a15a3004f4b18ecd2ac3", + "sha256:eab3684ce9dec3a934a36ba79e8435210d07c50906425ab157eeb4b14503a925", + "sha256:f258b32dffd27ef1eb5f5f01ebb115dfad07677b0510b41f786c511a62ded033", + "sha256:f550c94728b67a7eeddc35b03c99552f2d7aac09c52935ad4b0552d0843fd03c", + "sha256:f7fc690a517c8f3765796ed005bb3273895a985a8593977291bad24568e018e3" ], "index": "pypi", - "version": "==1.24.3" + "version": "==1.25.0" }, "protobuf": { "hashes": [ - "sha256:125713564d8cfed7610e52444c9769b8dcb0b55e25cc7841f2290ee7bc86636f", - "sha256:1accdb7a47e51503be64d9a57543964ba674edac103215576399d2d0e34eac77", - "sha256:27003d12d4f68e3cbea9eb67427cab3bfddd47ff90670cb367fcd7a3a89b9657", - "sha256:3264f3c431a631b0b31e9db2ae8c927b79fc1a7b1b06b31e8e5bcf2af91fe896", - "sha256:3c5ab0f5c71ca5af27143e60613729e3488bb45f6d3f143dc918a20af8bab0bf", - "sha256:45dcf8758873e3f69feab075e5f3177270739f146255225474ee0b90429adef6", - "sha256:56a77d61a91186cc5676d8e11b36a5feb513873e4ae88d2ee5cf530d52bbcd3b", - "sha256:5984e4947bbcef5bd849d6244aec507d31786f2dd3344139adc1489fb403b300", - "sha256:6b0441da73796dd00821763bb4119674eaf252776beb50ae3883bed179a60b2a", - "sha256:6f6677c5ade94d4fe75a912926d6796d5c71a2a90c2aeefe0d6f211d75c74789", - "sha256:84a825a9418d7196e2acc48f8746cf1ee75877ed2f30433ab92a133f3eaf8fbe", - "sha256:b842c34fe043ccf78b4a6cf1019d7b80113707d68c88842d061fa2b8fb6ddedc", - "sha256:ca33d2f09dae149a1dcf942d2d825ebb06343b77b437198c9e2ef115cf5d5bc1", - "sha256:db83b5c12c0cd30150bb568e6feb2435c49ce4e68fe2d7b903113f0e221e58fe", - "sha256:f50f3b1c5c1c1334ca7ce9cad5992f098f460ffd6388a3cabad10b66c2006b09", - "sha256:f99f127909731cafb841c52f9216e447d3e4afb99b17bebfad327a75aee206de" + "sha256:0265379852b9e1f76af6d3d3fe4b3c383a595cc937594bda8565cf69a96baabd", + "sha256:29bd1ed46b2536ad8959401a2f02d2d7b5a309f8e97518e4f92ca6c5ba74dbed", + "sha256:3175d45698edb9a07c1a78a1a4850e674ce8988f20596580158b1d0921d0f057", + "sha256:34a7270940f86da7a28be466ac541c89b6dbf144a6348b9cf7ac6f56b71006ce", + "sha256:38cbc830a4a5ba9956763b0f37090bfd14dd74e72762be6225de2ceac55f4d03", + "sha256:665194f5ad386511ac8d8a0bd57b9ab37b8dd2cd71969458777318e774b9cd46", + "sha256:839bad7d115c77cdff29b488fae6a3ab503ce9a4192bd4c42302a6ea8e5d0f33", + "sha256:934a9869a7f3b0d84eca460e386fba1f7ba2a0c1a120a2648bc41fadf50efd1c", + "sha256:aecdf12ef6dc7fd91713a6da93a86c2f2a8fe54840a3b1670853a2b7402e77c9", + "sha256:c4e90bc27c0691c76e09b5dc506133451e52caee1472b8b3c741b7c912ce43ef", + "sha256:c65d135ea2d85d40309e268106dab02d3bea723db2db21c23ecad4163ced210b", + "sha256:c98dea04a1ff41a70aff2489610f280004831798cb36a068013eed04c698903d", + "sha256:d9049aa194378a426f0b2c784e2054565bf6f754d20fcafdee7102a6250556e8", + "sha256:e028fee51c96de4e81924484c77111dfdea14010ecfc906ea5b252209b0c4de6", + "sha256:e84ad26fb50091b1ea676403c0dd2bd47663099454aa6d88000b1dafecab0941", + "sha256:e88a924b591b06d0191620e9c8aa75297b3111066bb09d49a24bae1054a10c13" ], "index": "pypi", - "version": "==3.10.0" + "version": "==3.11.1" }, "pyyaml": { "hashes": [ - "sha256:0113bc0ec2ad727182326b61326afa3d1d8280ae1122493553fd6f4397f33df9", - "sha256:01adf0b6c6f61bd11af6e10ca52b7d4057dd0be0343eb9283c878cf3af56aee4", - "sha256:5124373960b0b3f4aa7df1707e63e9f109b5263eca5976c66e08b1c552d4eaf8", - "sha256:5ca4f10adbddae56d824b2c09668e91219bb178a1eee1faa56af6f99f11bf696", - "sha256:7907be34ffa3c5a32b60b95f4d95ea25361c951383a894fec31be7252b2b6f34", - "sha256:7ec9b2a4ed5cad025c2278a1e6a19c011c80a3caaac804fd2d329e9cc2c287c9", - "sha256:87ae4c829bb25b9fe99cf71fbb2140c448f534e24c998cc60f39ae4f94396a73", - "sha256:9de9919becc9cc2ff03637872a440195ac4241c80536632fffeb6a1e25a74299", - "sha256:a5a85b10e450c66b49f98846937e8cfca1db3127a9d5d1e31ca45c3d0bef4c5b", - "sha256:b0997827b4f6a7c286c01c5f60384d218dca4ed7d9efa945c3e1aa623d5709ae", - "sha256:b631ef96d3222e62861443cc89d6563ba3eeb816eeb96b2629345ab795e53681", - "sha256:bf47c0607522fdbca6c9e817a6e81b08491de50f3766a7a0e6a5be7905961b41", - "sha256:f81025eddd0327c7d4cfe9b62cf33190e1e736cc6e97502b3ec425f574b3e7a8" + "sha256:0e7f69397d53155e55d10ff68fdfb2cf630a35e6daf65cf0bdeaf04f127c09dc", + "sha256:2e9f0b7c5914367b0916c3c104a024bb68f269a486b9d04a2e8ac6f6597b7803", + "sha256:35ace9b4147848cafac3db142795ee42deebe9d0dad885ce643928e88daebdcc", + "sha256:38a4f0d114101c58c0f3a88aeaa44d63efd588845c5a2df5290b73db8f246d15", + "sha256:483eb6a33b671408c8529106df3707270bfacb2447bf8ad856a4b4f57f6e3075", + "sha256:4b6be5edb9f6bb73680f5bf4ee08ff25416d1400fbd4535fe0069b2994da07cd", + "sha256:7f38e35c00e160db592091751d385cd7b3046d6d51f578b29943225178257b31", + "sha256:8100c896ecb361794d8bfdb9c11fce618c7cf83d624d73d5ab38aef3bc82d43f", + "sha256:c0ee8eca2c582d29c3c2ec6e2c4f703d1b7f1fb10bc72317355a746057e7346c", + "sha256:e4c015484ff0ff197564917b4b4246ca03f411b9bd7f16e02a2f586eb48b6d04", + "sha256:ebc4ed52dcc93eeebeae5cf5deb2ae4347b3a81c3fa12b0b8c976544829396a4" ], "index": "pypi", - "version": "==5.1.2" + "version": "==5.2" }, "six": { "hashes": [ - "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", - "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" + "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", + "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" ], - "version": "==1.12.0" + "version": "==1.13.0" }, "sqlalchemy": { "hashes": [ - "sha256:0f0768b5db594517e1f5e1572c73d14cf295140756431270d89496dc13d5e46c" + "sha256:afa5541e9dea8ad0014251bc9d56171ca3d8b130c9627c6cb3681cff30be3f8a" ], "index": "pypi", - "version": "==1.3.10" + "version": "==1.3.11" } }, "develop": { - "atomicwrites": { - "hashes": [ - "sha256:03472c30eb2c5d1ba9227e4c2ca66ab8287fbfbbda3888aa93dc2e28fc6811b4", - "sha256:75a9445bac02d8d058d5e1fe689654ba5a6556a1dfd8ce6ec55a0ed79866cfa6" - ], - "version": "==1.3.0" - }, "attrs": { "hashes": [ "sha256:08a96c641c3a74e44eb59afb61a24f2cb9f4d7188748e76ba4bb5edfa3cb7d1c", @@ -195,28 +186,65 @@ ], "version": "==19.3.0" }, + "coverage": { + "hashes": [ + "sha256:08907593569fe59baca0bf152c43f3863201efb6113ecb38ce7e97ce339805a6", + "sha256:0be0f1ed45fc0c185cfd4ecc19a1d6532d72f86a2bac9de7e24541febad72650", + "sha256:141f08ed3c4b1847015e2cd62ec06d35e67a3ac185c26f7635f4406b90afa9c5", + "sha256:19e4df788a0581238e9390c85a7a09af39c7b539b29f25c89209e6c3e371270d", + "sha256:23cc09ed395b03424d1ae30dcc292615c1372bfba7141eb85e11e50efaa6b351", + "sha256:245388cda02af78276b479f299bbf3783ef0a6a6273037d7c60dc73b8d8d7755", + "sha256:331cb5115673a20fb131dadd22f5bcaf7677ef758741312bee4937d71a14b2ef", + "sha256:386e2e4090f0bc5df274e720105c342263423e77ee8826002dcffe0c9533dbca", + "sha256:3a794ce50daee01c74a494919d5ebdc23d58873747fa0e288318728533a3e1ca", + "sha256:60851187677b24c6085248f0a0b9b98d49cba7ecc7ec60ba6b9d2e5574ac1ee9", + "sha256:63a9a5fc43b58735f65ed63d2cf43508f462dc49857da70b8980ad78d41d52fc", + "sha256:6b62544bb68106e3f00b21c8930e83e584fdca005d4fffd29bb39fb3ffa03cb5", + "sha256:6ba744056423ef8d450cf627289166da65903885272055fb4b5e113137cfa14f", + "sha256:7494b0b0274c5072bddbfd5b4a6c6f18fbbe1ab1d22a41e99cd2d00c8f96ecfe", + "sha256:826f32b9547c8091679ff292a82aca9c7b9650f9fda3e2ca6bf2ac905b7ce888", + "sha256:93715dffbcd0678057f947f496484e906bf9509f5c1c38fc9ba3922893cda5f5", + "sha256:9a334d6c83dfeadae576b4d633a71620d40d1c379129d587faa42ee3e2a85cce", + "sha256:af7ed8a8aa6957aac47b4268631fa1df984643f07ef00acd374e456364b373f5", + "sha256:bf0a7aed7f5521c7ca67febd57db473af4762b9622254291fbcbb8cd0ba5e33e", + "sha256:bf1ef9eb901113a9805287e090452c05547578eaab1b62e4ad456fcc049a9b7e", + "sha256:c0afd27bc0e307a1ffc04ca5ec010a290e49e3afbe841c5cafc5c5a80ecd81c9", + "sha256:dd579709a87092c6dbee09d1b7cfa81831040705ffa12a1b248935274aee0437", + "sha256:df6712284b2e44a065097846488f66840445eb987eb81b3cc6e4149e7b6982e1", + "sha256:e07d9f1a23e9e93ab5c62902833bf3e4b1f65502927379148b6622686223125c", + "sha256:e2ede7c1d45e65e209d6093b762e98e8318ddeff95317d07a27a2140b80cfd24", + "sha256:e4ef9c164eb55123c62411f5936b5c2e521b12356037b6e1c2617cef45523d47", + "sha256:eca2b7343524e7ba246cab8ff00cab47a2d6d54ada3b02772e908a45675722e2", + "sha256:eee64c616adeff7db37cc37da4180a3a5b6177f5c46b187894e633f088fb5b28", + "sha256:ef824cad1f980d27f26166f86856efe11eff9912c4fed97d3804820d43fa550c", + "sha256:efc89291bd5a08855829a3c522df16d856455297cf35ae827a37edac45f466a7", + "sha256:fa964bae817babece5aa2e8c1af841bebb6d0b9add8e637548809d040443fee0", + "sha256:ff37757e068ae606659c28c3bd0d923f9d29a85de79bf25b2b34b148473b5025" + ], + "version": "==4.5.4" + }, "faker": { "hashes": [ - "sha256:5902379d8df308a204fc11c4f621590ee83975805a6c7b2228203b9defa45250", - "sha256:5e8c755c619f332d5ec28b7586389665f136bcf528e165eb925e87c06a63eda7" + "sha256:202ad3b2ec16ae7c51c02904fb838831f8d2899e61bf18db1e91a5a582feab11", + "sha256:92c84a10bec81217d9cb554ee12b3838c8986ce0b5d45f72f769da22e4bb5432" ], "index": "pypi", - "version": "==2.0.3" + "version": "==3.0.0" }, "importlib-metadata": { "hashes": [ - "sha256:aa18d7378b00b40847790e7c27e11673d7fed219354109d0e7b9e5b25dc3ad26", - "sha256:d5f18a79777f3aa179c145737780282e27b508fc8fd688cb17c7a813e8bd39af" + "sha256:3a8b2dfd0a2c6a3636e7c016a7e54ae04b997d30e69d5eacdca7a6c2221a1402", + "sha256:41e688146d000891f32b1669e8573c57e39e5060e7f5f647aa617cd9a9568278" ], "markers": "python_version < '3.8'", - "version": "==0.23" + "version": "==1.2.0" }, "more-itertools": { "hashes": [ - "sha256:409cd48d4db7052af495b09dec721011634af3753ae1ef92d2b32f73a745f832", - "sha256:92b8c4b06dac4f0611c0729b2f2ede52b2e1bac1ab48f089c7ddc12e26bb60c4" + "sha256:b84b238cce0d9adad5ed87e745778d20a3f8487d0f0cb8b8a586816c7496458d", + "sha256:c833ef592a0324bcc6a60e48440da07645063c453880c9477ceb22490aec1564" ], - "version": "==7.2.0" + "version": "==8.0.2" }, "packaging": { "hashes": [ @@ -227,10 +255,10 @@ }, "pluggy": { "hashes": [ - "sha256:0db4b7601aae1d35b4a033282da476845aa19185c1e6964b25cf324b5e4ec3e6", - "sha256:fa5fa1622fa6dd5c030e9cad086fa19ef6a0cf6d7a2d12318e10cb49d6d68f34" + "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", + "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d" ], - "version": "==0.13.0" + "version": "==0.13.1" }, "py": { "hashes": [ @@ -241,17 +269,25 @@ }, "pyparsing": { "hashes": [ - "sha256:6f98a7b9397e206d78cc01df10131398f1c8b8510a2f4d97d9abd82e1aacdd80", - "sha256:d9338df12903bbf5d65a0e4e87c2161968b10d2e489652bb47001d82a9b028b4" + "sha256:20f995ecd72f2a1f4bf6b072b63b22e2eb457836601e76d6e5dfcd75436acc1f", + "sha256:4ca62001be367f01bd3e92ecbb79070272a9d4964dce6a48a82ff0b8bc7e683a" ], - "version": "==2.4.2" + "version": "==2.4.5" }, "pytest": { "hashes": [ - "sha256:27abc3fef618a01bebb1f0d6d303d2816a99aa87a5968ebc32fe971be91eb1e6", - "sha256:58cee9e09242937e136dbb3dab466116ba20d6b7828c7620f23947f37eb4dae4" + "sha256:63344a2e3bce2e4d522fd62b4fdebb647c019f1f9e4ca075debbd13219db4418", + "sha256:f67403f33b2b1d25a6756184077394167fe5e2f9d8bdaab30707d19ccec35427" ], - "version": "==5.2.2" + "version": "==5.3.1" + }, + "pytest-cov": { + "hashes": [ + "sha256:cc6742d8bac45070217169f5f72ceee1e0e55b0221f54bcf24845972d3a47f2b", + "sha256:cdbdef4f870408ebdbfeb44e63e07eb18bb4619fae852f6e760645fa36172626" + ], + "index": "pypi", + "version": "==2.8.1" }, "pytest-grpc": { "hashes": [ @@ -263,17 +299,17 @@ }, "python-dateutil": { "hashes": [ - "sha256:7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", - "sha256:c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e" + "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c", + "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a" ], - "version": "==2.8.0" + "version": "==2.8.1" }, "six": { "hashes": [ - "sha256:3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", - "sha256:d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73" + "sha256:1f1b7d42e254082a9db6279deae68afb421ceba6158efa6131de7b3003ee93fd", + "sha256:30f610279e8b2578cab6db20741130331735c781b56053c59c4076da27f06b66" ], - "version": "==1.12.0" + "version": "==1.13.0" }, "text-unidecode": { "hashes": [ diff --git a/grpc-mate-python/pytest.ini b/grpc-mate-python/pytest.ini new file mode 100644 index 0000000..2472a7b --- /dev/null +++ b/grpc-mate-python/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +addopts = --cov=service/ --cov=data_store/ --cov-fail-under=90 + +[tool:pytest] From f4a62082a891243d72fa9b2dcdaac67140bbd887 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Wed, 11 Dec 2019 20:27:54 +0800 Subject: [PATCH 49/50] add style check --- grpc-mate-python/Makefile | 3 +++ grpc-mate-python/Pipfile | 1 + grpc-mate-python/Pipfile.lock | 16 ++++++++++++---- grpc-mate-python/tox.ini | 4 ++++ 4 files changed, 20 insertions(+), 4 deletions(-) create mode 100644 grpc-mate-python/tox.ini diff --git a/grpc-mate-python/Makefile b/grpc-mate-python/Makefile index 16a15d8..77650d4 100644 --- a/grpc-mate-python/Makefile +++ b/grpc-mate-python/Makefile @@ -12,6 +12,9 @@ protoc: pytest: pytest --grpc-fake-server +style: + pycodestyle service data_store server + clean: find data_store/ google/ grpc_mate/ server/ service/ -name "__pycache__" -type d -exec rm -r "{}" \; tar: diff --git a/grpc-mate-python/Pipfile b/grpc-mate-python/Pipfile index 3c470b7..1770c83 100644 --- a/grpc-mate-python/Pipfile +++ b/grpc-mate-python/Pipfile @@ -8,6 +8,7 @@ faker = "*" v = {editable = true,version = "*"} pytest-grpc = "*" pytest-cov = "*" +pycodestyle = "*" [packages] grpcio = "*" diff --git a/grpc-mate-python/Pipfile.lock b/grpc-mate-python/Pipfile.lock index 3a8beac..4082d41 100644 --- a/grpc-mate-python/Pipfile.lock +++ b/grpc-mate-python/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "021f97bb4506bc71fa600c2c366facdb1d7c37c29f761fa246a33408d393cadd" + "sha256": "0423ccbd63cd67e04d83068c55f39fd64cf34bad648381fed0dbcfed2fd8c2e1" }, "pipfile-spec": 6, "requires": { @@ -233,11 +233,11 @@ }, "importlib-metadata": { "hashes": [ - "sha256:3a8b2dfd0a2c6a3636e7c016a7e54ae04b997d30e69d5eacdca7a6c2221a1402", - "sha256:41e688146d000891f32b1669e8573c57e39e5060e7f5f647aa617cd9a9568278" + "sha256:073a852570f92da5f744a3472af1b61e28e9f78ccf0c9117658dc32b15de7b45", + "sha256:d95141fbfa7ef2ec65cfd945e2af7e5a6ddbd7c8d9a25e66ff3be8e3daf9f60f" ], "markers": "python_version < '3.8'", - "version": "==1.2.0" + "version": "==1.3.0" }, "more-itertools": { "hashes": [ @@ -267,6 +267,14 @@ ], "version": "==1.8.0" }, + "pycodestyle": { + "hashes": [ + "sha256:95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", + "sha256:e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c" + ], + "index": "pypi", + "version": "==2.5.0" + }, "pyparsing": { "hashes": [ "sha256:20f995ecd72f2a1f4bf6b072b63b22e2eb457836601e76d6e5dfcd75436acc1f", diff --git a/grpc-mate-python/tox.ini b/grpc-mate-python/tox.ini new file mode 100644 index 0000000..8ec2695 --- /dev/null +++ b/grpc-mate-python/tox.ini @@ -0,0 +1,4 @@ +[pycodestyle] +ignore = E722 +max-line-length = 120 +statistics = True \ No newline at end of file From 13d3edaad4b5cdb7bb385320a1ba48bc06d89d72 Mon Sep 17 00:00:00 2001 From: Ivan Li Date: Wed, 11 Dec 2019 20:40:14 +0800 Subject: [PATCH 50/50] git move test cov to tox.ini --- grpc-mate-python/pytest.ini | 4 ---- grpc-mate-python/tox.ini | 7 ++++++- 2 files changed, 6 insertions(+), 5 deletions(-) delete mode 100644 grpc-mate-python/pytest.ini diff --git a/grpc-mate-python/pytest.ini b/grpc-mate-python/pytest.ini deleted file mode 100644 index 2472a7b..0000000 --- a/grpc-mate-python/pytest.ini +++ /dev/null @@ -1,4 +0,0 @@ -[pytest] -addopts = --cov=service/ --cov=data_store/ --cov-fail-under=90 - -[tool:pytest] diff --git a/grpc-mate-python/tox.ini b/grpc-mate-python/tox.ini index 8ec2695..3597c0e 100644 --- a/grpc-mate-python/tox.ini +++ b/grpc-mate-python/tox.ini @@ -1,4 +1,9 @@ [pycodestyle] ignore = E722 max-line-length = 120 -statistics = True \ No newline at end of file +statistics = True + +[tool:pytest] + +[pytest] +addopts = --cov=service/ --cov=data_store/ --cov-fail-under=90 \ No newline at end of file