{"action":"created","comment":{"url":"https://api.github.com/repos/data-integrations/wrangler/pulls/comments/214443991","pull_request_review_id":151502337,"id":214443991,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIxNDQ0Mzk5MQ==","diff_hunk":"@@ -0,0 +1,400 @@\n+/*\n+ * Copyright © 2018 Cask Data, Inc.\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n+ * use this file except in compliance with the License. You may obtain a copy of\n+ * 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, WITHOUT\n+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n+ * License for the specific language governing permissions and limitations under\n+ * the License.\n+ */\n+\n+package co.cask.wrangler.service.spanner;\n+\n+import co.cask.cdap.api.data.schema.Schema;\n+import co.cask.cdap.api.data.schema.UnsupportedTypeException;\n+import co.cask.cdap.api.service.http.HttpServiceRequest;\n+import co.cask.cdap.api.service.http.HttpServiceResponder;\n+import co.cask.wrangler.PropertyIds;\n+import co.cask.wrangler.RequestExtractor;\n+import co.cask.wrangler.ServiceUtils;\n+import co.cask.wrangler.api.Row;\n+import co.cask.wrangler.dataset.connections.Connection;\n+import co.cask.wrangler.dataset.workspace.DataType;\n+import co.cask.wrangler.dataset.workspace.WorkspaceDataset;\n+import co.cask.wrangler.service.PluginConfiguration;\n+import co.cask.wrangler.service.common.AbstractWranglerService;\n+import co.cask.wrangler.service.connections.ConnectionType;\n+import co.cask.wrangler.service.gcp.GCPUtils;\n+import co.cask.wrangler.utils.ObjectSerDe;\n+import com.google.cloud.ByteArray;\n+import com.google.cloud.spanner.DatabaseId;\n+import com.google.cloud.spanner.KeySet;\n+import com.google.cloud.spanner.Options;\n+import com.google.cloud.spanner.ResultSet;\n+import com.google.cloud.spanner.Spanner;\n+import com.google.cloud.spanner.Statement;\n+import com.google.cloud.spanner.Type;\n+import com.google.common.base.Charsets;\n+import com.google.common.collect.ImmutableList;\n+import com.google.common.collect.ImmutableMap;\n+import com.google.gson.Gson;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+\n+import java.net.HttpURLConnection;\n+import java.util.ArrayList;\n+import java.util.HashMap;\n+import java.util.List;\n+import java.util.Map;\n+import java.util.stream.Collectors;\n+import javax.ws.rs.BadRequestException;\n+import javax.ws.rs.DefaultValue;\n+import javax.ws.rs.GET;\n+import javax.ws.rs.POST;\n+import javax.ws.rs.Path;\n+import javax.ws.rs.PathParam;\n+import javax.ws.rs.QueryParam;\n+\n+/**\n+ * Spanner data prep connection service\n+ */\n+public class SpannerService extends AbstractWranglerService {\n+  private static final Logger LOG = LoggerFactory.getLogger(SpannerService.class);\n+  private static final String TABLE_NAME = \"TableName\";\n+  // Spanner queries for listing tables and listing schema of table are documented at\n+  // https://cloud.google.com/spanner/docs/information-schema\n+  private static final Statement LIST_TABLES_STATEMENT =\n+    Statement.of(\"SELECT t.table_name FROM \" +\n+                   \"information_schema.tables AS t WHERE t.table_catalog = '' and t.table_schema = ''\");\n+\n+  private static final Statement.Builder SCHEMA_STATEMENT_BUILDER =  Statement.newBuilder(\n+    String.format(\"SELECT  t.column_name,t.spanner_type, t.is_nullable FROM information_schema.columns AS t WHERE \" +\n+                    \"  t.table_catalog = ''  AND  t.table_schema = '' AND t.table_name = @%s\", TABLE_NAME));\n+  // Default Number of rows read from Spanner table by data-prep\n+  private static final String DEFAULT_ROW_LIMIT = \"1000\";\n+  private static final Gson GSON = new Gson();\n+\n+  /**\n+   * Tests Spanner Connection.\n+   */\n+  @POST\n+  @Path(\"/connections/spanner/test\")\n+  public void testSpannerConnection(HttpServiceRequest request, HttpServiceResponder responder) {\n+    try {\n+      // Extract the body of the request and transform it to the Connection object.\n+      RequestExtractor extractor = new RequestExtractor(request);\n+      Connection connection = extractor.getContent(Charsets.UTF_8.name(), Connection.class);\n+      getInstances(connection);\n+      ServiceUtils.success(responder, \"Success\");\n+    } catch (BadRequestException e) {\n+      responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, e.getMessage());\n+    } catch (Exception e) {\n+      ServiceUtils.error(responder, e.getMessage());\n+    }\n+  }\n+\n+  /**\n+   * Lists spanner instances in the project\n+   */\n+  @GET\n+  @Path(\"/connections/{connection-id}/spanner/instances\")\n+  public void getSpannerInstances(HttpServiceRequest request, HttpServiceResponder responder,\n+                                  @PathParam(\"connection-id\") final String connectionId) {\n+    try {\n+      Connection connection = store.get(connectionId);\n+      validateConnection(connectionId, connection);\n+      List<SpannerInstance> instances = getInstances(connection);\n+      responder.sendJson(new SpannerResponse<>(instances));\n+    } catch (BadRequestException e) {\n+      responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, e.getMessage());\n+    } catch (Exception e) {\n+      responder.sendError(HttpURLConnection.HTTP_INTERNAL_ERROR, e.getMessage());\n+    }\n+  }\n+\n+  /**\n+   * Lists spanner databases for a spanner instance\n+   */\n+  @GET\n+  @Path(\"/connections/{connection-id}/spanner/instances/{instance-id}/databases\")\n+  public void getSpannerDatabases(HttpServiceRequest request, HttpServiceResponder responder,\n+                                  @PathParam(\"connection-id\") final String connectionId,\n+                                  @PathParam(\"instance-id\") final String instanceId) {\n+    try {\n+      Connection connection = store.get(connectionId);\n+      validateConnection(connectionId, connection);\n+      List<SpannerDatabase> databases = getDatabases(connection, instanceId);\n+      responder.sendJson(new SpannerResponse<>(databases));\n+    } catch (BadRequestException e) {\n+      responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, e.getMessage());\n+    } catch (Exception e) {\n+      responder.sendError(HttpURLConnection.HTTP_INTERNAL_ERROR, e.getMessage());\n+    }\n+  }\n+\n+  /**\n+   * Lists spanner tables for a spanner database\n+   *\n+   * @param request HTTP Request handler.\n+   * @param responder HTTP Response handler.\n+   */\n+  @GET\n+  @Path(\"/connections/{connection-id}/spanner/instances/{instance-id}/databases/{database-id}/tables\")\n+  public void getSpannerTables(HttpServiceRequest request, HttpServiceResponder responder,\n+                               @PathParam(\"connection-id\") final String connectionId,\n+                               @PathParam(\"instance-id\") final String instanceId,\n+                               @PathParam(\"database-id\") final String databaseId) {\n+    try {\n+      Connection connection = store.get(connectionId);\n+      validateConnection(connectionId, connection);\n+      List<SpannerTable> tables = getTables(connection, instanceId, databaseId);\n+      responder.sendJson(new SpannerResponse<>(tables));\n+    } catch (BadRequestException e) {\n+      responder.sendError(HttpURLConnection.HTTP_BAD_REQUEST, e.getMessage());\n+    } catch (Exception e) {\n+      responder.sendError(HttpURLConnection.HTTP_INTERNAL_ERROR, e.getMessage());\n+    }\n+  }\n+\n+  /**\n+   * Read spanner table into a workspace and return the workspace identifier\n+   */\n+  @GET\n+  @Path(\"/connections/{connection-id}/spanner/instances/{instance-id}/databases/{database-id}/tables/{table-id}/read\")\n+  public void readTable(HttpServiceRequest request, HttpServiceResponder responder,\n+                        @PathParam(\"connection-id\") final String connectionId,\n+                        @PathParam(\"instance-id\") final String instanceId,\n+                        @PathParam(\"database-id\") final String databaseId,\n+                        @PathParam(\"table-id\") final String tableId,\n+                        @QueryParam(\"scope\") @DefaultValue(WorkspaceDataset.DEFAULT_SCOPE) String scope,\n+                        @QueryParam(\"limit\") @DefaultValue(DEFAULT_ROW_LIMIT) String limit) {\n+    try {\n+      Connection connection = store.get(connectionId);\n+      validateConnection(connectionId, connection);\n+      Schema schema = getTableSchema(connection, instanceId, databaseId, tableId);\n+      List<Row> data = getTableData(connection, instanceId, databaseId, tableId, schema, Long.parseLong(limit));\n+\n+      // create workspace id\n+      String identifier = ServiceUtils.generateMD5(String.format(\"%s:%s\", scope, tableId));\n+      ws.createWorkspaceMeta(identifier, scope, tableId);\n+\n+      // write data to workspace\n+      ObjectSerDe<List<Row>> serDe = new ObjectSerDe<>();\n+      byte[] dataBytes = serDe.toByteArray(data);\n+      ws.writeToWorkspace(identifier, WorkspaceDataset.DATA_COL, DataType.RECORDS, dataBytes);","path":"wrangler-service/src/main/java/co/cask/wrangler/service/spanner/SpannerService.java","position":190,"original_position":190,"commit_id":"a889714f5e506883435e7e499a9f36c3e599f2bd","original_commit_id":"a889714f5e506883435e7e499a9f36c3e599f2bd","user":{"login":"albertshau","id":5215004,"node_id":"MDQ6VXNlcjUyMTUwMDQ=","avatar_url":"https://avatars3.githubusercontent.com/u/5215004?v=4","gravatar_id":"","url":"https://api.github.com/users/albertshau","html_url":"https://github.com/albertshau","followers_url":"https://api.github.com/users/albertshau/followers","following_url":"https://api.github.com/users/albertshau/following{/other_user}","gists_url":"https://api.github.com/users/albertshau/gists{/gist_id}","starred_url":"https://api.github.com/users/albertshau/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/albertshau/subscriptions","organizations_url":"https://api.github.com/users/albertshau/orgs","repos_url":"https://api.github.com/users/albertshau/repos","events_url":"https://api.github.com/users/albertshau/events{/privacy}","received_events_url":"https://api.github.com/users/albertshau/received_events","type":"User","site_admin":false},"body":"this means all the records are stored into a single cell doesn't it... I think we'll need to create a new backwards incompatible version of dataprep at some point.","created_at":"2018-08-31T18:45:32Z","updated_at":"2018-08-31T18:48:10Z","html_url":"https://github.com/data-integrations/wrangler/pull/225#discussion_r214443991","pull_request_url":"https://api.github.com/repos/data-integrations/wrangler/pulls/225","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/data-integrations/wrangler/pulls/comments/214443991"},"html":{"href":"https://github.com/data-integrations/wrangler/pull/225#discussion_r214443991"},"pull_request":{"href":"https://api.github.com/repos/data-integrations/wrangler/pulls/225"}}},"pull_request":{"url":"https://api.github.com/repos/data-integrations/wrangler/pulls/225","id":212441844,"node_id":"MDExOlB1bGxSZXF1ZXN0MjEyNDQxODQ0","html_url":"https://github.com/data-integrations/wrangler/pull/225","diff_url":"https://github.com/data-integrations/wrangler/pull/225.diff","patch_url":"https://github.com/data-integrations/wrangler/pull/225.patch","issue_url":"https://api.github.com/repos/data-integrations/wrangler/issues/225","number":225,"state":"open","locked":false,"title":"CDAP-14058 Spanner dataprep connection service","user":{"login":"gsps1","id":1328150,"node_id":"MDQ6VXNlcjEzMjgxNTA=","avatar_url":"https://avatars0.githubusercontent.com/u/1328150?v=4","gravatar_id":"","url":"https://api.github.com/users/gsps1","html_url":"https://github.com/gsps1","followers_url":"https://api.github.com/users/gsps1/followers","following_url":"https://api.github.com/users/gsps1/following{/other_user}","gists_url":"https://api.github.com/users/gsps1/gists{/gist_id}","starred_url":"https://api.github.com/users/gsps1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gsps1/subscriptions","organizations_url":"https://api.github.com/users/gsps1/orgs","repos_url":"https://api.github.com/users/gsps1/repos","events_url":"https://api.github.com/users/gsps1/events{/privacy}","received_events_url":"https://api.github.com/users/gsps1/received_events","type":"User","site_admin":false},"body":"Adding Spanner data prep connection. \r\n\r\nSpanner service Endpoints to \r\n\r\n- Test connection\r\n- List spanner instances\r\n- List spanner databases in an instance\r\n- List spanner tables in a database\r\n- Read spanner table data into a workspace\r\n- Get specification for spanner source plugin for creating a pipeline.\r\n\r\nJIRA : https://issues.cask.co/browse/CDAP-14058","created_at":"2018-08-31T16:59:27Z","updated_at":"2018-08-31T18:48:10Z","closed_at":null,"merged_at":null,"merge_commit_sha":"77e36aa78b913a5d688e78a2f7610619d3baa3f7","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/data-integrations/wrangler/pulls/225/commits","review_comments_url":"https://api.github.com/repos/data-integrations/wrangler/pulls/225/comments","review_comment_url":"https://api.github.com/repos/data-integrations/wrangler/pulls/comments{/number}","comments_url":"https://api.github.com/repos/data-integrations/wrangler/issues/225/comments","statuses_url":"https://api.github.com/repos/data-integrations/wrangler/statuses/a889714f5e506883435e7e499a9f36c3e599f2bd","head":{"label":"data-integrations:feature/spanner-connection","ref":"feature/spanner-connection","sha":"a889714f5e506883435e7e499a9f36c3e599f2bd","user":{"login":"data-integrations","id":23705097,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzNzA1MDk3","avatar_url":"https://avatars3.githubusercontent.com/u/23705097?v=4","gravatar_id":"","url":"https://api.github.com/users/data-integrations","html_url":"https://github.com/data-integrations","followers_url":"https://api.github.com/users/data-integrations/followers","following_url":"https://api.github.com/users/data-integrations/following{/other_user}","gists_url":"https://api.github.com/users/data-integrations/gists{/gist_id}","starred_url":"https://api.github.com/users/data-integrations/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/data-integrations/subscriptions","organizations_url":"https://api.github.com/users/data-integrations/orgs","repos_url":"https://api.github.com/users/data-integrations/repos","events_url":"https://api.github.com/users/data-integrations/events{/privacy}","received_events_url":"https://api.github.com/users/data-integrations/received_events","type":"Organization","site_admin":false},"repo":{"id":74907921,"node_id":"MDEwOlJlcG9zaXRvcnk3NDkwNzkyMQ==","name":"wrangler","full_name":"data-integrations/wrangler","owner":{"login":"data-integrations","id":23705097,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzNzA1MDk3","avatar_url":"https://avatars3.githubusercontent.com/u/23705097?v=4","gravatar_id":"","url":"https://api.github.com/users/data-integrations","html_url":"https://github.com/data-integrations","followers_url":"https://api.github.com/users/data-integrations/followers","following_url":"https://api.github.com/users/data-integrations/following{/other_user}","gists_url":"https://api.github.com/users/data-integrations/gists{/gist_id}","starred_url":"https://api.github.com/users/data-integrations/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/data-integrations/subscriptions","organizations_url":"https://api.github.com/users/data-integrations/orgs","repos_url":"https://api.github.com/users/data-integrations/repos","events_url":"https://api.github.com/users/data-integrations/events{/privacy}","received_events_url":"https://api.github.com/users/data-integrations/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/data-integrations/wrangler","description":"Wrangler Transform: A DMD system for transforming Big Data","fork":false,"url":"https://api.github.com/repos/data-integrations/wrangler","forks_url":"https://api.github.com/repos/data-integrations/wrangler/forks","keys_url":"https://api.github.com/repos/data-integrations/wrangler/keys{/key_id}","collaborators_url":"https://api.github.com/repos/data-integrations/wrangler/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/data-integrations/wrangler/teams","hooks_url":"https://api.github.com/repos/data-integrations/wrangler/hooks","issue_events_url":"https://api.github.com/repos/data-integrations/wrangler/issues/events{/number}","events_url":"https://api.github.com/repos/data-integrations/wrangler/events","assignees_url":"https://api.github.com/repos/data-integrations/wrangler/assignees{/user}","branches_url":"https://api.github.com/repos/data-integrations/wrangler/branches{/branch}","tags_url":"https://api.github.com/repos/data-integrations/wrangler/tags","blobs_url":"https://api.github.com/repos/data-integrations/wrangler/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/data-integrations/wrangler/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/data-integrations/wrangler/git/refs{/sha}","trees_url":"https://api.github.com/repos/data-integrations/wrangler/git/trees{/sha}","statuses_url":"https://api.github.com/repos/data-integrations/wrangler/statuses/{sha}","languages_url":"https://api.github.com/repos/data-integrations/wrangler/languages","stargazers_url":"https://api.github.com/repos/data-integrations/wrangler/stargazers","contributors_url":"https://api.github.com/repos/data-integrations/wrangler/contributors","subscribers_url":"https://api.github.com/repos/data-integrations/wrangler/subscribers","subscription_url":"https://api.github.com/repos/data-integrations/wrangler/subscription","commits_url":"https://api.github.com/repos/data-integrations/wrangler/commits{/sha}","git_commits_url":"https://api.github.com/repos/data-integrations/wrangler/git/commits{/sha}","comments_url":"https://api.github.com/repos/data-integrations/wrangler/comments{/number}","issue_comment_url":"https://api.github.com/repos/data-integrations/wrangler/issues/comments{/number}","contents_url":"https://api.github.com/repos/data-integrations/wrangler/contents/{+path}","compare_url":"https://api.github.com/repos/data-integrations/wrangler/compare/{base}...{head}","merges_url":"https://api.github.com/repos/data-integrations/wrangler/merges","archive_url":"https://api.github.com/repos/data-integrations/wrangler/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/data-integrations/wrangler/downloads","issues_url":"https://api.github.com/repos/data-integrations/wrangler/issues{/number}","pulls_url":"https://api.github.com/repos/data-integrations/wrangler/pulls{/number}","milestones_url":"https://api.github.com/repos/data-integrations/wrangler/milestones{/number}","notifications_url":"https://api.github.com/repos/data-integrations/wrangler/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/data-integrations/wrangler/labels{/name}","releases_url":"https://api.github.com/repos/data-integrations/wrangler/releases{/id}","deployments_url":"https://api.github.com/repos/data-integrations/wrangler/deployments","created_at":"2016-11-27T19:01:32Z","updated_at":"2018-08-31T08:12:56Z","pushed_at":"2018-08-31T16:59:28Z","git_url":"git://github.com/data-integrations/wrangler.git","ssh_url":"git@github.com:data-integrations/wrangler.git","clone_url":"https://github.com/data-integrations/wrangler.git","svn_url":"https://github.com/data-integrations/wrangler","homepage":"http://docs.cask.co/cdap/current/en/developers-manual/pipelines/index.html","size":30155,"stargazers_count":12,"watchers_count":12,"language":"Java","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"archived":false,"open_issues_count":4,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":7,"open_issues":4,"watchers":12,"default_branch":"develop"}},"base":{"label":"data-integrations:develop","ref":"develop","sha":"1cd067a0a74f1fd6b180fb0a24da35425e08b5d8","user":{"login":"data-integrations","id":23705097,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzNzA1MDk3","avatar_url":"https://avatars3.githubusercontent.com/u/23705097?v=4","gravatar_id":"","url":"https://api.github.com/users/data-integrations","html_url":"https://github.com/data-integrations","followers_url":"https://api.github.com/users/data-integrations/followers","following_url":"https://api.github.com/users/data-integrations/following{/other_user}","gists_url":"https://api.github.com/users/data-integrations/gists{/gist_id}","starred_url":"https://api.github.com/users/data-integrations/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/data-integrations/subscriptions","organizations_url":"https://api.github.com/users/data-integrations/orgs","repos_url":"https://api.github.com/users/data-integrations/repos","events_url":"https://api.github.com/users/data-integrations/events{/privacy}","received_events_url":"https://api.github.com/users/data-integrations/received_events","type":"Organization","site_admin":false},"repo":{"id":74907921,"node_id":"MDEwOlJlcG9zaXRvcnk3NDkwNzkyMQ==","name":"wrangler","full_name":"data-integrations/wrangler","owner":{"login":"data-integrations","id":23705097,"node_id":"MDEyOk9yZ2FuaXphdGlvbjIzNzA1MDk3","avatar_url":"https://avatars3.githubusercontent.com/u/23705097?v=4","gravatar_id":"","url":"https://api.github.com/users/data-integrations","html_url":"https://github.com/data-integrations","followers_url":"https://api.github.com/users/data-integrations/followers","following_url":"https://api.github.com/users/data-integrations/following{/other_user}","gists_url":"https://api.github.com/users/data-integrations/gists{/gist_id}","starred_url":"https://api.github.com/users/data-integrations/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/data-integrations/subscriptions","organizations_url":"https://api.github.com/users/data-integrations/orgs","repos_url":"https://api.github.com/users/data-integrations/repos","events_url":"https://api.github.com/users/data-integrations/events{/privacy}","received_events_url":"https://api.github.com/users/data-integrations/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/data-integrations/wrangler","description":"Wrangler Transform: A DMD system for transforming Big Data","fork":false,"url":"https://api.github.com/repos/data-integrations/wrangler","forks_url":"https://api.github.com/repos/data-integrations/wrangler/forks","keys_url":"https://api.github.com/repos/data-integrations/wrangler/keys{/key_id}","collaborators_url":"https://api.github.com/repos/data-integrations/wrangler/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/data-integrations/wrangler/teams","hooks_url":"https://api.github.com/repos/data-integrations/wrangler/hooks","issue_events_url":"https://api.github.com/repos/data-integrations/wrangler/issues/events{/number}","events_url":"https://api.github.com/repos/data-integrations/wrangler/events","assignees_url":"https://api.github.com/repos/data-integrations/wrangler/assignees{/user}","branches_url":"https://api.github.com/repos/data-integrations/wrangler/branches{/branch}","tags_url":"https://api.github.com/repos/data-integrations/wrangler/tags","blobs_url":"https://api.github.com/repos/data-integrations/wrangler/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/data-integrations/wrangler/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/data-integrations/wrangler/git/refs{/sha}","trees_url":"https://api.github.com/repos/data-integrations/wrangler/git/trees{/sha}","statuses_url":"https://api.github.com/repos/data-integrations/wrangler/statuses/{sha}","languages_url":"https://api.github.com/repos/data-integrations/wrangler/languages","stargazers_url":"https://api.github.com/repos/data-integrations/wrangler/stargazers","contributors_url":"https://api.github.com/repos/data-integrations/wrangler/contributors","subscribers_url":"https://api.github.com/repos/data-integrations/wrangler/subscribers","subscription_url":"https://api.github.com/repos/data-integrations/wrangler/subscription","commits_url":"https://api.github.com/repos/data-integrations/wrangler/commits{/sha}","git_commits_url":"https://api.github.com/repos/data-integrations/wrangler/git/commits{/sha}","comments_url":"https://api.github.com/repos/data-integrations/wrangler/comments{/number}","issue_comment_url":"https://api.github.com/repos/data-integrations/wrangler/issues/comments{/number}","contents_url":"https://api.github.com/repos/data-integrations/wrangler/contents/{+path}","compare_url":"https://api.github.com/repos/data-integrations/wrangler/compare/{base}...{head}","merges_url":"https://api.github.com/repos/data-integrations/wrangler/merges","archive_url":"https://api.github.com/repos/data-integrations/wrangler/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/data-integrations/wrangler/downloads","issues_url":"https://api.github.com/repos/data-integrations/wrangler/issues{/number}","pulls_url":"https://api.github.com/repos/data-integrations/wrangler/pulls{/number}","milestones_url":"https://api.github.com/repos/data-integrations/wrangler/milestones{/number}","notifications_url":"https://api.github.com/repos/data-integrations/wrangler/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/data-integrations/wrangler/labels{/name}","releases_url":"https://api.github.com/repos/data-integrations/wrangler/releases{/id}","deployments_url":"https://api.github.com/repos/data-integrations/wrangler/deployments","created_at":"2016-11-27T19:01:32Z","updated_at":"2018-08-31T08:12:56Z","pushed_at":"2018-08-31T16:59:28Z","git_url":"git://github.com/data-integrations/wrangler.git","ssh_url":"git@github.com:data-integrations/wrangler.git","clone_url":"https://github.com/data-integrations/wrangler.git","svn_url":"https://github.com/data-integrations/wrangler","homepage":"http://docs.cask.co/cdap/current/en/developers-manual/pipelines/index.html","size":30155,"stargazers_count":12,"watchers_count":12,"language":"Java","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":7,"mirror_url":null,"archived":false,"open_issues_count":4,"license":{"key":"apache-2.0","name":"Apache License 2.0","spdx_id":"Apache-2.0","url":"https://api.github.com/licenses/apache-2.0","node_id":"MDc6TGljZW5zZTI="},"forks":7,"open_issues":4,"watchers":12,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/data-integrations/wrangler/pulls/225"},"html":{"href":"https://github.com/data-integrations/wrangler/pull/225"},"issue":{"href":"https://api.github.com/repos/data-integrations/wrangler/issues/225"},"comments":{"href":"https://api.github.com/repos/data-integrations/wrangler/issues/225/comments"},"review_comments":{"href":"https://api.github.com/repos/data-integrations/wrangler/pulls/225/comments"},"review_comment":{"href":"https://api.github.com/repos/data-integrations/wrangler/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/data-integrations/wrangler/pulls/225/commits"},"statuses":{"href":"https://api.github.com/repos/data-integrations/wrangler/statuses/a889714f5e506883435e7e499a9f36c3e599f2bd"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"albertshau"}}