Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -100,9 +100,12 @@ Caveats
- client: disable secure connection on dialing with `grpc.WithInsecure()`
- client: set [max gRPC message size](https://github.com/grpc/grpc/issues/7927):
- go: use `pb.DialContext` instead.
- python: use `lookout.sdk.grpc.create_channel` instead.
- client: turn off [gRPC fail-fast](https://github.com/grpc/grpc/blob/master/doc/wait-for-ready.md) mode
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).
- go client/server: use `pb.ToGoGrpcAddress` and `pb.Listen` to support [RFC 3986 URI scheme](https://github.com/grpc/grpc-go/issues/1911)
- client/server RFC 3986 URI scheme support:
- go: use `pb.ToGoGrpcAddress` and `pb.Listen`
- python: use `lookout.sdk.grpc.to_grpc_address`

Release Process
=================
Expand Down
29 changes: 16 additions & 13 deletions language-analyzer.py
Original file line number Diff line number Diff line change
@@ -1,35 +1,34 @@
#!/usr/bin/env python3

# Example Analyser gRPC service implementation.
# Posts file-level comments for every file with language detected.
"""
Example Analyzer gRPC service implementation.
Posts file-level comments for every file with language detected.
"""

from concurrent.futures import ThreadPoolExecutor

import time
import grpc

from lookout.sdk import service_analyzer_pb2_grpc
from lookout.sdk import AnalyzerServicer, add_analyzer_to_server
from lookout.sdk import service_analyzer_pb2
from lookout.sdk import service_data_pb2_grpc
from lookout.sdk import service_data_pb2
from lookout.sdk.grpc import to_grpc_address, create_channel

from bblfsh import filter as filter_uast

port_to_listen = 2021
data_srv_addr = "localhost:10301"
data_srv_addr = to_grpc_address("ipv4://localhost:10301")
version = "alpha"
grpc_max_msg_size = 100 * 1024 * 1024 # 100mb


class Analyzer(service_analyzer_pb2_grpc.AnalyzerServicer):
class Analyzer(AnalyzerServicer):
def NotifyReviewEvent(self, request, context):
print("got review request {}".format(request))

# client connection to DataServe
channel = grpc.insecure_channel(data_srv_addr, options=[
("grpc.max_send_message_length", grpc_max_msg_size),
("grpc.max_receive_message_length", grpc_max_msg_size),
])
channel = create_channel(data_srv_addr)
stub = service_data_pb2_grpc.DataStub(channel)
changes = stub.GetChanges(
service_data_pb2.ChangesRequest(
Expand All @@ -41,7 +40,11 @@ def NotifyReviewEvent(self, request, context):

comments = []
for change in changes:
print("analyzing '{}' in {}".format(change.head.path, change.head.language))
if not change.HasField("head"):
continue

print("analyzing '{}' in {}".format(
change.head.path, change.head.language))
fns = list(filter_uast(change.head.uast, "//*[@roleFunction]"))
comments.append(
service_analyzer_pb2.Comment(
Expand All @@ -56,11 +59,11 @@ def NotifyPushEvent(self, request, context):

def serve():
server = grpc.server(thread_pool=ThreadPoolExecutor(max_workers=10))
service_analyzer_pb2_grpc.add_AnalyzerServicer_to_server(Analyzer(), server)
add_analyzer_to_server(Analyzer(), server)
server.add_insecure_port("0.0.0.0:{}".format(port_to_listen))
server.start()

one_day_sec = 60*60*24
one_day_sec = 60 * 60 * 24
try:
while True:
time.sleep(one_day_sec)
Expand Down
1 change: 1 addition & 0 deletions python/lookout/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
"""Python SDK for lookout analyzers."""
# DO NOT CHANGE OR ADD ANYTHING HERE
import pkg_resources
pkg_resources.declare_namespace(__name__)
Expand Down
3 changes: 3 additions & 0 deletions python/lookout/sdk/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# re-export using pythonic names
from lookout.sdk.service_analyzer_pb2_grpc import \
AnalyzerServicer, add_AnalyzerServicer_to_server as add_analyzer_to_server
28 changes: 28 additions & 0 deletions python/lookout/sdk/grpc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
from urllib.parse import urlparse

import grpc

grpc_max_msg_size = 100 * 1024 * 1024 # 100MB


def create_channel(target, options=None):
options = (options or []) + [
("grpc.max_send_message_length", grpc_max_msg_size),
("grpc.max_receive_message_length", grpc_max_msg_size),
]
return grpc.insecure_channel(target, options)


def to_grpc_address(target):
"""
converts a standard gRPC target name to a one that is supported by grpcio.
"""

u = urlparse(target)
if u.scheme == "dns":
raise ValueError("dns:// not supported")

if u.scheme == "unix":
return "unix:"+u.path

return u.netloc