{"action":"created","comment":{"url":"https://api.github.com/repos/googleapis/toolkit/pulls/comments/79954074","id":79954074,"diff_hunk":"@@ -0,0 +1,329 @@\n+package com.google.api.codegen.transformer.csharp;\n+\n+import com.google.api.codegen.ApiConfig;\n+import com.google.api.codegen.InterfaceView;\n+import com.google.api.codegen.MethodConfig;\n+import com.google.api.codegen.ServiceConfig;\n+import com.google.api.codegen.gapic.GapicCodePathMapper;\n+import com.google.api.codegen.transformer.ApiCallableTransformer;\n+import com.google.api.codegen.transformer.ApiMethodTransformer;\n+import com.google.api.codegen.transformer.BundlingTransformer;\n+import com.google.api.codegen.transformer.ImportTypeTransformer;\n+import com.google.api.codegen.transformer.MethodTransformerContext;\n+import com.google.api.codegen.transformer.ModelToViewTransformer;\n+import com.google.api.codegen.transformer.ModelTypeTable;\n+import com.google.api.codegen.transformer.PageStreamingTransformer;\n+import com.google.api.codegen.transformer.PathTemplateTransformer;\n+import com.google.api.codegen.transformer.ServiceTransformer;\n+import com.google.api.codegen.transformer.SurfaceNamer;\n+import com.google.api.codegen.transformer.SurfaceTransformerContext;\n+import com.google.api.codegen.transformer.java.JavaModelTypeNameConverter;\n+import com.google.api.codegen.transformer.java.JavaSurfaceNamer;\n+import com.google.api.codegen.util.Name;\n+import com.google.api.codegen.util.csharp.CSharpTypeTable;\n+import com.google.api.codegen.util.java.JavaTypeTable;\n+import com.google.api.codegen.viewmodel.ApiMethodType;\n+import com.google.api.codegen.viewmodel.ApiMethodView;\n+import com.google.api.codegen.viewmodel.RequestObjectParamView;\n+import com.google.api.codegen.viewmodel.RetryCodesDefinitionView;\n+import com.google.api.codegen.viewmodel.RetryParamsDefinitionView;\n+import com.google.api.codegen.viewmodel.SettingsDocView;\n+import com.google.api.codegen.viewmodel.SimpleParamDocView;\n+import com.google.api.codegen.viewmodel.StaticLangApiMethodView;\n+import com.google.api.codegen.viewmodel.StaticLangXApiView;\n+import com.google.api.codegen.viewmodel.StaticLangXCommonView;\n+import com.google.api.codegen.viewmodel.StaticLangXSettingsView;\n+import com.google.api.codegen.viewmodel.ViewModel;\n+import com.google.api.gax.core.RetrySettings;\n+import com.google.api.tools.framework.model.Field;\n+import com.google.api.tools.framework.model.Interface;\n+import com.google.api.tools.framework.model.Method;\n+import com.google.api.tools.framework.model.Model;\n+import com.google.common.base.Function;\n+import com.google.common.collect.FluentIterable;\n+import com.google.common.collect.ImmutableList;\n+import com.google.common.collect.ImmutableSet;\n+import io.grpc.Status.Code;\n+import java.io.File;\n+import java.util.ArrayList;\n+import java.util.Arrays;\n+import java.util.List;\n+import java.util.Map.Entry;\n+\n+public class CSharpGapicSurfaceTransformer implements ModelToViewTransformer {\n+\n+  private static final String XAPI_TEMPLATE_FILENAME = \"csharp/gapic_client.snip\";\n+\n+  private final GapicCodePathMapper pathMapper;\n+  private final ApiMethodTransformer apiMethodTransformer;\n+  private final ServiceTransformer serviceTransformer;\n+  private final PathTemplateTransformer pathTemplateTransformer;\n+  private final CSharpApiCallableTransformer apiCallableTransformer;\n+  private final ImportTypeTransformer importTypeTransformer;\n+  private final PageStreamingTransformer pageStreamingTransformer;\n+  private final BundlingTransformer bundlingTransformer;\n+\n+  public CSharpGapicSurfaceTransformer(GapicCodePathMapper pathMapper) {\n+    this.pathMapper = pathMapper;\n+    this.serviceTransformer = new ServiceTransformer();\n+    this.pathTemplateTransformer = new PathTemplateTransformer();\n+    this.apiCallableTransformer = new CSharpApiCallableTransformer();\n+    this.apiMethodTransformer = new ApiMethodTransformer();\n+    this.pageStreamingTransformer = new PageStreamingTransformer();\n+    this.bundlingTransformer = new BundlingTransformer();\n+    this.importTypeTransformer = new ImportTypeTransformer();\n+  }\n+\n+  @Override\n+  public List<ViewModel> transform(Model model, ApiConfig apiConfig) {\n+    List<ViewModel> surfaceDocs = new ArrayList<>();\n+    SurfaceNamer namer = new CSharpSurfaceNamer(apiConfig.getPackageName());\n+\n+    for (Interface service : new InterfaceView().getElementIterable(model)) {\n+      SurfaceTransformerContext context =\n+          SurfaceTransformerContext.create(\n+              service, apiConfig, createTypeTable(apiConfig.getPackageName()), namer);\n+      addCommonImports(context);\n+      StaticLangXApiView xapi = generateXApi(context);\n+      StaticLangXSettingsView xsettings = generateXSettings(context);\n+      \n+      surfaceDocs.add(StaticLangXCommonView.newBuilder()\n+          .api(xapi).settings(xsettings).build());\n+\n+    }\n+    \n+    return surfaceDocs;\n+  }\n+\n+  @Override\n+  public List<String> getTemplateFileNames() {\n+    throw new RuntimeException();\n+  }\n+  \n+  private ModelTypeTable createTypeTable(String implicitPackageName) {\n+    return new ModelTypeTable(\n+        new CSharpTypeTable(implicitPackageName),\n+        new CSharpModelTypeNameConverter(implicitPackageName));\n+  }\n+\n+  private StaticLangXApiView generateXApi(SurfaceTransformerContext context) {\n+    List<StaticLangApiMethodView> methods = generateApiMethods(context);\n+\n+    StaticLangXApiView.Builder xapiClass = StaticLangXApiView.newBuilder();\n+\n+    xapiClass.doc(serviceTransformer.generateServiceDoc(context, null));\n+\n+    xapiClass.templateFileName(XAPI_TEMPLATE_FILENAME);\n+    xapiClass.packageName(context.getApiConfig().getPackageName());\n+    String name = context.getNamer().getApiWrapperClassName(context.getInterface());\n+    xapiClass.name(name);\n+    xapiClass.settingsClassName(context.getNamer().getApiSettingsClassName(context.getInterface()));\n+    xapiClass.apiCallableMembers(apiCallableTransformer.generateStaticLangApiCallables(context));\n+    xapiClass.pathTemplates(pathTemplateTransformer.generatePathTemplates(context));\n+    xapiClass.formatResourceFunctions(\n+        pathTemplateTransformer.generateFormatResourceFunctions(context));\n+    xapiClass.parseResourceFunctions(\n+        pathTemplateTransformer.generateParseResourceFunctions(context));\n+    xapiClass.apiMethods(methods);\n+\n+    // must be done as the last step to catch all imports\n+    xapiClass.imports(importTypeTransformer.generateImports(context.getTypeTable().getImports()));\n+\n+    String outputPath = pathMapper.getOutputPath(context.getInterface(), context.getApiConfig());\n+    xapiClass.outputPath(outputPath + File.separator + name + \".cs\");\n+\n+    return xapiClass.build();\n+  }\n+\n+  private StaticLangXSettingsView generateXSettings(SurfaceTransformerContext context) {\n+    List<RetryCodesDefinitionView> retryCodesDefs = generateRetryCodesDefinitions(context);\n+    List<RetryParamsDefinitionView> retryParamsDefs = generateRetryParamsDefinitions(context);\n+    StaticLangXSettingsView.Builder xsettingsClass = StaticLangXSettingsView.newBuilder();\n+    xsettingsClass.templateFileName(\"\"); // Unused in C#\n+    xsettingsClass.packageName(context.getApiConfig().getPackageName());\n+    xsettingsClass.doc(generateSettingsDoc(context));\n+    String name = context.getNamer().getApiSettingsClassName(context.getInterface());\n+    xsettingsClass.name(name);\n+    ServiceConfig serviceConfig = new ServiceConfig();\n+    xsettingsClass.serviceAddress(serviceConfig.getServiceAddress(context.getInterface()));\n+    xsettingsClass.servicePort(serviceConfig.getServicePort());\n+    xsettingsClass.authScopes(serviceConfig.getAuthScopes(context.getInterface()));\n+    xsettingsClass.callSettings(apiCallableTransformer.generateCallSettings(context, retryCodesDefs, retryParamsDefs));\n+    xsettingsClass.pageStreamingDescriptors(\n+        pageStreamingTransformer.generateDescriptorClasses(context));\n+    xsettingsClass.bundlingDescriptors(bundlingTransformer.generateDescriptorClasses(context));\n+    xsettingsClass.retryCodesDefinitions(retryCodesDefs);\n+    xsettingsClass.retryParamsDefinitions(retryParamsDefs);\n+\n+    // must be done as the last step to catch all imports\n+    xsettingsClass.imports(\n+        importTypeTransformer.generateImports(context.getTypeTable().getImports()));\n+\n+    String outputPath = pathMapper.getOutputPath(context.getInterface(), context.getApiConfig());\n+    xsettingsClass.outputPath(outputPath + \"/\" + name + \".java\");\n+\n+    return xsettingsClass.build();\n+  }\n+\n+  private void addCommonImports(SurfaceTransformerContext context) {\n+    ModelTypeTable typeTable = context.getTypeTable();\n+    // Common imports\n+    //typeTable.saveNicknameFor(\"java.util.List\");\n+  }\n+\n+  private List<StaticLangApiMethodView> generateApiMethods(SurfaceTransformerContext context) {\n+    List<StaticLangApiMethodView> apiMethods = new ArrayList<>();\n+\n+    for (Method method : context.getNonStreamingMethods()) {\n+      MethodConfig methodConfig = context.getMethodConfig(method);\n+      MethodTransformerContext methodContext = context.asMethodContext(method);\n+\n+      if (methodConfig.isPageStreaming()) {\n+        /*if (methodConfig.isFlattening()) {\n+          for (ImmutableList<Field> fields : methodConfig.getFlattening().getFlatteningGroups()) {\n+            apiMethods.add(\n+                apiMethodTransformer.generatePagedFlattenedMethod(methodContext, fields));\n+          }\n+        }\n+        apiMethods.add(apiMethodTransformer.generatePagedRequestObjectMethod(methodContext));\n+        apiMethods.add(apiMethodTransformer.generatePagedCallableMethod(methodContext));\n+        apiMethods.add(apiMethodTransformer.generateUnpagedListCallableMethod(methodContext));*/\n+      } else {\n+        if (methodConfig.isFlattening()) {\n+          for (ImmutableList<Field> fields : methodConfig.getFlattening().getFlatteningGroups()) {\n+            apiMethods.add(transformFlattenedMethod(apiMethodTransformer.generateFlattenedMethod(methodContext, fields, ApiMethodType.FlattenedMethod)));\n+            apiMethods.add(transformFlattenedMethod(apiMethodTransformer.generateFlattenedMethod(methodContext, fields, ApiMethodType.FlattenedMethodAsyncCallSettings)));\n+            apiMethods.add(transformFlattenedMethod(apiMethodTransformer.generateFlattenedMethod(methodContext, fields, ApiMethodType.FlattenedMethodAsyncCancellationToken)));\n+          }\n+        }\n+        //apiMethods.add(apiMethodTransformer.generateRequestObjectMethod(methodContext));\n+        //apiMethods.add(apiMethodTransformer.generateCallableMethod(methodContext));\n+      }\n+    }\n+\n+    return apiMethods;\n+  }\n+  \n+  private StaticLangApiMethodView transformFlattenedMethod(StaticLangApiMethodView method) {\n+    switch (method.type())\n+    {\n+      case FlattenedMethod:\n+        method = AddParam(method, \"CallSettings\", \"callSettings\", \"null\", \"If not null, applies overrides to this RPC call.\");\n+        method = AddReturnDoc(method, \"The RPC response.\");\n+        break;\n+      case FlattenedMethodAsyncCallSettings:\n+        method = AddParam(method, \"CallSettings\", \"callSettings\", \"null\", \"If not null, applies overrides to this RPC call.\");\n+        method = MakeAsync(method);\n+        method = AddReturnDoc(method, \"A Task containing the RPC response.\");\n+        break;\n+      case FlattenedMethodAsyncCancellationToken:\n+        method = AddParam(method, \"CancellationToken\", \"cancellationToken\", null, \"A <see cref=\\\"CancellationToken\\\"/> to use for this RPC.\");\n+        method = MakeAsync(method);\n+        method = AddReturnDoc(method, \"A Task containing the RPC response.\");\n+        break;\n+      default:\n+        throw new RuntimeException(\"Unexpected method type: '\" + method.type() + \"'\");\n+    }\n+    return method;","path":"src/main/java/com/google/api/codegen/transformer/csharp/CSharpGapicSurfaceTransformer.java","position":227,"original_position":227,"commit_id":"064f9b578e1d68a655e4df840b30f55456605a27","original_commit_id":"064f9b578e1d68a655e4df840b30f55456605a27","user":{"login":"garrettjonesgoogle","id":13341017,"avatar_url":"https://avatars.githubusercontent.com/u/13341017?v=3","gravatar_id":"","url":"https://api.github.com/users/garrettjonesgoogle","html_url":"https://github.com/garrettjonesgoogle","followers_url":"https://api.github.com/users/garrettjonesgoogle/followers","following_url":"https://api.github.com/users/garrettjonesgoogle/following{/other_user}","gists_url":"https://api.github.com/users/garrettjonesgoogle/gists{/gist_id}","starred_url":"https://api.github.com/users/garrettjonesgoogle/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/garrettjonesgoogle/subscriptions","organizations_url":"https://api.github.com/users/garrettjonesgoogle/orgs","repos_url":"https://api.github.com/users/garrettjonesgoogle/repos","events_url":"https://api.github.com/users/garrettjonesgoogle/events{/privacy}","received_events_url":"https://api.github.com/users/garrettjonesgoogle/received_events","type":"User","site_admin":false},"body":"I am uneasy with this pattern of unsealing/rebuilding view model objects. It makes it more difficult to trace the inputs and outputs of the transformation, because the set of values seen on a final view model object would be provided at multiple places in the code. This is almost equivalent to just having mutable view model classes. I would much prefer to add parameters into generateFlattenedMethod so that it could do all of the necessary work. ","created_at":"2016-09-21T23:22:51Z","updated_at":"2016-09-21T23:25:24Z","html_url":"https://github.com/googleapis/toolkit/pull/500#discussion_r79954074","pull_request_url":"https://api.github.com/repos/googleapis/toolkit/pulls/500","_links":{"self":{"href":"https://api.github.com/repos/googleapis/toolkit/pulls/comments/79954074"},"html":{"href":"https://github.com/googleapis/toolkit/pull/500#discussion_r79954074"},"pull_request":{"href":"https://api.github.com/repos/googleapis/toolkit/pulls/500"}}},"pull_request":{"url":"https://api.github.com/repos/googleapis/toolkit/pulls/500","id":86237288,"html_url":"https://github.com/googleapis/toolkit/pull/500","diff_url":"https://github.com/googleapis/toolkit/pull/500.diff","patch_url":"https://github.com/googleapis/toolkit/pull/500.patch","issue_url":"https://api.github.com/repos/googleapis/toolkit/issues/500","number":500,"state":"open","locked":false,"title":"[DO NOT MERGE] C# MVVM migration wip","user":{"login":"chrisdunelm","id":316748,"avatar_url":"https://avatars.githubusercontent.com/u/316748?v=3","gravatar_id":"","url":"https://api.github.com/users/chrisdunelm","html_url":"https://github.com/chrisdunelm","followers_url":"https://api.github.com/users/chrisdunelm/followers","following_url":"https://api.github.com/users/chrisdunelm/following{/other_user}","gists_url":"https://api.github.com/users/chrisdunelm/gists{/gist_id}","starred_url":"https://api.github.com/users/chrisdunelm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chrisdunelm/subscriptions","organizations_url":"https://api.github.com/users/chrisdunelm/orgs","repos_url":"https://api.github.com/users/chrisdunelm/repos","events_url":"https://api.github.com/users/chrisdunelm/events{/privacy}","received_events_url":"https://api.github.com/users/chrisdunelm/received_events","type":"User","site_admin":false},"body":"Very wip","created_at":"2016-09-21T20:40:55Z","updated_at":"2016-09-21T23:25:24Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3b7532128af46b1ff20bbc26c2830f0e8ae326ee","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/googleapis/toolkit/pulls/500/commits","review_comments_url":"https://api.github.com/repos/googleapis/toolkit/pulls/500/comments","review_comment_url":"https://api.github.com/repos/googleapis/toolkit/pulls/comments{/number}","comments_url":"https://api.github.com/repos/googleapis/toolkit/issues/500/comments","statuses_url":"https://api.github.com/repos/googleapis/toolkit/statuses/064f9b578e1d68a655e4df840b30f55456605a27","head":{"label":"chrisdunelm:mvvm2","ref":"mvvm2","sha":"064f9b578e1d68a655e4df840b30f55456605a27","user":{"login":"chrisdunelm","id":316748,"avatar_url":"https://avatars.githubusercontent.com/u/316748?v=3","gravatar_id":"","url":"https://api.github.com/users/chrisdunelm","html_url":"https://github.com/chrisdunelm","followers_url":"https://api.github.com/users/chrisdunelm/followers","following_url":"https://api.github.com/users/chrisdunelm/following{/other_user}","gists_url":"https://api.github.com/users/chrisdunelm/gists{/gist_id}","starred_url":"https://api.github.com/users/chrisdunelm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chrisdunelm/subscriptions","organizations_url":"https://api.github.com/users/chrisdunelm/orgs","repos_url":"https://api.github.com/users/chrisdunelm/repos","events_url":"https://api.github.com/users/chrisdunelm/events{/privacy}","received_events_url":"https://api.github.com/users/chrisdunelm/received_events","type":"User","site_admin":false},"repo":{"id":56756880,"name":"toolkit","full_name":"chrisdunelm/toolkit","owner":{"login":"chrisdunelm","id":316748,"avatar_url":"https://avatars.githubusercontent.com/u/316748?v=3","gravatar_id":"","url":"https://api.github.com/users/chrisdunelm","html_url":"https://github.com/chrisdunelm","followers_url":"https://api.github.com/users/chrisdunelm/followers","following_url":"https://api.github.com/users/chrisdunelm/following{/other_user}","gists_url":"https://api.github.com/users/chrisdunelm/gists{/gist_id}","starred_url":"https://api.github.com/users/chrisdunelm/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chrisdunelm/subscriptions","organizations_url":"https://api.github.com/users/chrisdunelm/orgs","repos_url":"https://api.github.com/users/chrisdunelm/repos","events_url":"https://api.github.com/users/chrisdunelm/events{/privacy}","received_events_url":"https://api.github.com/users/chrisdunelm/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/chrisdunelm/toolkit","description":"","fork":true,"url":"https://api.github.com/repos/chrisdunelm/toolkit","forks_url":"https://api.github.com/repos/chrisdunelm/toolkit/forks","keys_url":"https://api.github.com/repos/chrisdunelm/toolkit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/chrisdunelm/toolkit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/chrisdunelm/toolkit/teams","hooks_url":"https://api.github.com/repos/chrisdunelm/toolkit/hooks","issue_events_url":"https://api.github.com/repos/chrisdunelm/toolkit/issues/events{/number}","events_url":"https://api.github.com/repos/chrisdunelm/toolkit/events","assignees_url":"https://api.github.com/repos/chrisdunelm/toolkit/assignees{/user}","branches_url":"https://api.github.com/repos/chrisdunelm/toolkit/branches{/branch}","tags_url":"https://api.github.com/repos/chrisdunelm/toolkit/tags","blobs_url":"https://api.github.com/repos/chrisdunelm/toolkit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/chrisdunelm/toolkit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/chrisdunelm/toolkit/git/refs{/sha}","trees_url":"https://api.github.com/repos/chrisdunelm/toolkit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/chrisdunelm/toolkit/statuses/{sha}","languages_url":"https://api.github.com/repos/chrisdunelm/toolkit/languages","stargazers_url":"https://api.github.com/repos/chrisdunelm/toolkit/stargazers","contributors_url":"https://api.github.com/repos/chrisdunelm/toolkit/contributors","subscribers_url":"https://api.github.com/repos/chrisdunelm/toolkit/subscribers","subscription_url":"https://api.github.com/repos/chrisdunelm/toolkit/subscription","commits_url":"https://api.github.com/repos/chrisdunelm/toolkit/commits{/sha}","git_commits_url":"https://api.github.com/repos/chrisdunelm/toolkit/git/commits{/sha}","comments_url":"https://api.github.com/repos/chrisdunelm/toolkit/comments{/number}","issue_comment_url":"https://api.github.com/repos/chrisdunelm/toolkit/issues/comments{/number}","contents_url":"https://api.github.com/repos/chrisdunelm/toolkit/contents/{+path}","compare_url":"https://api.github.com/repos/chrisdunelm/toolkit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/chrisdunelm/toolkit/merges","archive_url":"https://api.github.com/repos/chrisdunelm/toolkit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/chrisdunelm/toolkit/downloads","issues_url":"https://api.github.com/repos/chrisdunelm/toolkit/issues{/number}","pulls_url":"https://api.github.com/repos/chrisdunelm/toolkit/pulls{/number}","milestones_url":"https://api.github.com/repos/chrisdunelm/toolkit/milestones{/number}","notifications_url":"https://api.github.com/repos/chrisdunelm/toolkit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/chrisdunelm/toolkit/labels{/name}","releases_url":"https://api.github.com/repos/chrisdunelm/toolkit/releases{/id}","deployments_url":"https://api.github.com/repos/chrisdunelm/toolkit/deployments","created_at":"2016-04-21T08:36:56Z","updated_at":"2016-04-21T08:36:58Z","pushed_at":"2016-09-21T20:37:48Z","git_url":"git://github.com/chrisdunelm/toolkit.git","ssh_url":"git@github.com:chrisdunelm/toolkit.git","clone_url":"https://github.com/chrisdunelm/toolkit.git","svn_url":"https://github.com/chrisdunelm/toolkit","homepage":null,"size":7068,"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":"googleapis:master","ref":"master","sha":"48ab3a8ce3561bb3e47031eeb2b322cb4f4aa725","user":{"login":"googleapis","id":16785467,"avatar_url":"https://avatars.githubusercontent.com/u/16785467?v=3","gravatar_id":"","url":"https://api.github.com/users/googleapis","html_url":"https://github.com/googleapis","followers_url":"https://api.github.com/users/googleapis/followers","following_url":"https://api.github.com/users/googleapis/following{/other_user}","gists_url":"https://api.github.com/users/googleapis/gists{/gist_id}","starred_url":"https://api.github.com/users/googleapis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/googleapis/subscriptions","organizations_url":"https://api.github.com/users/googleapis/orgs","repos_url":"https://api.github.com/users/googleapis/repos","events_url":"https://api.github.com/users/googleapis/events{/privacy}","received_events_url":"https://api.github.com/users/googleapis/received_events","type":"Organization","site_admin":false},"repo":{"id":56533838,"name":"toolkit","full_name":"googleapis/toolkit","owner":{"login":"googleapis","id":16785467,"avatar_url":"https://avatars.githubusercontent.com/u/16785467?v=3","gravatar_id":"","url":"https://api.github.com/users/googleapis","html_url":"https://github.com/googleapis","followers_url":"https://api.github.com/users/googleapis/followers","following_url":"https://api.github.com/users/googleapis/following{/other_user}","gists_url":"https://api.github.com/users/googleapis/gists{/gist_id}","starred_url":"https://api.github.com/users/googleapis/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/googleapis/subscriptions","organizations_url":"https://api.github.com/users/googleapis/orgs","repos_url":"https://api.github.com/users/googleapis/repos","events_url":"https://api.github.com/users/googleapis/events{/privacy}","received_events_url":"https://api.github.com/users/googleapis/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/googleapis/toolkit","description":"","fork":false,"url":"https://api.github.com/repos/googleapis/toolkit","forks_url":"https://api.github.com/repos/googleapis/toolkit/forks","keys_url":"https://api.github.com/repos/googleapis/toolkit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/googleapis/toolkit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/googleapis/toolkit/teams","hooks_url":"https://api.github.com/repos/googleapis/toolkit/hooks","issue_events_url":"https://api.github.com/repos/googleapis/toolkit/issues/events{/number}","events_url":"https://api.github.com/repos/googleapis/toolkit/events","assignees_url":"https://api.github.com/repos/googleapis/toolkit/assignees{/user}","branches_url":"https://api.github.com/repos/googleapis/toolkit/branches{/branch}","tags_url":"https://api.github.com/repos/googleapis/toolkit/tags","blobs_url":"https://api.github.com/repos/googleapis/toolkit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/googleapis/toolkit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/googleapis/toolkit/git/refs{/sha}","trees_url":"https://api.github.com/repos/googleapis/toolkit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/googleapis/toolkit/statuses/{sha}","languages_url":"https://api.github.com/repos/googleapis/toolkit/languages","stargazers_url":"https://api.github.com/repos/googleapis/toolkit/stargazers","contributors_url":"https://api.github.com/repos/googleapis/toolkit/contributors","subscribers_url":"https://api.github.com/repos/googleapis/toolkit/subscribers","subscription_url":"https://api.github.com/repos/googleapis/toolkit/subscription","commits_url":"https://api.github.com/repos/googleapis/toolkit/commits{/sha}","git_commits_url":"https://api.github.com/repos/googleapis/toolkit/git/commits{/sha}","comments_url":"https://api.github.com/repos/googleapis/toolkit/comments{/number}","issue_comment_url":"https://api.github.com/repos/googleapis/toolkit/issues/comments{/number}","contents_url":"https://api.github.com/repos/googleapis/toolkit/contents/{+path}","compare_url":"https://api.github.com/repos/googleapis/toolkit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/googleapis/toolkit/merges","archive_url":"https://api.github.com/repos/googleapis/toolkit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/googleapis/toolkit/downloads","issues_url":"https://api.github.com/repos/googleapis/toolkit/issues{/number}","pulls_url":"https://api.github.com/repos/googleapis/toolkit/pulls{/number}","milestones_url":"https://api.github.com/repos/googleapis/toolkit/milestones{/number}","notifications_url":"https://api.github.com/repos/googleapis/toolkit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/googleapis/toolkit/labels{/name}","releases_url":"https://api.github.com/repos/googleapis/toolkit/releases{/id}","deployments_url":"https://api.github.com/repos/googleapis/toolkit/deployments","created_at":"2016-04-18T18:58:04Z","updated_at":"2016-09-14T00:32:47Z","pushed_at":"2016-09-21T23:22:45Z","git_url":"git://github.com/googleapis/toolkit.git","ssh_url":"git@github.com:googleapis/toolkit.git","clone_url":"https://github.com/googleapis/toolkit.git","svn_url":"https://github.com/googleapis/toolkit","homepage":null,"size":11147,"stargazers_count":13,"watchers_count":13,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":19,"mirror_url":null,"open_issues_count":80,"forks":19,"open_issues":80,"watchers":13,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/googleapis/toolkit/pulls/500"},"html":{"href":"https://github.com/googleapis/toolkit/pull/500"},"issue":{"href":"https://api.github.com/repos/googleapis/toolkit/issues/500"},"comments":{"href":"https://api.github.com/repos/googleapis/toolkit/issues/500/comments"},"review_comments":{"href":"https://api.github.com/repos/googleapis/toolkit/pulls/500/comments"},"review_comment":{"href":"https://api.github.com/repos/googleapis/toolkit/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/googleapis/toolkit/pulls/500/commits"},"statuses":{"href":"https://api.github.com/repos/googleapis/toolkit/statuses/064f9b578e1d68a655e4df840b30f55456605a27"}}}}
{"actor":{"display_login":"garrettjonesgoogle"}}