{"action":"created","comment":{"url":"https://api.github.com/repos/nunit/nunit/pulls/comments/57530871","id":57530871,"diff_hunk":"@@ -0,0 +1,392 @@\n+﻿// ***********************************************************************\n+// Copyright (c) 2008-2015 Charlie Poole\n+//\n+// Permission is hereby granted, free of charge, to any person obtaining\n+// a copy of this software and associated documentation files (the\n+// \"Software\"), to deal in the Software without restriction, including\n+// without limitation the rights to use, copy, modify, merge, publish,\n+// distribute, sublicense, and/or sell copies of the Software, and to\n+// permit persons to whom the Software is furnished to do so, subject to\n+// the following conditions:\n+// \n+// The above copyright notice and this permission notice shall be\n+// included in all copies or substantial portions of the Software.\n+// \n+// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\n+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\n+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\n+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n+// ***********************************************************************\n+\n+using System;\n+using System.IO;\n+using System.Xml;\n+using System.Collections;\n+using System.Collections.Generic;\n+using System.Reflection;\n+using NUnit.Framework.Interfaces;\n+using NUnit.Framework.Internal;\n+using NUnit.Framework.Internal.Builders;\n+\n+namespace NUnit.Framework\n+{\n+\n+  /// <summary>\n+  /// The type of external data source\n+  /// </summary>\n+  public enum DataSourceType: int {\n+    /// <summary>\n+    /// No datas ource is specified. This is the default state.\n+    /// </summary>\n+    Null = 0,\n+    \n+    /// <summary>\n+    /// Data source is a comma separated value (CSV) file.\n+    /// </summary>\n+    Csv = 1,\n+    \n+    /// <summary>\n+    /// Data source is an XML document\n+    /// </summary>\n+    Xml = 2,\n+    \n+    /// <summary>\n+    /// Data source is a database\n+    /// </summary>\n+    Db = 4\n+  };\n+  \n+  /// <summary>\n+  /// Common amounts of data rows to collect\n+  /// </summary>\n+  public enum DataRowCount: int {\n+    /// <summary>\n+    /// Read all rows\n+    /// </summary>\n+    All = 0\n+  }\n+  \n+  \n+  /// <summary>\n+  /// Specifies an external data source for test methods. This is evaulated at compile time.\n+  /// </summary>\n+  [AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = false)]\n+  public class DataSourceAttribute : NUnitAttribute, ITestBuilder, IImplyFixture\n+  {\n+    private NUnitTestCaseBuilder _builder = new NUnitTestCaseBuilder();\n+\n+    #region Constructors\n+\n+    /// <summary>\n+    /// Constructs the object responsible for obtaining test data.\n+    /// </summary>\n+    /// <param name=\"dataType\">The type of data provider</param>\n+    /// <param name=\"sourceName\">The connection string for the data source. It could be a filename or DB connection string.</param>\n+    /// <param name=\"rowCount\">The number of rows to collect from the data source. By default it is all rows</param>\n+    public DataSourceAttribute(DataSourceType dataType, string sourceName, int rowCount = (int)DataRowCount.All)\n+    {\n+      this.SourceName = sourceName;\n+      this.DataType = dataType;\n+      this.DataRows = rowCount;\n+    }\n+    \n+    #endregion\n+\n+    #region Properties\n+\n+    /// <summary>a\n+    /// The name of a file or connection string which contains the data\n+    /// </summary>\n+    public string SourceName { get; private set; }\n+\n+    /// <summary>\n+    /// The data input type\n+    /// </summary>\n+    public DataSourceType DataType {get; private set;}\n+\n+    /// <summary>\n+    /// The number of rows to read from the source. Zero takes a special meaning to be all rows. This is the default.\n+    /// </summary>\n+    public int DataRows { get; set;}\n+    \n+    #endregion\n+    \n+    #region ITestCaseSource Members\n+    \n+    /// <summary>\n+    /// Returns a set of test case parameters for use as arguments\n+    /// to a parameterized test method.\n+    /// </summary>\n+    /// <param name=\"method\">The method for which data is needed.</param>\n+    /// <returns></returns>\n+    private IEnumerable<TestCaseParameters> GetTestCasesFor(IMethodInfo method)\n+    {\n+      List<TestCaseParameters> data = new List<TestCaseParameters>();\n+\n+      try\n+      {\n+        IEnumerable source = GetDataFromSource(method);\n+\n+        if(source != null)\n+        {\n+          #if NETCF\n+          ParameterInfo[] parameters = method.IsGenericMethodDefinition ? new ParameterInfo[0] : method.GetParameters();\n+          #else\n+          IParameterInfo[] parameters = method.GetParameters();\n+          #endif\n+\n+          foreach (object item in source)\n+          {\n+            var parms = item as TestCaseParameters;\n+\n+            if (parms == null)\n+            {\n+              object[] args = item as object[];\n+              if (args != null)\n+              {\n+                #if NETCF\n+                if (method.IsGenericMethodDefinition)\n+                {\n+                  var mi = method.MakeGenericMethodEx(args);\n+                  parameters = mi == null ? new ParameterInfo[0] : mi.GetParameters();\n+                }\n+                #endif\n+                if (args.Length != parameters.Length)\n+                  args = new object[] { item };\n+              }\n+              else if (item is Array)\n+              {\n+                Array array = item as Array;\n+\n+                #if NETCF\n+                if (array.Rank == 1 && (method.IsGenericMethodDefinition || array.Length == parameters.Length))\n+                  #else\n+                  if (array.Rank == 1 && array.Length == parameters.Length)\n+                    #endif\n+                {\n+                  args = new object[array.Length];\n+                  for (int i = 0; i < array.Length; i++)\n+                    args[i] = array.GetValue(i);\n+                  #if NETCF\n+                  if (method.IsGenericMethodDefinition)\n+                  {\n+                    var mi = method.MakeGenericMethodEx(args);\n+\n+                    if (mi == null || array.Length != mi.GetParameters().Length)\n+                      args = new object[] {item};\n+                  }\n+                  #endif\n+                }\n+                else\n+                {\n+                  args = new object[] { item };\n+                }\n+              }\n+              else\n+              {\n+                args = new object[] { item };\n+              }\n+\n+              parms = new TestCaseParameters(args);\n+            }\n+\n+            data.Add(parms);\n+          }\n+        }\n+      }\n+      catch (Exception ex)\n+      {\n+        data.Clear();\n+        data.Add(new TestCaseParameters(ex));\n+      }\n+\n+      return data;\n+    }\n+    \n+    #endregion\n+    \n+    #region ITestBuilder Members\n+\n+    /// <summary>\n+    /// Construct one or more TestMethods from a given MethodInfo,\n+    /// using available parameter data.\n+    /// </summary>\n+    /// <param name=\"method\">The MethodInfo for which tests are to be constructed.</param>\n+    /// <param name=\"suite\">The suite to which the tests will be added.</param>\n+    /// <returns>One or more TestMethods</returns>\n+    public IEnumerable<TestMethod> BuildFrom(IMethodInfo method, Test suite)\n+    {\n+      foreach (TestCaseParameters tcp in GetTestCasesFor(method))\n+        yield return _builder.BuildTestMethod(method, suite, tcp);\n+    }\n+    \n+    #endregion\n+\n+    #region Helper Methods\n+\n+    private IEnumerable GetDataFromSource(IMethodInfo method){\n+      \n+      #region Error Checking\n+      \n+      // file name sources\n+      if (DataType == DataSourceType.Csv || DataType == DataSourceType.Xml){\n+        if (!File.Exists(SourceName)){\n+          string errMsg = String.Format(\"Unable to find source: {0}\", SourceName);\n+          throw new FileNotFoundException(errMsg);\n+        }\n+      }\n+      \n+      // TODO: Database file sources\n+      \n+      #endregion\n+      \n+      /*\n+       * Get data depending on the source. I catch the errors here and then marshall\n+       * any known errors.\n+       */\n+      \n+      try {\n+        \n+        if (DataType == DataSourceType.Csv){\n+          return GetCsvData(method);\n+        }\n+        \n+        if (DataType == DataSourceType.Xml) {\n+          return GetXmlData(method);\n+        }\n+        \n+      } catch (Exception e) {\n+        throw e;\n+      }\n+      \n+      return null;\n+    }\n+    \n+    private IEnumerable GetCsvData(IMethodInfo method)","path":"src/NUnitFramework/framework/Attributes/DataSourceAttribute.cs","position":268,"original_position":268,"commit_id":"ede1530477249989c723183c5700cd34c3ca20fa","original_commit_id":"2faf8fc09bc720895c99d63feb0383ab6c902c7a","user":{"login":"rprouse","id":493828,"avatar_url":"https://avatars.githubusercontent.com/u/493828?v=3","gravatar_id":"","url":"https://api.github.com/users/rprouse","html_url":"https://github.com/rprouse","followers_url":"https://api.github.com/users/rprouse/followers","following_url":"https://api.github.com/users/rprouse/following{/other_user}","gists_url":"https://api.github.com/users/rprouse/gists{/gist_id}","starred_url":"https://api.github.com/users/rprouse/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rprouse/subscriptions","organizations_url":"https://api.github.com/users/rprouse/orgs","repos_url":"https://api.github.com/users/rprouse/repos","events_url":"https://api.github.com/users/rprouse/events{/privacy}","received_events_url":"https://api.github.com/users/rprouse/received_events","type":"User","site_admin":false},"body":"You have an Abstract DataSource base class. That class should have an abstract `GetData` method then each of these methods can be moved to the `DataSource` implementations.","created_at":"2016-03-27T16:14:02Z","updated_at":"2016-03-27T16:14:02Z","html_url":"https://github.com/nunit/nunit/pull/843#discussion_r57530871","pull_request_url":"https://api.github.com/repos/nunit/nunit/pulls/843","_links":{"self":{"href":"https://api.github.com/repos/nunit/nunit/pulls/comments/57530871"},"html":{"href":"https://github.com/nunit/nunit/pull/843#discussion_r57530871"},"pull_request":{"href":"https://api.github.com/repos/nunit/nunit/pulls/843"}}},"pull_request":{"url":"https://api.github.com/repos/nunit/nunit/pulls/843","id":45860628,"html_url":"https://github.com/nunit/nunit/pull/843","diff_url":"https://github.com/nunit/nunit/pull/843.diff","patch_url":"https://github.com/nunit/nunit/pull/843.patch","issue_url":"https://api.github.com/repos/nunit/nunit/issues/843","number":843,"state":"open","locked":false,"title":"Issue 706 - New attribute for test fixtures/cases supporting external data sources","user":{"login":"acco32","id":7876672,"avatar_url":"https://avatars.githubusercontent.com/u/7876672?v=3","gravatar_id":"","url":"https://api.github.com/users/acco32","html_url":"https://github.com/acco32","followers_url":"https://api.github.com/users/acco32/followers","following_url":"https://api.github.com/users/acco32/following{/other_user}","gists_url":"https://api.github.com/users/acco32/gists{/gist_id}","starred_url":"https://api.github.com/users/acco32/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/acco32/subscriptions","organizations_url":"https://api.github.com/users/acco32/orgs","repos_url":"https://api.github.com/users/acco32/repos","events_url":"https://api.github.com/users/acco32/events{/privacy}","received_events_url":"https://api.github.com/users/acco32/received_events","type":"User","site_admin":false},"body":"***Do not merge***\r\n\r\nJust a checkpoint review. Some items I still need to deal with are removing the test files once the suite (fixture) is run. The only remaining piece is to add the database connection string implementation. I thought this would be a good place to stop and get some feedback. Thanks in advance.\r\n\r\nFixes #706","created_at":"2015-09-24T05:28:52Z","updated_at":"2016-03-27T16:14:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"2e55b9788653840c26f65135ce624108669d391f","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/nunit/nunit/pulls/843/commits","review_comments_url":"https://api.github.com/repos/nunit/nunit/pulls/843/comments","review_comment_url":"https://api.github.com/repos/nunit/nunit/pulls/comments{/number}","comments_url":"https://api.github.com/repos/nunit/nunit/issues/843/comments","statuses_url":"https://api.github.com/repos/nunit/nunit/statuses/ede1530477249989c723183c5700cd34c3ca20fa","head":{"label":"acco32:issue-706","ref":"issue-706","sha":"ede1530477249989c723183c5700cd34c3ca20fa","user":{"login":"acco32","id":7876672,"avatar_url":"https://avatars.githubusercontent.com/u/7876672?v=3","gravatar_id":"","url":"https://api.github.com/users/acco32","html_url":"https://github.com/acco32","followers_url":"https://api.github.com/users/acco32/followers","following_url":"https://api.github.com/users/acco32/following{/other_user}","gists_url":"https://api.github.com/users/acco32/gists{/gist_id}","starred_url":"https://api.github.com/users/acco32/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/acco32/subscriptions","organizations_url":"https://api.github.com/users/acco32/orgs","repos_url":"https://api.github.com/users/acco32/repos","events_url":"https://api.github.com/users/acco32/events{/privacy}","received_events_url":"https://api.github.com/users/acco32/received_events","type":"User","site_admin":false},"repo":{"id":38518609,"name":"nunit","full_name":"acco32/nunit","owner":{"login":"acco32","id":7876672,"avatar_url":"https://avatars.githubusercontent.com/u/7876672?v=3","gravatar_id":"","url":"https://api.github.com/users/acco32","html_url":"https://github.com/acco32","followers_url":"https://api.github.com/users/acco32/followers","following_url":"https://api.github.com/users/acco32/following{/other_user}","gists_url":"https://api.github.com/users/acco32/gists{/gist_id}","starred_url":"https://api.github.com/users/acco32/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/acco32/subscriptions","organizations_url":"https://api.github.com/users/acco32/orgs","repos_url":"https://api.github.com/users/acco32/repos","events_url":"https://api.github.com/users/acco32/events{/privacy}","received_events_url":"https://api.github.com/users/acco32/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/acco32/nunit","description":"NUnit 3.0 framework, engine and console runner","fork":true,"url":"https://api.github.com/repos/acco32/nunit","forks_url":"https://api.github.com/repos/acco32/nunit/forks","keys_url":"https://api.github.com/repos/acco32/nunit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/acco32/nunit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/acco32/nunit/teams","hooks_url":"https://api.github.com/repos/acco32/nunit/hooks","issue_events_url":"https://api.github.com/repos/acco32/nunit/issues/events{/number}","events_url":"https://api.github.com/repos/acco32/nunit/events","assignees_url":"https://api.github.com/repos/acco32/nunit/assignees{/user}","branches_url":"https://api.github.com/repos/acco32/nunit/branches{/branch}","tags_url":"https://api.github.com/repos/acco32/nunit/tags","blobs_url":"https://api.github.com/repos/acco32/nunit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/acco32/nunit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/acco32/nunit/git/refs{/sha}","trees_url":"https://api.github.com/repos/acco32/nunit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/acco32/nunit/statuses/{sha}","languages_url":"https://api.github.com/repos/acco32/nunit/languages","stargazers_url":"https://api.github.com/repos/acco32/nunit/stargazers","contributors_url":"https://api.github.com/repos/acco32/nunit/contributors","subscribers_url":"https://api.github.com/repos/acco32/nunit/subscribers","subscription_url":"https://api.github.com/repos/acco32/nunit/subscription","commits_url":"https://api.github.com/repos/acco32/nunit/commits{/sha}","git_commits_url":"https://api.github.com/repos/acco32/nunit/git/commits{/sha}","comments_url":"https://api.github.com/repos/acco32/nunit/comments{/number}","issue_comment_url":"https://api.github.com/repos/acco32/nunit/issues/comments{/number}","contents_url":"https://api.github.com/repos/acco32/nunit/contents/{+path}","compare_url":"https://api.github.com/repos/acco32/nunit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/acco32/nunit/merges","archive_url":"https://api.github.com/repos/acco32/nunit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/acco32/nunit/downloads","issues_url":"https://api.github.com/repos/acco32/nunit/issues{/number}","pulls_url":"https://api.github.com/repos/acco32/nunit/pulls{/number}","milestones_url":"https://api.github.com/repos/acco32/nunit/milestones{/number}","notifications_url":"https://api.github.com/repos/acco32/nunit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/acco32/nunit/labels{/name}","releases_url":"https://api.github.com/repos/acco32/nunit/releases{/id}","deployments_url":"https://api.github.com/repos/acco32/nunit/deployments","created_at":"2015-07-04T02:29:11Z","updated_at":"2016-01-18T17:46:05Z","pushed_at":"2016-03-27T05:23:42Z","git_url":"git://github.com/acco32/nunit.git","ssh_url":"git@github.com:acco32/nunit.git","clone_url":"https://github.com/acco32/nunit.git","svn_url":"https://github.com/acco32/nunit","homepage":"http://www.nunit.org/","size":31665,"stargazers_count":0,"watchers_count":0,"language":"C#","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":"nunit:master","ref":"master","sha":"5387f4f50cef06ddd79aa32d71fa9833ce1419f8","user":{"login":"nunit","id":2678858,"avatar_url":"https://avatars.githubusercontent.com/u/2678858?v=3","gravatar_id":"","url":"https://api.github.com/users/nunit","html_url":"https://github.com/nunit","followers_url":"https://api.github.com/users/nunit/followers","following_url":"https://api.github.com/users/nunit/following{/other_user}","gists_url":"https://api.github.com/users/nunit/gists{/gist_id}","starred_url":"https://api.github.com/users/nunit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nunit/subscriptions","organizations_url":"https://api.github.com/users/nunit/orgs","repos_url":"https://api.github.com/users/nunit/repos","events_url":"https://api.github.com/users/nunit/events{/privacy}","received_events_url":"https://api.github.com/users/nunit/received_events","type":"Organization","site_admin":false},"repo":{"id":13692183,"name":"nunit","full_name":"nunit/nunit","owner":{"login":"nunit","id":2678858,"avatar_url":"https://avatars.githubusercontent.com/u/2678858?v=3","gravatar_id":"","url":"https://api.github.com/users/nunit","html_url":"https://github.com/nunit","followers_url":"https://api.github.com/users/nunit/followers","following_url":"https://api.github.com/users/nunit/following{/other_user}","gists_url":"https://api.github.com/users/nunit/gists{/gist_id}","starred_url":"https://api.github.com/users/nunit/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nunit/subscriptions","organizations_url":"https://api.github.com/users/nunit/orgs","repos_url":"https://api.github.com/users/nunit/repos","events_url":"https://api.github.com/users/nunit/events{/privacy}","received_events_url":"https://api.github.com/users/nunit/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/nunit/nunit","description":"NUnit 3.0 framework, engine and console runner","fork":false,"url":"https://api.github.com/repos/nunit/nunit","forks_url":"https://api.github.com/repos/nunit/nunit/forks","keys_url":"https://api.github.com/repos/nunit/nunit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/nunit/nunit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/nunit/nunit/teams","hooks_url":"https://api.github.com/repos/nunit/nunit/hooks","issue_events_url":"https://api.github.com/repos/nunit/nunit/issues/events{/number}","events_url":"https://api.github.com/repos/nunit/nunit/events","assignees_url":"https://api.github.com/repos/nunit/nunit/assignees{/user}","branches_url":"https://api.github.com/repos/nunit/nunit/branches{/branch}","tags_url":"https://api.github.com/repos/nunit/nunit/tags","blobs_url":"https://api.github.com/repos/nunit/nunit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/nunit/nunit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/nunit/nunit/git/refs{/sha}","trees_url":"https://api.github.com/repos/nunit/nunit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/nunit/nunit/statuses/{sha}","languages_url":"https://api.github.com/repos/nunit/nunit/languages","stargazers_url":"https://api.github.com/repos/nunit/nunit/stargazers","contributors_url":"https://api.github.com/repos/nunit/nunit/contributors","subscribers_url":"https://api.github.com/repos/nunit/nunit/subscribers","subscription_url":"https://api.github.com/repos/nunit/nunit/subscription","commits_url":"https://api.github.com/repos/nunit/nunit/commits{/sha}","git_commits_url":"https://api.github.com/repos/nunit/nunit/git/commits{/sha}","comments_url":"https://api.github.com/repos/nunit/nunit/comments{/number}","issue_comment_url":"https://api.github.com/repos/nunit/nunit/issues/comments{/number}","contents_url":"https://api.github.com/repos/nunit/nunit/contents/{+path}","compare_url":"https://api.github.com/repos/nunit/nunit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/nunit/nunit/merges","archive_url":"https://api.github.com/repos/nunit/nunit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/nunit/nunit/downloads","issues_url":"https://api.github.com/repos/nunit/nunit/issues{/number}","pulls_url":"https://api.github.com/repos/nunit/nunit/pulls{/number}","milestones_url":"https://api.github.com/repos/nunit/nunit/milestones{/number}","notifications_url":"https://api.github.com/repos/nunit/nunit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/nunit/nunit/labels{/name}","releases_url":"https://api.github.com/repos/nunit/nunit/releases{/id}","deployments_url":"https://api.github.com/repos/nunit/nunit/deployments","created_at":"2013-10-18T23:43:29Z","updated_at":"2016-03-25T18:03:25Z","pushed_at":"2016-03-27T05:23:42Z","git_url":"git://github.com/nunit/nunit.git","ssh_url":"git@github.com:nunit/nunit.git","clone_url":"https://github.com/nunit/nunit.git","svn_url":"https://github.com/nunit/nunit","homepage":"http://www.nunit.org/","size":36401,"stargazers_count":588,"watchers_count":588,"language":"C#","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":232,"mirror_url":null,"open_issues_count":220,"forks":232,"open_issues":220,"watchers":588,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/nunit/nunit/pulls/843"},"html":{"href":"https://github.com/nunit/nunit/pull/843"},"issue":{"href":"https://api.github.com/repos/nunit/nunit/issues/843"},"comments":{"href":"https://api.github.com/repos/nunit/nunit/issues/843/comments"},"review_comments":{"href":"https://api.github.com/repos/nunit/nunit/pulls/843/comments"},"review_comment":{"href":"https://api.github.com/repos/nunit/nunit/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/nunit/nunit/pulls/843/commits"},"statuses":{"href":"https://api.github.com/repos/nunit/nunit/statuses/ede1530477249989c723183c5700cd34c3ca20fa"}}}}