{"action":"created","comment":{"url":"https://api.github.com/repos/google/google-api-dotnet-client/pulls/comments/36226928","id":36226928,"diff_hunk":"@@ -0,0 +1,270 @@\n+﻿/*\n+Copyright 2015 Google Inc\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+using System;\n+using System.Collections.Generic;\n+using System.IO;\n+using System.Linq;\n+using System.Net.Http;\n+using System.Text;\n+using System.Threading;\n+using System.Threading.Tasks;\n+\n+using Moq;\n+using NUnit.Framework;\n+\n+using Google.Apis.Auth.OAuth2.Requests;\n+using Google.Apis.Auth.OAuth2.Responses;\n+using Google.Apis.Http;\n+using Google.Apis.Json;\n+using Google.Apis.Testing;\n+using Google.Apis.Util;\n+using Google.Apis.Util.Store;\n+\n+namespace Google.Apis.Auth.OAuth2.DefaultCredentials\n+{\n+    /// <summary>A mock for the <see cref=\"Google.Apis.Auth.OAuth2.DefaultCredentialProvider\"/>.</summary>\n+    class MockDefaultCredentialProvider : DefaultCredentialProvider\n+    {\n+        Dictionary<string, string> envVars = new Dictionary<string, string>();\n+        Dictionary<string, string> fileContents = new Dictionary<string, string>();\n+\n+        protected override string GetEnvironmentVariable(string variableName)\n+        {\n+            if (!envVars.ContainsKey(variableName))\n+                return null;\n+\n+            return envVars[variableName];\n+        }\n+\n+        public void SetEnvironmentVariable(string variableName, string value)\n+        {\n+            envVars[variableName] = value;\n+        }\n+\n+        protected override Stream GetStream(string filePath)\n+        {\n+            if (!fileContents.ContainsKey(filePath))\n+            {\n+                throw new System.IO.FileNotFoundException();\n+            }\n+\n+            return new MemoryStream(Encoding.UTF8.GetBytes(fileContents[filePath]));\n+        }\n+\n+        public void SetFileContents(string filePath, string contents)\n+        {\n+            fileContents[filePath] = contents;\n+        }\n+    }\n+\n+    /// <summary>Tests for <see cref=\"Google.Apis.Auth.OAuth2.DefaultCredentialProvider\"/>.</summary>\n+    [TestFixture]\n+    public class DefaultCredentialProviderTests\n+    {\n+        private static readonly string WellKnownCredentialFilePath = Path.Combine(AppDataValue, \"gcloud\", \"application_default_credentials.json\");\n+        private static readonly string WellKnownCredentialFilePathUnix = Path.Combine(HomeValue, \".config\", \"gcloud\", \"application_default_credentials.json\");\n+\n+        private const string AppDataValue = \"AppDataEnvVarValue\";\n+        private const string HomeValue = \"HomeEnvVarValue\";\n+        private const string CredentialEnvironmentVariable = \"GOOGLE_APPLICATION_CREDENTIALS\";\n+        private const string DummyUserCredentialFileContents = @\"{\n+\"\"client_id\"\": \"\"CLIENT_ID\"\",\n+\"\"client_secret\"\": \"\"CLIENT_SECRET\"\",\n+\"\"refresh_token\"\": \"\"REFRESH_TOKEN\"\",\n+\"\"type\"\": \"\"authorized_user\"\"}\";\n+        private const string DummyServiceAccountCredentialFileContents = @\"{\n+\"\"private_key_id\"\": \"\"PRIVATE_KEY_ID\"\",\n+\"\"private_key\"\": \"\"-----BEGIN PRIVATE KEY-----\n+MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJJM6HT4s6btOsfe\n+2x4zrzrwSUtmtR37XTTi0sPARTDF8uzmXy8UnE5RcVJzEH5T2Ssz/ylX4Sl/CI4L\n+no1l8j9GiHJb49LSRjWe4Yx936q0Xj9H0R1HTxvjUPqwAsTwy2fKBTog+q1frqc9\n+o8s2r6LYivUGDVbhuUzCaMJsf+x3AgMBAAECgYEAi0FTXsu/zRswAUGaViQiHjrL\n+uU65BSHXNVjV/2fLNEKnGWGqpli68z1IXY+S2nwbUak7rnGsq9/0F6jtsW+hZbLk\n+KXUOuuExpeC5Kd6ngWX/f2jqmhlUabiQijU9cVk7pMq8EHkRtvlosnMTUAEzempu\n+QUPwn1PZHhmJkBvZ4lECQQDCErrxl+e3BwUDcS0yVEEmCNSG6xdXs2878b8rzbe7\n+3Mmi6SuuOLi3PU92J+j+f/MOdtYrk13mEDdYmd5dhrt5AkEAwPvDEsDT/W4y4h5n\n+gv1awGBA5aLFE1JNWM/Gwn4D1cGpEDHKFREaBtxMDCASpHJuw8r7zUywpKhmBZcf\n+GS37bwJANdSAKfbafLfjuhqwUJ9yGpykZm/a36aTmerp/bpn1iHdg+RtCzwMcDb/\n+TWSwibbvsflgWmHbz657y4WSWhq+8QJAWrpCNN/ZCk2zuGDo80lfUBAwkoVat8G6\n+wWU1oZyS+vzIGef+hLb8kHsjeZPej9eIwZ39kcBbT54oELrCkRjwGwJAQ8V2A7lT\n+ZUp8AsbVqF6rbLiiUfJMo2btGclQu4DEVyS+ymFA65tXDLUuR9EDqJYdqHNZJ5B8\n+4Z5p2prkjWTLcA\\u003d\\u003d\n+-----END PRIVATE KEY-----\"\",\n+\"\"client_email\"\": \"\"CLIENT_EMAIL\"\",\n+\"\"client_id\"\": \"\"CLIENT_ID\"\",\n+\"\"type\"\": \"\"service_account\"\"}\";\n+        private const string BrokenPkcs8KeyServiceAccountCredentialFileContents = @\"{\n+\"\"private_key_id\"\": \"\"PRIVATE_KEY_ID\"\",\n+\"\"private_key\"\": \"\"-----BEGIN PRIVATE KEY-----\n+MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJJM6HT4s6btOsfe\n+-----END PRIVATE KEY-----\"\",\n+\"\"client_email\"\": \"\"CLIENT_EMAIL\"\",\n+\"\"client_id\"\": \"\"CLIENT_ID\"\",\n+\"\"type\"\": \"\"service_account\"\"}\";\n+\n+        private MockDefaultCredentialProvider credentialProvider;\n+\n+        [SetUp]\n+        public void SetUp()\n+        {\n+            credentialProvider = new MockDefaultCredentialProvider();\n+        }\n+\n+        #region UserCredential\n+\n+        [Test]\n+        public async Task GetDefaultCredential_UserCredential_FromEnvironmentVariable()","path":"Src/GoogleApis.Auth.DotNet4.Tests/OAuth2/DefaultCredentialProvider/DefaultCredentialProviderTests.cs","position":130,"original_position":130,"commit_id":"93b6bffa49be799ad7b6bb67f1723615f2fa240c","original_commit_id":"93b6bffa49be799ad7b6bb67f1723615f2fa240c","user":{"login":"peleyal","id":3082873,"avatar_url":"https://avatars.githubusercontent.com/u/3082873?v=3","gravatar_id":"","url":"https://api.github.com/users/peleyal","html_url":"https://github.com/peleyal","followers_url":"https://api.github.com/users/peleyal/followers","following_url":"https://api.github.com/users/peleyal/following{/other_user}","gists_url":"https://api.github.com/users/peleyal/gists{/gist_id}","starred_url":"https://api.github.com/users/peleyal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/peleyal/subscriptions","organizations_url":"https://api.github.com/users/peleyal/orgs","repos_url":"https://api.github.com/users/peleyal/repos","events_url":"https://api.github.com/users/peleyal/events{/privacy}","received_events_url":"https://api.github.com/users/peleyal/received_events","type":"User","site_admin":false},"body":"In general, I would add comments to the tests, explaining what are we testing in each kind. You can have it in the test level or before the Assert lines. Even for me that is reviewing this PR on and off, it's not that clear, why you have several of the following Asserts...\r\ndoes it make sense?","created_at":"2015-08-04T18:51:38Z","updated_at":"2015-08-04T18:51:38Z","html_url":"https://github.com/google/google-api-dotnet-client/pull/564#discussion_r36226928","pull_request_url":"https://api.github.com/repos/google/google-api-dotnet-client/pulls/564","_links":{"self":{"href":"https://api.github.com/repos/google/google-api-dotnet-client/pulls/comments/36226928"},"html":{"href":"https://github.com/google/google-api-dotnet-client/pull/564#discussion_r36226928"},"pull_request":{"href":"https://api.github.com/repos/google/google-api-dotnet-client/pulls/564"}}},"pull_request":{"url":"https://api.github.com/repos/google/google-api-dotnet-client/pulls/564","id":40382354,"html_url":"https://github.com/google/google-api-dotnet-client/pull/564","diff_url":"https://github.com/google/google-api-dotnet-client/pull/564.diff","patch_url":"https://github.com/google/google-api-dotnet-client/pull/564.patch","issue_url":"https://api.github.com/repos/google/google-api-dotnet-client/issues/564","number":564,"state":"open","locked":false,"title":"Application Default Credentials after API polishing","user":{"login":"jtattermusch","id":9939684,"avatar_url":"https://avatars.githubusercontent.com/u/9939684?v=3","gravatar_id":"","url":"https://api.github.com/users/jtattermusch","html_url":"https://github.com/jtattermusch","followers_url":"https://api.github.com/users/jtattermusch/followers","following_url":"https://api.github.com/users/jtattermusch/following{/other_user}","gists_url":"https://api.github.com/users/jtattermusch/gists{/gist_id}","starred_url":"https://api.github.com/users/jtattermusch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jtattermusch/subscriptions","organizations_url":"https://api.github.com/users/jtattermusch/orgs","repos_url":"https://api.github.com/users/jtattermusch/repos","events_url":"https://api.github.com/users/jtattermusch/events{/privacy}","received_events_url":"https://api.github.com/users/jtattermusch/received_events","type":"User","site_admin":false},"body":"This PR contains code from #553, with the latest changes from upstream/master merged.\r\nI originally created this branch just to facilitate cleaning up the git history and to fix some of the style nits in the code.\r\n\r\nNevertheless, once I started editing the code, I realized there were some major issues with the API in the original pull request (perhaps introduced while addressing review comments)  - for example the object returned from GoogleAuth.GetApplicationDefaultCredentials() didn't expose the IsCreateScopedRequired property and accessing that property required guessing that the default credential is a service account credential in fact, explicitly typecasting it and only after that, you were able to access the IsCreateScopedRequired property - which makes no sense at all. I found other problems as well (those that are hard to catch in review until you actually start modifying the code).\r\n\r\nSo, because there were some concerns about the API in the past, i decided to take the app default credentials code (I haven't changed most of the code that implements the actual logic) and adjust the API layout.\r\n\r\nThe new API introduces a new type GoogleCredential (returned by GetApplicationDefaultCredentials()), which acts as a very thin wrapper for other credential types. That way, the API of the existing credential types could stay intact and GoogleCredential can still provide all the functionality needed. Arguably, the new design is cleaner and possibly allows more tweaking in the future if necessary.\r\n\r\nThe code is still not 100% finished, but I believe it is in good shape for an initial review (of the API and high level changes I've made).\r\n\r\n@vsubramani  @peleyal  for review","created_at":"2015-07-20T18:31:32Z","updated_at":"2015-08-04T18:51:38Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8712822053aeda448a9c4f635ec40a15b8873348","assignee":{"login":"peleyal","id":3082873,"avatar_url":"https://avatars.githubusercontent.com/u/3082873?v=3","gravatar_id":"","url":"https://api.github.com/users/peleyal","html_url":"https://github.com/peleyal","followers_url":"https://api.github.com/users/peleyal/followers","following_url":"https://api.github.com/users/peleyal/following{/other_user}","gists_url":"https://api.github.com/users/peleyal/gists{/gist_id}","starred_url":"https://api.github.com/users/peleyal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/peleyal/subscriptions","organizations_url":"https://api.github.com/users/peleyal/orgs","repos_url":"https://api.github.com/users/peleyal/repos","events_url":"https://api.github.com/users/peleyal/events{/privacy}","received_events_url":"https://api.github.com/users/peleyal/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/google/google-api-dotnet-client/pulls/564/commits","review_comments_url":"https://api.github.com/repos/google/google-api-dotnet-client/pulls/564/comments","review_comment_url":"https://api.github.com/repos/google/google-api-dotnet-client/pulls/comments{/number}","comments_url":"https://api.github.com/repos/google/google-api-dotnet-client/issues/564/comments","statuses_url":"https://api.github.com/repos/google/google-api-dotnet-client/statuses/93b6bffa49be799ad7b6bb67f1723615f2fa240c","head":{"label":"jtattermusch:AppDefaultProgress","ref":"AppDefaultProgress","sha":"93b6bffa49be799ad7b6bb67f1723615f2fa240c","user":{"login":"jtattermusch","id":9939684,"avatar_url":"https://avatars.githubusercontent.com/u/9939684?v=3","gravatar_id":"","url":"https://api.github.com/users/jtattermusch","html_url":"https://github.com/jtattermusch","followers_url":"https://api.github.com/users/jtattermusch/followers","following_url":"https://api.github.com/users/jtattermusch/following{/other_user}","gists_url":"https://api.github.com/users/jtattermusch/gists{/gist_id}","starred_url":"https://api.github.com/users/jtattermusch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jtattermusch/subscriptions","organizations_url":"https://api.github.com/users/jtattermusch/orgs","repos_url":"https://api.github.com/users/jtattermusch/repos","events_url":"https://api.github.com/users/jtattermusch/events{/privacy}","received_events_url":"https://api.github.com/users/jtattermusch/received_events","type":"User","site_admin":false},"repo":{"id":38863126,"name":"google-api-dotnet-client","full_name":"jtattermusch/google-api-dotnet-client","owner":{"login":"jtattermusch","id":9939684,"avatar_url":"https://avatars.githubusercontent.com/u/9939684?v=3","gravatar_id":"","url":"https://api.github.com/users/jtattermusch","html_url":"https://github.com/jtattermusch","followers_url":"https://api.github.com/users/jtattermusch/followers","following_url":"https://api.github.com/users/jtattermusch/following{/other_user}","gists_url":"https://api.github.com/users/jtattermusch/gists{/gist_id}","starred_url":"https://api.github.com/users/jtattermusch/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jtattermusch/subscriptions","organizations_url":"https://api.github.com/users/jtattermusch/orgs","repos_url":"https://api.github.com/users/jtattermusch/repos","events_url":"https://api.github.com/users/jtattermusch/events{/privacy}","received_events_url":"https://api.github.com/users/jtattermusch/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/jtattermusch/google-api-dotnet-client","description":"Google APIs Client Library for .NET","fork":true,"url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client","forks_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/forks","keys_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/keys{/key_id}","collaborators_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/teams","hooks_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/hooks","issue_events_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/issues/events{/number}","events_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/events","assignees_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/assignees{/user}","branches_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/branches{/branch}","tags_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/tags","blobs_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/git/refs{/sha}","trees_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/git/trees{/sha}","statuses_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/statuses/{sha}","languages_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/languages","stargazers_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/stargazers","contributors_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/contributors","subscribers_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/subscribers","subscription_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/subscription","commits_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/commits{/sha}","git_commits_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/git/commits{/sha}","comments_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/comments{/number}","issue_comment_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/issues/comments{/number}","contents_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/contents/{+path}","compare_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/compare/{base}...{head}","merges_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/merges","archive_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/downloads","issues_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/issues{/number}","pulls_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/pulls{/number}","milestones_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/milestones{/number}","notifications_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/labels{/name}","releases_url":"https://api.github.com/repos/jtattermusch/google-api-dotnet-client/releases{/id}","created_at":"2015-07-10T05:41:46Z","updated_at":"2015-07-10T05:41:47Z","pushed_at":"2015-08-03T23:13:14Z","git_url":"git://github.com/jtattermusch/google-api-dotnet-client.git","ssh_url":"git@github.com:jtattermusch/google-api-dotnet-client.git","clone_url":"https://github.com/jtattermusch/google-api-dotnet-client.git","svn_url":"https://github.com/jtattermusch/google-api-dotnet-client","homepage":"https://developers.google.com/api-client-library/dotnet","size":8850,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_downloads":false,"has_wiki":false,"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":"google:master","ref":"master","sha":"591ea827922ef4f5a2b32f5aad18a823bbfc0286","user":{"login":"google","id":1342004,"avatar_url":"https://avatars.githubusercontent.com/u/1342004?v=3","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"repo":{"id":33947900,"name":"google-api-dotnet-client","full_name":"google/google-api-dotnet-client","owner":{"login":"google","id":1342004,"avatar_url":"https://avatars.githubusercontent.com/u/1342004?v=3","gravatar_id":"","url":"https://api.github.com/users/google","html_url":"https://github.com/google","followers_url":"https://api.github.com/users/google/followers","following_url":"https://api.github.com/users/google/following{/other_user}","gists_url":"https://api.github.com/users/google/gists{/gist_id}","starred_url":"https://api.github.com/users/google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/google/subscriptions","organizations_url":"https://api.github.com/users/google/orgs","repos_url":"https://api.github.com/users/google/repos","events_url":"https://api.github.com/users/google/events{/privacy}","received_events_url":"https://api.github.com/users/google/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/google/google-api-dotnet-client","description":"Google APIs Client Library for .NET","fork":false,"url":"https://api.github.com/repos/google/google-api-dotnet-client","forks_url":"https://api.github.com/repos/google/google-api-dotnet-client/forks","keys_url":"https://api.github.com/repos/google/google-api-dotnet-client/keys{/key_id}","collaborators_url":"https://api.github.com/repos/google/google-api-dotnet-client/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/google/google-api-dotnet-client/teams","hooks_url":"https://api.github.com/repos/google/google-api-dotnet-client/hooks","issue_events_url":"https://api.github.com/repos/google/google-api-dotnet-client/issues/events{/number}","events_url":"https://api.github.com/repos/google/google-api-dotnet-client/events","assignees_url":"https://api.github.com/repos/google/google-api-dotnet-client/assignees{/user}","branches_url":"https://api.github.com/repos/google/google-api-dotnet-client/branches{/branch}","tags_url":"https://api.github.com/repos/google/google-api-dotnet-client/tags","blobs_url":"https://api.github.com/repos/google/google-api-dotnet-client/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/google/google-api-dotnet-client/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/google/google-api-dotnet-client/git/refs{/sha}","trees_url":"https://api.github.com/repos/google/google-api-dotnet-client/git/trees{/sha}","statuses_url":"https://api.github.com/repos/google/google-api-dotnet-client/statuses/{sha}","languages_url":"https://api.github.com/repos/google/google-api-dotnet-client/languages","stargazers_url":"https://api.github.com/repos/google/google-api-dotnet-client/stargazers","contributors_url":"https://api.github.com/repos/google/google-api-dotnet-client/contributors","subscribers_url":"https://api.github.com/repos/google/google-api-dotnet-client/subscribers","subscription_url":"https://api.github.com/repos/google/google-api-dotnet-client/subscription","commits_url":"https://api.github.com/repos/google/google-api-dotnet-client/commits{/sha}","git_commits_url":"https://api.github.com/repos/google/google-api-dotnet-client/git/commits{/sha}","comments_url":"https://api.github.com/repos/google/google-api-dotnet-client/comments{/number}","issue_comment_url":"https://api.github.com/repos/google/google-api-dotnet-client/issues/comments{/number}","contents_url":"https://api.github.com/repos/google/google-api-dotnet-client/contents/{+path}","compare_url":"https://api.github.com/repos/google/google-api-dotnet-client/compare/{base}...{head}","merges_url":"https://api.github.com/repos/google/google-api-dotnet-client/merges","archive_url":"https://api.github.com/repos/google/google-api-dotnet-client/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/google/google-api-dotnet-client/downloads","issues_url":"https://api.github.com/repos/google/google-api-dotnet-client/issues{/number}","pulls_url":"https://api.github.com/repos/google/google-api-dotnet-client/pulls{/number}","milestones_url":"https://api.github.com/repos/google/google-api-dotnet-client/milestones{/number}","notifications_url":"https://api.github.com/repos/google/google-api-dotnet-client/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/google/google-api-dotnet-client/labels{/name}","releases_url":"https://api.github.com/repos/google/google-api-dotnet-client/releases{/id}","created_at":"2015-04-14T17:56:22Z","updated_at":"2015-08-03T01:27:22Z","pushed_at":"2015-08-03T23:13:15Z","git_url":"git://github.com/google/google-api-dotnet-client.git","ssh_url":"git@github.com:google/google-api-dotnet-client.git","clone_url":"https://github.com/google/google-api-dotnet-client.git","svn_url":"https://github.com/google/google-api-dotnet-client","homepage":"https://developers.google.com/api-client-library/dotnet","size":12722,"stargazers_count":49,"watchers_count":49,"language":"C#","has_issues":true,"has_downloads":false,"has_wiki":false,"has_pages":false,"forks_count":28,"mirror_url":null,"open_issues_count":97,"forks":28,"open_issues":97,"watchers":49,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/google/google-api-dotnet-client/pulls/564"},"html":{"href":"https://github.com/google/google-api-dotnet-client/pull/564"},"issue":{"href":"https://api.github.com/repos/google/google-api-dotnet-client/issues/564"},"comments":{"href":"https://api.github.com/repos/google/google-api-dotnet-client/issues/564/comments"},"review_comments":{"href":"https://api.github.com/repos/google/google-api-dotnet-client/pulls/564/comments"},"review_comment":{"href":"https://api.github.com/repos/google/google-api-dotnet-client/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/google/google-api-dotnet-client/pulls/564/commits"},"statuses":{"href":"https://api.github.com/repos/google/google-api-dotnet-client/statuses/93b6bffa49be799ad7b6bb67f1723615f2fa240c"}}}}