Skip to content

Commit 68f4ec6

Browse files
authored
Merge pull request #37 from smacker/python_helpers
Add grpc helpers to python
2 parents d948dda + 9858478 commit 68f4ec6

File tree

5 files changed

+52
-14
lines changed

5 files changed

+52
-14
lines changed

README.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,12 @@ Caveats
100100
- client: disable secure connection on dialing with `grpc.WithInsecure()`
101101
- client: set [max gRPC message size](https://github.com/grpc/grpc/issues/7927):
102102
- go: use `pb.DialContext` instead.
103+
- python: use `lookout.sdk.grpc.create_channel` instead.
103104
- client: turn off [gRPC fail-fast](https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md) mode
104105
If your analyzer greedy creates a connection to DataServer before one was actually started, you might want to disable fail-fast mode. This way the RPCs are queued until the chanel ready. Here is an [example](https://github.com/src-d/lookout-gometalint-analyzer/blob/7b4b37fb3109299516fbb43017934d131784f49f/cmd/gometalint-analyzer/main.go#L66).
105-
- go client/server: use `pb.ToGoGrpcAddress` and `pb.Listen` to support [RFC 3986 URI scheme](https://github.com/grpc/grpc-go/issues/1911)
106+
- client/server RFC 3986 URI scheme support:
107+
- go: use `pb.ToGoGrpcAddress` and `pb.Listen`
108+
- python: use `lookout.sdk.grpc.to_grpc_address`
106109

107110
Release Process
108111
=================

language-analyzer.py

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,34 @@
11
#!/usr/bin/env python3
22

3-
# Example Analyser gRPC service implementation.
4-
# Posts file-level comments for every file with language detected.
3+
"""
4+
Example Analyzer gRPC service implementation.
5+
Posts file-level comments for every file with language detected.
6+
"""
57

68
from concurrent.futures import ThreadPoolExecutor
79

810
import time
911
import grpc
1012

11-
from lookout.sdk import service_analyzer_pb2_grpc
13+
from lookout.sdk import AnalyzerServicer, add_analyzer_to_server
1214
from lookout.sdk import service_analyzer_pb2
1315
from lookout.sdk import service_data_pb2_grpc
1416
from lookout.sdk import service_data_pb2
17+
from lookout.sdk.grpc import to_grpc_address, create_channel
1518

1619
from bblfsh import filter as filter_uast
1720

1821
port_to_listen = 2021
19-
data_srv_addr = "localhost:10301"
22+
data_srv_addr = to_grpc_address("ipv4://localhost:10301")
2023
version = "alpha"
21-
grpc_max_msg_size = 100 * 1024 * 1024 # 100mb
2224

2325

24-
class Analyzer(service_analyzer_pb2_grpc.AnalyzerServicer):
26+
class Analyzer(AnalyzerServicer):
2527
def NotifyReviewEvent(self, request, context):
2628
print("got review request {}".format(request))
2729

2830
# client connection to DataServe
29-
channel = grpc.insecure_channel(data_srv_addr, options=[
30-
("grpc.max_send_message_length", grpc_max_msg_size),
31-
("grpc.max_receive_message_length", grpc_max_msg_size),
32-
])
31+
channel = create_channel(data_srv_addr)
3332
stub = service_data_pb2_grpc.DataStub(channel)
3433
changes = stub.GetChanges(
3534
service_data_pb2.ChangesRequest(
@@ -41,7 +40,11 @@ def NotifyReviewEvent(self, request, context):
4140

4241
comments = []
4342
for change in changes:
44-
print("analyzing '{}' in {}".format(change.head.path, change.head.language))
43+
if not change.HasField("head"):
44+
continue
45+
46+
print("analyzing '{}' in {}".format(
47+
change.head.path, change.head.language))
4548
fns = list(filter_uast(change.head.uast, "//*[@roleFunction]"))
4649
comments.append(
4750
service_analyzer_pb2.Comment(
@@ -56,11 +59,11 @@ def NotifyPushEvent(self, request, context):
5659

5760
def serve():
5861
server = grpc.server(thread_pool=ThreadPoolExecutor(max_workers=10))
59-
service_analyzer_pb2_grpc.add_AnalyzerServicer_to_server(Analyzer(), server)
62+
add_analyzer_to_server(Analyzer(), server)
6063
server.add_insecure_port("0.0.0.0:{}".format(port_to_listen))
6164
server.start()
6265

63-
one_day_sec = 60*60*24
66+
one_day_sec = 60 * 60 * 24
6467
try:
6568
while True:
6669
time.sleep(one_day_sec)

python/lookout/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
"""Python SDK for lookout analyzers."""
12
# DO NOT CHANGE OR ADD ANYTHING HERE
23
import pkg_resources
34
pkg_resources.declare_namespace(__name__)

python/lookout/sdk/__init__.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# re-export using pythonic names
2+
from lookout.sdk.service_analyzer_pb2_grpc import \
3+
AnalyzerServicer, add_AnalyzerServicer_to_server as add_analyzer_to_server

python/lookout/sdk/grpc.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
from urllib.parse import urlparse
2+
3+
import grpc
4+
5+
grpc_max_msg_size = 100 * 1024 * 1024 # 100MB
6+
7+
8+
def create_channel(target, options=None):
9+
options = (options or []) + [
10+
("grpc.max_send_message_length", grpc_max_msg_size),
11+
("grpc.max_receive_message_length", grpc_max_msg_size),
12+
]
13+
return grpc.insecure_channel(target, options)
14+
15+
16+
def to_grpc_address(target):
17+
"""
18+
converts a standard gRPC target name to a one that is supported by grpcio.
19+
"""
20+
21+
u = urlparse(target)
22+
if u.scheme == "dns":
23+
raise ValueError("dns:// not supported")
24+
25+
if u.scheme == "unix":
26+
return "unix:"+u.path
27+
28+
return u.netloc

0 commit comments

Comments
 (0)