{"action":"created","comment":{"url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls/comments/90684095","pull_request_review_id":11204144,"id":90684095,"diff_hunk":"@@ -0,0 +1,448 @@\n+/*\n+ * Copyright 2016 Google Inc. All Rights Reserved.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *       http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+\n+package com.google.cloud.pubsub;\n+\n+import static org.junit.Assert.assertEquals;\n+import static org.junit.Assert.fail;\n+\n+import com.google.cloud.pubsub.FakeSubscriberServiceImpl.ModifyAckDeadline;\n+import com.google.cloud.pubsub.Subscriber.Builder;\n+import com.google.cloud.pubsub.Subscriber.MessageReceiver;\n+import com.google.cloud.pubsub.Subscriber.MessageReceiver.AckReply;\n+import com.google.common.base.Function;\n+import com.google.common.base.Optional;\n+import com.google.common.base.Preconditions;\n+import com.google.common.collect.ImmutableList;\n+import com.google.common.util.concurrent.ListenableFuture;\n+import com.google.common.util.concurrent.Service.State;\n+import com.google.common.util.concurrent.SettableFuture;\n+import com.google.pubsub.v1.PubsubMessage;\n+import com.google.pubsub.v1.ReceivedMessage;\n+import com.google.pubsub.v1.StreamingPullResponse;\n+import io.grpc.Status;\n+import io.grpc.StatusException;\n+import io.grpc.StatusRuntimeException;\n+import io.grpc.inprocess.InProcessChannelBuilder;\n+import io.grpc.inprocess.InProcessServerBuilder;\n+import io.grpc.internal.ServerImpl;\n+import java.util.ArrayList;\n+import java.util.Collection;\n+import java.util.Deque;\n+import java.util.List;\n+import java.util.concurrent.ConcurrentLinkedDeque;\n+import java.util.concurrent.CountDownLatch;\n+import java.util.concurrent.Executors;\n+import org.joda.time.Duration;\n+import org.junit.After;\n+import org.junit.AfterClass;\n+import org.junit.Before;\n+import org.junit.BeforeClass;\n+import org.junit.Test;\n+import org.junit.runner.RunWith;\n+import org.junit.runners.JUnit4;\n+import org.mockito.Mockito;\n+import org.mockito.MockitoAnnotations;\n+\n+/** Tests for {@link SubscriberImpl}. */\n+@RunWith(JUnit4.class)\n+public class SubscriberImplTest {\n+\n+  private static final String TEST_SUBSCRIPTION =\n+      \"projects/test-project/subscriptions/test-subscription\";\n+\n+  private static final PubsubMessage TEST_MESSAGE =\n+      PubsubMessage.newBuilder().setMessageId(\"1\").build();\n+\n+  private static InProcessChannelBuilder testChannelBuilder;\n+\n+  private static FakeScheduledExecutorService fakeExecutor;\n+\n+  private FakeCredentials testCredentials;\n+\n+  private static FakeSubscriberServiceImpl fakeSubscriberServiceImpl;\n+\n+  private static ServerImpl testServer;\n+\n+  private TestReceiver testReceiver;\n+\n+  static class TestReceiver implements MessageReceiver {\n+    private final Deque<SettableFuture<AckReply>> outstandingMessageReplies =\n+        new ConcurrentLinkedDeque<>();\n+    private AckReply ackReply = AckReply.ACK;\n+    private Optional<CountDownLatch> messageCountLatch = Optional.absent();\n+    private Optional<Throwable> error = Optional.absent();\n+    private boolean explicitAckReplies = false;\n+\n+    void setReply(AckReply ackReply) {\n+      this.ackReply = ackReply;\n+    }\n+\n+    void setErrorReply(Throwable error) {\n+      this.error = Optional.of(error);\n+    }\n+\n+    void setExplicitAck(boolean explicitAckReplies) {\n+      this.explicitAckReplies = explicitAckReplies;\n+    }\n+\n+    void setExpectedMessages(int expected) {\n+      this.messageCountLatch = Optional.of(new CountDownLatch(expected));\n+    }\n+\n+    void waitForExpectedMessages() throws InterruptedException {\n+      if (messageCountLatch.isPresent()) {\n+        messageCountLatch.get().await();\n+      }\n+    }\n+\n+    @Override\n+    public ListenableFuture<AckReply> receiveMessage(PubsubMessage message) {\n+      if (messageCountLatch.isPresent()) {\n+        messageCountLatch.get().countDown();\n+      }\n+      SettableFuture<AckReply> reply = SettableFuture.create();\n+\n+      if (explicitAckReplies) {\n+        outstandingMessageReplies.add(reply);\n+      } else {\n+        if (error.isPresent()) {\n+          reply.setException(error.get());\n+        } else {\n+          reply.set(ackReply);\n+        }\n+      }\n+\n+      return reply;\n+    }\n+\n+    public void replyNextOutstandingMessage() {\n+      Preconditions.checkState(explicitAckReplies);\n+\n+      SettableFuture<AckReply> reply = outstandingMessageReplies.poll();\n+      if (error.isPresent()) {\n+        reply.setException(error.get());\n+      } else {\n+        reply.set(ackReply);\n+      }\n+    }\n+  }\n+\n+  @BeforeClass\n+  public static void setUpClass() throws Exception {\n+    fakeSubscriberServiceImpl = Mockito.spy(new FakeSubscriberServiceImpl());\n+    InProcessServerBuilder serverBuilder = InProcessServerBuilder.forName(\"test-server\");\n+    fakeExecutor = new FakeScheduledExecutorService();\n+    testChannelBuilder = InProcessChannelBuilder.forName(\"test-server\");\n+    serverBuilder.addService(fakeSubscriberServiceImpl);\n+    testServer = serverBuilder.build();\n+    testServer.start();\n+  }\n+\n+  @Before\n+  public void setUp() {\n+    MockitoAnnotations.initMocks(this);\n+    Mockito.reset(fakeSubscriberServiceImpl);\n+    testCredentials = new FakeCredentials();\n+    testReceiver = new TestReceiver();\n+  }\n+\n+  @After\n+  public void tearDown() {\n+    fakeSubscriberServiceImpl.reset();\n+  }\n+\n+  @AfterClass\n+  public static void tearDownClass() throws Exception {\n+    testServer.shutdownNow().awaitTermination();\n+  }\n+\n+  @Test\n+  public void testAckSingleMessage() throws Exception {\n+    Subscriber subscriber = getTestSubscriberBuilder(testReceiver).build();\n+    subscriber.startAsync().awaitRunning();\n+\n+    List<String> testAckIds = ImmutableList.of(\"A\");\n+    sendMessages(testAckIds);\n+\n+    // Trigger ack sending\n+    subscriber.stopAsync().awaitTerminated();\n+\n+    assertEquivalent(testAckIds, fakeSubscriberServiceImpl.getAcks());\n+  }\n+\n+  @Test\n+  public void testNackSingleMessage() throws Exception {\n+    Subscriber subscriber = getTestSubscriberBuilder(testReceiver).build();\n+    subscriber.startAsync().awaitRunning();\n+\n+    testReceiver.setReply(AckReply.NACK);\n+    sendMessages(ImmutableList.of(\"A\"));\n+\n+    // Trigger ack sending\n+    subscriber.stopAsync().awaitTerminated();\n+\n+    assertEquivalent(\n+        ImmutableList.of(new ModifyAckDeadline(\"A\", 0)),\n+        fakeSubscriberServiceImpl.getModifyAckDeadlines());\n+  }\n+\n+  @Test\n+  public void testReceiverError_NacksMessage() throws Exception {\n+    testReceiver.setErrorReply(new Exception(\"Can't process message\"));\n+\n+    Subscriber subscriber = getTestSubscriberBuilder(testReceiver).build();\n+    subscriber.startAsync().awaitRunning();\n+\n+    sendMessages(ImmutableList.of(\"A\"));\n+\n+    // Trigger nack sending\n+    subscriber.stopAsync().awaitTerminated();\n+\n+    assertEquivalent(\n+        ImmutableList.of(new ModifyAckDeadline(\"A\", 0)),\n+        fakeSubscriberServiceImpl.getModifyAckDeadlines());\n+  }\n+\n+  @Test\n+  public void testBatchAcks() throws Exception {\n+    Subscriber subscriber = getTestSubscriberBuilder(testReceiver).build();\n+    subscriber.startAsync().awaitRunning();\n+\n+    List<String> testAckIdsBatch1 = ImmutableList.of(\"A\", \"B\", \"C\");\n+    sendMessages(testAckIdsBatch1);\n+\n+    // Trigger ack sending\n+    fakeExecutor.advanceTime(SubscriberConnection.PENDING_ACKS_SEND_DELAY);\n+\n+    assertEquivalent(testAckIdsBatch1, fakeSubscriberServiceImpl.waitAndConsumeReceivedAcks(3));\n+\n+    // Ensures the next ack sending alarm gets properly setup\n+    List<String> testAckIdsBatch2 = ImmutableList.of(\"D\", \"E\");\n+    sendMessages(testAckIdsBatch2);\n+\n+    fakeExecutor.advanceTime(SubscriberConnection.PENDING_ACKS_SEND_DELAY);\n+\n+    assertEquivalent(testAckIdsBatch2, fakeSubscriberServiceImpl.waitAndConsumeReceivedAcks(2));\n+\n+    subscriber.stopAsync().awaitTerminated();\n+  }\n+\n+  @Test\n+  public void testBatchAcksAndNacks() throws Exception {\n+    Subscriber subscriber = getTestSubscriberBuilder(testReceiver).build();\n+    subscriber.startAsync().awaitRunning();\n+\n+    // Send messages to be acked\n+    List<String> testAckIdsBatch1 = ImmutableList.of(\"A\", \"B\", \"C\");\n+    sendMessages(testAckIdsBatch1);\n+\n+    // Send messages to be nacked\n+    List<String> testAckIdsBatch2 = ImmutableList.of(\"D\", \"E\");\n+    // Nack messages\n+    testReceiver.setReply(AckReply.NACK);\n+    sendMessages(testAckIdsBatch2);\n+\n+    // Trigger ack sending\n+    fakeExecutor.advanceTime(SubscriberConnection.PENDING_ACKS_SEND_DELAY);\n+\n+    assertEquivalent(testAckIdsBatch1, fakeSubscriberServiceImpl.waitAndConsumeReceivedAcks(3));\n+    assertEquivalent(\n+        ImmutableList.of(new ModifyAckDeadline(\"D\", 0), new ModifyAckDeadline(\"E\", 0)),\n+        fakeSubscriberServiceImpl.waitAndConsumeModifyAckDeadlines(2));\n+  }\n+\n+  @Test\n+  public void testModifyAckDeadline() throws Exception {\n+    Subscriber subscriber =\n+        getTestSubscriberBuilder(testReceiver)\n+            .setAckExpirationPadding(Duration.standardSeconds(1))\n+            .build();\n+    subscriber.startAsync().awaitRunning();\n+\n+    // Send messages to be acked\n+    List<String> testAckIdsBatch = ImmutableList.of(\"A\", \"B\", \"C\");\n+    testReceiver.setExplicitAck(true);\n+    sendMessages(testAckIdsBatch);\n+\n+    // Trigger modify ack deadline sending - 10s initial stream ack deadline - 1 padding\n+    fakeExecutor.advanceTime(Duration.standardSeconds(9));\n+\n+    assertEquivalentWithTransformation(\n+        testAckIdsBatch,\n+        fakeSubscriberServiceImpl.waitAndConsumeModifyAckDeadlines(3),\n+        new Function<String, ModifyAckDeadline>() {\n+          @Override\n+          public ModifyAckDeadline apply(String ack) {\n+            return new ModifyAckDeadline(ack, 2); // 2 seconds is the initial mod ack deadline\n+          }\n+        });\n+\n+    // Trigger modify ack deadline sending - 2s of the renewed deadlines\n+    fakeExecutor.advanceTime(Duration.standardSeconds(2));\n+\n+    assertEquivalentWithTransformation(\n+        testAckIdsBatch,\n+        fakeSubscriberServiceImpl.waitAndConsumeModifyAckDeadlines(3),\n+        new Function<String, ModifyAckDeadline>() {\n+          @Override\n+          public ModifyAckDeadline apply(String ack) {\n+            return new ModifyAckDeadline(ack, 4);\n+          }\n+        });\n+  }\n+\n+  @Test\n+  public void testStreamAckDeadlineUpdate() throws Exception {\n+    Subscriber subscriber =\n+        getTestSubscriberBuilder(testReceiver)\n+            .setAckExpirationPadding(Duration.standardSeconds(1))\n+            .build();\n+    subscriber.startAsync().awaitRunning();\n+\n+    fakeSubscriberServiceImpl.waitForStreamAckDeadline(10);\n+\n+    // Send messages to be acked\n+    testReceiver.setExplicitAck(true);\n+    sendMessages(ImmutableList.of(\"A\"));\n+\n+    // Make the ack latency of the receiver equals 20 seconds\n+    fakeExecutor.advanceTime(Duration.standardSeconds(20));\n+    testReceiver.replyNextOutstandingMessage();\n+\n+    // Wait for an ack deadline update\n+    fakeExecutor.advanceTime(Duration.standardSeconds(60));\n+\n+    fakeSubscriberServiceImpl.waitForStreamAckDeadline(20);\n+\n+    // Send more messages to be acked\n+    testReceiver.setExplicitAck(true);\n+    for (int i = 0; i < 999; i++) {\n+      sendMessages(ImmutableList.of(\"\" + i));","path":"google-cloud-pubsub/src/test/java/com/google/cloud/pubsub/SubscriberImplTest.java","position":334,"original_position":334,"commit_id":"04ed15d7c3cd77e84026bdd7c1a3abad9e35d235","original_commit_id":"04ed15d7c3cd77e84026bdd7c1a3abad9e35d235","user":{"login":"codacy-bot","id":19940114,"avatar_url":"https://avatars.githubusercontent.com/u/19940114?v=3","gravatar_id":"","url":"https://api.github.com/users/codacy-bot","html_url":"https://github.com/codacy-bot","followers_url":"https://api.github.com/users/codacy-bot/followers","following_url":"https://api.github.com/users/codacy-bot/following{/other_user}","gists_url":"https://api.github.com/users/codacy-bot/gists{/gist_id}","starred_url":"https://api.github.com/users/codacy-bot/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/codacy-bot/subscriptions","organizations_url":"https://api.github.com/users/codacy-bot/orgs","repos_url":"https://api.github.com/users/codacy-bot/repos","events_url":"https://api.github.com/users/codacy-bot/events{/privacy}","received_events_url":"https://api.github.com/users/codacy-bot/received_events","type":"User","site_admin":false},"body":"![Codacy](https://www.codacy.com/assets/images/favicon.png) Issue found: [Do not add empty strings](https://www.codacy.com/app/mziccard/google-cloud-java/file/4629392672/issues/source?bid=3123103&fileBranchId=3959950#l334)","created_at":"2016-12-02T17:29:39Z","updated_at":"2016-12-02T17:29:39Z","html_url":"https://github.com/GoogleCloudPlatform/google-cloud-java/pull/1442#discussion_r90684095","pull_request_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls/1442","_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls/comments/90684095"},"html":{"href":"https://github.com/GoogleCloudPlatform/google-cloud-java/pull/1442#discussion_r90684095"},"pull_request":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls/1442"}}},"pull_request":{"url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls/1442","id":96319691,"html_url":"https://github.com/GoogleCloudPlatform/google-cloud-java/pull/1442","diff_url":"https://github.com/GoogleCloudPlatform/google-cloud-java/pull/1442.diff","patch_url":"https://github.com/GoogleCloudPlatform/google-cloud-java/pull/1442.patch","issue_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/issues/1442","number":1442,"state":"open","locked":false,"title":"Pub/Sub High Perf client","user":{"login":"davidtorres","id":4836267,"avatar_url":"https://avatars.githubusercontent.com/u/4836267?v=3","gravatar_id":"","url":"https://api.github.com/users/davidtorres","html_url":"https://github.com/davidtorres","followers_url":"https://api.github.com/users/davidtorres/followers","following_url":"https://api.github.com/users/davidtorres/following{/other_user}","gists_url":"https://api.github.com/users/davidtorres/gists{/gist_id}","starred_url":"https://api.github.com/users/davidtorres/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidtorres/subscriptions","organizations_url":"https://api.github.com/users/davidtorres/orgs","repos_url":"https://api.github.com/users/davidtorres/repos","events_url":"https://api.github.com/users/davidtorres/events{/privacy}","received_events_url":"https://api.github.com/users/davidtorres/received_events","type":"User","site_admin":false},"body":"This is just for us to discuss, I just realized some conflicts with classes that are already in the repo that happened to have the same name as mine that need to be solved. \r\n\r\nAlso need to discuss the dependencies introduced  and the data model (PubsubMessage vs Message)","created_at":"2016-12-02T17:25:45Z","updated_at":"2016-12-02T17:29:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"54ba24dbd17991dde1b7481b319d8519310e3c21","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls/1442/commits","review_comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls/1442/comments","review_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls/comments{/number}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/issues/1442/comments","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/statuses/04ed15d7c3cd77e84026bdd7c1a3abad9e35d235","head":{"label":"davidtorres:master","ref":"master","sha":"04ed15d7c3cd77e84026bdd7c1a3abad9e35d235","user":{"login":"davidtorres","id":4836267,"avatar_url":"https://avatars.githubusercontent.com/u/4836267?v=3","gravatar_id":"","url":"https://api.github.com/users/davidtorres","html_url":"https://github.com/davidtorres","followers_url":"https://api.github.com/users/davidtorres/followers","following_url":"https://api.github.com/users/davidtorres/following{/other_user}","gists_url":"https://api.github.com/users/davidtorres/gists{/gist_id}","starred_url":"https://api.github.com/users/davidtorres/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidtorres/subscriptions","organizations_url":"https://api.github.com/users/davidtorres/orgs","repos_url":"https://api.github.com/users/davidtorres/repos","events_url":"https://api.github.com/users/davidtorres/events{/privacy}","received_events_url":"https://api.github.com/users/davidtorres/received_events","type":"User","site_admin":false},"repo":{"id":75415523,"name":"google-cloud-java","full_name":"davidtorres/google-cloud-java","owner":{"login":"davidtorres","id":4836267,"avatar_url":"https://avatars.githubusercontent.com/u/4836267?v=3","gravatar_id":"","url":"https://api.github.com/users/davidtorres","html_url":"https://github.com/davidtorres","followers_url":"https://api.github.com/users/davidtorres/followers","following_url":"https://api.github.com/users/davidtorres/following{/other_user}","gists_url":"https://api.github.com/users/davidtorres/gists{/gist_id}","starred_url":"https://api.github.com/users/davidtorres/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/davidtorres/subscriptions","organizations_url":"https://api.github.com/users/davidtorres/orgs","repos_url":"https://api.github.com/users/davidtorres/repos","events_url":"https://api.github.com/users/davidtorres/events{/privacy}","received_events_url":"https://api.github.com/users/davidtorres/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/davidtorres/google-cloud-java","description":"Google Cloud Client Library for Java","fork":true,"url":"https://api.github.com/repos/davidtorres/google-cloud-java","forks_url":"https://api.github.com/repos/davidtorres/google-cloud-java/forks","keys_url":"https://api.github.com/repos/davidtorres/google-cloud-java/keys{/key_id}","collaborators_url":"https://api.github.com/repos/davidtorres/google-cloud-java/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/davidtorres/google-cloud-java/teams","hooks_url":"https://api.github.com/repos/davidtorres/google-cloud-java/hooks","issue_events_url":"https://api.github.com/repos/davidtorres/google-cloud-java/issues/events{/number}","events_url":"https://api.github.com/repos/davidtorres/google-cloud-java/events","assignees_url":"https://api.github.com/repos/davidtorres/google-cloud-java/assignees{/user}","branches_url":"https://api.github.com/repos/davidtorres/google-cloud-java/branches{/branch}","tags_url":"https://api.github.com/repos/davidtorres/google-cloud-java/tags","blobs_url":"https://api.github.com/repos/davidtorres/google-cloud-java/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/davidtorres/google-cloud-java/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/davidtorres/google-cloud-java/git/refs{/sha}","trees_url":"https://api.github.com/repos/davidtorres/google-cloud-java/git/trees{/sha}","statuses_url":"https://api.github.com/repos/davidtorres/google-cloud-java/statuses/{sha}","languages_url":"https://api.github.com/repos/davidtorres/google-cloud-java/languages","stargazers_url":"https://api.github.com/repos/davidtorres/google-cloud-java/stargazers","contributors_url":"https://api.github.com/repos/davidtorres/google-cloud-java/contributors","subscribers_url":"https://api.github.com/repos/davidtorres/google-cloud-java/subscribers","subscription_url":"https://api.github.com/repos/davidtorres/google-cloud-java/subscription","commits_url":"https://api.github.com/repos/davidtorres/google-cloud-java/commits{/sha}","git_commits_url":"https://api.github.com/repos/davidtorres/google-cloud-java/git/commits{/sha}","comments_url":"https://api.github.com/repos/davidtorres/google-cloud-java/comments{/number}","issue_comment_url":"https://api.github.com/repos/davidtorres/google-cloud-java/issues/comments{/number}","contents_url":"https://api.github.com/repos/davidtorres/google-cloud-java/contents/{+path}","compare_url":"https://api.github.com/repos/davidtorres/google-cloud-java/compare/{base}...{head}","merges_url":"https://api.github.com/repos/davidtorres/google-cloud-java/merges","archive_url":"https://api.github.com/repos/davidtorres/google-cloud-java/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/davidtorres/google-cloud-java/downloads","issues_url":"https://api.github.com/repos/davidtorres/google-cloud-java/issues{/number}","pulls_url":"https://api.github.com/repos/davidtorres/google-cloud-java/pulls{/number}","milestones_url":"https://api.github.com/repos/davidtorres/google-cloud-java/milestones{/number}","notifications_url":"https://api.github.com/repos/davidtorres/google-cloud-java/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/davidtorres/google-cloud-java/labels{/name}","releases_url":"https://api.github.com/repos/davidtorres/google-cloud-java/releases{/id}","deployments_url":"https://api.github.com/repos/davidtorres/google-cloud-java/deployments","created_at":"2016-12-02T17:13:24Z","updated_at":"2016-12-02T17:13:28Z","pushed_at":"2016-12-02T17:21:28Z","git_url":"git://github.com/davidtorres/google-cloud-java.git","ssh_url":"git@github.com:davidtorres/google-cloud-java.git","clone_url":"https://github.com/davidtorres/google-cloud-java.git","svn_url":"https://github.com/davidtorres/google-cloud-java","homepage":"http://googlecloudplatform.github.io/google-cloud-java/","size":264610,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"GoogleCloudPlatform:master","ref":"master","sha":"15e2e2d7ca2114bc8fde54e65c56eb1a7b770b99","user":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"repo":{"id":26181278,"name":"google-cloud-java","full_name":"GoogleCloudPlatform/google-cloud-java","owner":{"login":"GoogleCloudPlatform","id":2810941,"avatar_url":"https://avatars.githubusercontent.com/u/2810941?v=3","gravatar_id":"","url":"https://api.github.com/users/GoogleCloudPlatform","html_url":"https://github.com/GoogleCloudPlatform","followers_url":"https://api.github.com/users/GoogleCloudPlatform/followers","following_url":"https://api.github.com/users/GoogleCloudPlatform/following{/other_user}","gists_url":"https://api.github.com/users/GoogleCloudPlatform/gists{/gist_id}","starred_url":"https://api.github.com/users/GoogleCloudPlatform/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GoogleCloudPlatform/subscriptions","organizations_url":"https://api.github.com/users/GoogleCloudPlatform/orgs","repos_url":"https://api.github.com/users/GoogleCloudPlatform/repos","events_url":"https://api.github.com/users/GoogleCloudPlatform/events{/privacy}","received_events_url":"https://api.github.com/users/GoogleCloudPlatform/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/GoogleCloudPlatform/google-cloud-java","description":"Google Cloud Client Library for Java","fork":false,"url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java","forks_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/forks","keys_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/teams","hooks_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/hooks","issue_events_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/issues/events{/number}","events_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/events","assignees_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/assignees{/user}","branches_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/branches{/branch}","tags_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/tags","blobs_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/git/refs{/sha}","trees_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/statuses/{sha}","languages_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/languages","stargazers_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/stargazers","contributors_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/contributors","subscribers_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/subscribers","subscription_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/subscription","commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/commits{/sha}","git_commits_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/git/commits{/sha}","comments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/comments{/number}","issue_comment_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/issues/comments{/number}","contents_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/contents/{+path}","compare_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/merges","archive_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/downloads","issues_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/issues{/number}","pulls_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls{/number}","milestones_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/milestones{/number}","notifications_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/labels{/name}","releases_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/releases{/id}","deployments_url":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/deployments","created_at":"2014-11-04T17:57:16Z","updated_at":"2016-12-01T04:34:18Z","pushed_at":"2016-12-02T17:25:45Z","git_url":"git://github.com/GoogleCloudPlatform/google-cloud-java.git","ssh_url":"git@github.com:GoogleCloudPlatform/google-cloud-java.git","clone_url":"https://github.com/GoogleCloudPlatform/google-cloud-java.git","svn_url":"https://github.com/GoogleCloudPlatform/google-cloud-java","homepage":"http://googlecloudplatform.github.io/google-cloud-java/","size":264610,"stargazers_count":193,"watchers_count":193,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":106,"mirror_url":null,"open_issues_count":116,"forks":106,"open_issues":116,"watchers":193,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls/1442"},"html":{"href":"https://github.com/GoogleCloudPlatform/google-cloud-java/pull/1442"},"issue":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/issues/1442"},"comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/issues/1442/comments"},"review_comments":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls/1442/comments"},"review_comment":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/pulls/1442/commits"},"statuses":{"href":"https://api.github.com/repos/GoogleCloudPlatform/google-cloud-java/statuses/04ed15d7c3cd77e84026bdd7c1a3abad9e35d235"}}}}
{"actor":{"display_login":"codacy-bot"}}