{"action":"created","comment":{"url":"https://api.github.com/repos/broadinstitute/cromwell/pulls/comments/124398767","pull_request_review_id":46683873,"id":124398767,"diff_hunk":"@@ -0,0 +1,142 @@\n+package cromwell.webservice\n+\n+import akka.util.ByteString\n+import cromwell.core.{WorkflowOptions, WorkflowOptionsJson, WorkflowSourceFilesCollection}\n+import wdl4s.{WdlJson, WdlSource}\n+import cats.data.Validated.{Invalid, Valid}\n+import cats.syntax.validated._\n+import cats.syntax.cartesian._\n+import lenthall.validation.ErrorOr.ErrorOr\n+import cromwell.core._\n+import org.slf4j.LoggerFactory\n+import spray.json.{JsObject, JsValue}\n+\n+import scala.util.Try\n+\n+final case class PartialWorkflowSources(workflowSource: Option[WdlSource],\n+                                        workflowType: Option[WorkflowType],\n+                                        workflowTypeVersion: Option[WorkflowTypeVersion],\n+                                        workflowInputs: Vector[WdlJson],\n+                                        workflowInputsAux: Map[Int, WdlJson],\n+                                        workflowOptions: Option[WorkflowOptionsJson],\n+                                        customLabels: Option[WdlJson],\n+                                        zippedImports: Option[Array[Byte]])\n+\n+object PartialWorkflowSources {\n+  val log = LoggerFactory.getLogger(classOf[PartialWorkflowSources])\n+\n+  def empty = PartialWorkflowSources(\n+    workflowSource = None,\n+    // TODO do not hardcode, especially not out here at the boundary layer good gravy\n+    workflowType = Option(\"WDL\"),\n+    workflowTypeVersion = None,\n+    workflowInputs = Vector.empty,\n+    workflowInputsAux = Map.empty,\n+    workflowOptions = None,\n+    customLabels = None,\n+    zippedImports = None\n+  )\n+\n+  def fromSubmitRoute(formData: Map[String, ByteString], allowNoInputs: Boolean): Try[Seq[WorkflowSourceFilesCollection]] = {\n+    val partialSources = Try(formData.foldLeft(PartialWorkflowSources.empty) { (partialSources: PartialWorkflowSources, kv: (String, ByteString)) =>\n+      val name = kv._1\n+      val data = kv._2\n+\n+      if (name == \"wdlSource\" || name == \"workflowSource\") {\n+        if (name == \"wdlSource\") deprecationWarning(out = \"wdlSource\", in = \"workflowSource\")\n+        partialSources.copy(workflowSource = Option(data.utf8String))\n+      } else if (name == \"workflowType\") {\n+        partialSources.copy(workflowType = Option(data.utf8String))\n+      } else if (name == \"workflowTypeVersion\") {\n+        partialSources.copy(workflowTypeVersion = Option(data.utf8String))\n+      } else if (name == \"workflowInputs\") {\n+        partialSources.copy(workflowInputs = workflowInputs(data.utf8String))\n+      } else if (name.startsWith(\"workflowInputs_\")) {\n+        val index = name.stripPrefix(\"workflowInputs_\").toInt\n+        partialSources.copy(workflowInputsAux = partialSources.workflowInputsAux + (index -> data.utf8String))\n+      } else if (name == \"workflowOptions\") {\n+        partialSources.copy(workflowOptions = Option(data.utf8String))\n+      } else if (name == \"wdlDependencies\" || name == \"workflowDependencies\") {\n+        if (name == \"wdlDependencies\") deprecationWarning(out = \"wdlDependencies\", in = \"workflowDependencies\")\n+        partialSources.copy(zippedImports = Option(data.toArray))\n+      } else if (name == \"customLabels\") {\n+        partialSources.copy(customLabels = Option(data.utf8String))\n+      } else {\n+        throw new IllegalArgumentException(s\"Unexpected body part name: $name\")\n+      }\n+    })\n+\n+    partialSourcesToSourceCollections(partialSources.tryToErrorOr, allowNoInputs).errorOrToTry\n+  }\n+\n+  private def workflowInputs(data: String): Vector[WdlJson] = {\n+    import spray.json._\n+    data.parseJson match {\n+      case JsArray(Seq(x, xs@_*)) => (Vector(x) ++ xs).map(_.compactPrint)\n+      case JsArray(_) => Vector.empty\n+      case v: JsValue => Vector(v.compactPrint)\n+    }\n+  }\n+\n+  private def partialSourcesToSourceCollections(partialSources: ErrorOr[PartialWorkflowSources], allowNoInputs: Boolean): ErrorOr[Seq[WorkflowSourceFilesCollection]] = {\n+    def validateInputs(pws: PartialWorkflowSources): ErrorOr[Seq[WdlJson]] =\n+      (pws.workflowInputs.isEmpty, allowNoInputs) match {\n+        case (true, true) => Vector(\"{}\").validNel\n+        case (true, false) => \"No inputs were provided\".invalidNel\n+        case _ =>\n+          val sortedInputAuxes = pws.workflowInputsAux.toSeq.sortBy { case (index, _) => index } map { case(_, inputJson) => Option(inputJson) }\n+          (pws.workflowInputs map { workflowInputSet: WdlJson => mergeMaps(Seq(Option(workflowInputSet)) ++ sortedInputAuxes).toString }).validNel\n+      }\n+\n+    def validateOptions(options: Option[WorkflowOptionsJson]): ErrorOr[WorkflowOptions] =\n+      WorkflowOptions.fromJsonString(options.getOrElse(\"{}\")).tryToErrorOr leftMap { _ map { i => s\"Invalid workflow options provided: $i\" } }\n+\n+    def validateWorkflowSource(partialSource: PartialWorkflowSources): ErrorOr[WdlJson] = partialSource.workflowSource match {\n+      case Some(src) => src.validNel\n+      case _ => s\"Incomplete workflow submission: $partialSource\".invalidNel\n+    }\n+\n+    partialSources match {\n+      case Valid(partialSource) =>\n+        (validateWorkflowSource(partialSource) |@| validateInputs(partialSource) |@| validateOptions(partialSource.workflowOptions)) map {\n+          case (wfSource, wfInputs, wfOptions) =>\n+            wfInputs.map(inputsJson => WorkflowSourceFilesCollection(\n+              workflowSource = wfSource,\n+              workflowType = partialSource.workflowType,\n+              workflowTypeVersion = partialSource.workflowTypeVersion,\n+              inputsJson = inputsJson,\n+              workflowOptionsJson = wfOptions.asPrettyJson,\n+              labelsJson = partialSource.customLabels.getOrElse(\"{}\"),\n+              importsFile = partialSource.zippedImports))        }\n+      case Invalid(err) => err.invalid\n+    }\n+  }\n+\n+  private def deprecationWarning(out: String, in: String): Unit = {\n+    val warning =\n+      s\"\"\"\n+         |The '$out' parameter name has been deprecated in favor of '$in'.\n+         |Support for '$out' will be removed from future versions of Cromwell.\n+         |Please switch to using '$in' in future submissions.\n+         \"\"\".stripMargin\n+    log.warn(warning)\n+  }\n+\n+  def mergeMaps(allInputs: Seq[Option[String]]): JsObject = {\n+    val convertToMap = allInputs.map(x => toMap(x))\n+    JsObject(convertToMap reduce (_ ++ _))\n+  }\n+\n+  private def toMap(someInput: Option[String]): Map[String, JsValue] = {\n+    import spray.json._\n+    someInput match {\n+      case Some(inputs: String) => inputs.parseJson match {\n+        case JsObject(inputMap) => inputMap\n+        case _ =>\n+          throw new RuntimeException(s\"Submitted inputs couldn't be processed, please check for syntactical errors\")","path":"engine/src/main/scala/cromwell/webservice/PartialWorkflowSources.scala","position":136,"original_position":136,"commit_id":"238913bc88d25a992b41f5d98d85b6861e933c71","original_commit_id":"238913bc88d25a992b41f5d98d85b6861e933c71","user":{"login":"cjllanwarne","id":13006282,"avatar_url":"https://avatars2.githubusercontent.com/u/13006282?v=3","gravatar_id":"","url":"https://api.github.com/users/cjllanwarne","html_url":"https://github.com/cjllanwarne","followers_url":"https://api.github.com/users/cjllanwarne/followers","following_url":"https://api.github.com/users/cjllanwarne/following{/other_user}","gists_url":"https://api.github.com/users/cjllanwarne/gists{/gist_id}","starred_url":"https://api.github.com/users/cjllanwarne/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cjllanwarne/subscriptions","organizations_url":"https://api.github.com/users/cjllanwarne/orgs","repos_url":"https://api.github.com/users/cjllanwarne/repos","events_url":"https://api.github.com/users/cjllanwarne/events{/privacy}","received_events_url":"https://api.github.com/users/cjllanwarne/received_events","type":"User","site_admin":false},"body":"IIRC if anything in the Route processing throws, it causes a pretty generic 500 response from spray","created_at":"2017-06-27T21:19:17Z","updated_at":"2017-06-27T21:19:17Z","html_url":"https://github.com/broadinstitute/cromwell/pull/2380#discussion_r124398767","pull_request_url":"https://api.github.com/repos/broadinstitute/cromwell/pulls/2380","_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/cromwell/pulls/comments/124398767"},"html":{"href":"https://github.com/broadinstitute/cromwell/pull/2380#discussion_r124398767"},"pull_request":{"href":"https://api.github.com/repos/broadinstitute/cromwell/pulls/2380"}}},"pull_request":{"url":"https://api.github.com/repos/broadinstitute/cromwell/pulls/2380","id":127551566,"html_url":"https://github.com/broadinstitute/cromwell/pull/2380","diff_url":"https://github.com/broadinstitute/cromwell/pull/2380.diff","patch_url":"https://github.com/broadinstitute/cromwell/pull/2380.patch","issue_url":"https://api.github.com/repos/broadinstitute/cromwell/issues/2380","number":2380,"state":"open","locked":false,"title":"See, gulls! Akka Http","user":{"login":"geoffjentry","id":961771,"avatar_url":"https://avatars0.githubusercontent.com/u/961771?v=3","gravatar_id":"","url":"https://api.github.com/users/geoffjentry","html_url":"https://github.com/geoffjentry","followers_url":"https://api.github.com/users/geoffjentry/followers","following_url":"https://api.github.com/users/geoffjentry/following{/other_user}","gists_url":"https://api.github.com/users/geoffjentry/gists{/gist_id}","starred_url":"https://api.github.com/users/geoffjentry/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/geoffjentry/subscriptions","organizations_url":"https://api.github.com/users/geoffjentry/orgs","repos_url":"https://api.github.com/users/geoffjentry/repos","events_url":"https://api.github.com/users/geoffjentry/events{/privacy}","received_events_url":"https://api.github.com/users/geoffjentry/received_events","type":"User","site_admin":false},"body":"Please read disclaimers before reviewing\r\n\r\nI still need to integrate Ruchi's incoming changes but wanted to try to get some of this out of the way:\r\n![042317_seagulls_surround_woman_med_gcsmab5j](https://user-images.githubusercontent.com/961771/27557526-eaf58128-5a87-11e7-9d8d-b0f57ec632df.gif)\r\n\r\n- My intention is to rename AkkaHttpService to CromwellApiService to make the diff less horrible, but it's a lot easier for me to do the mental rebasing for incoming changes this way. Will wait until I've got Ruchi's stuff\r\n- Despite what it might seem, I tried to leave as much as possible the way I found it. I've got a big list of followup issues to file - both pre-existing conditions (provided we get this in before the ACA gets passed) and some things which are now hokier than I'd like due to the changes but would cause some serious spidering going on\r\n- I did move some stuff around, e.g. PartialWorkflowSources, so many things look by diff to be changed a lot more than they really were\r\n- The work for this has been spread across the better part of a year, often with long pauses in between. I did my best to spot inconsistencies and such but I'm sure they're still out there","created_at":"2017-06-26T20:03:38Z","updated_at":"2017-06-27T21:19:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0784a8b54d04b98617d5db2efadf8a4de9cb4c79","assignee":{"login":"mcovarr","id":10790523,"avatar_url":"https://avatars2.githubusercontent.com/u/10790523?v=3","gravatar_id":"","url":"https://api.github.com/users/mcovarr","html_url":"https://github.com/mcovarr","followers_url":"https://api.github.com/users/mcovarr/followers","following_url":"https://api.github.com/users/mcovarr/following{/other_user}","gists_url":"https://api.github.com/users/mcovarr/gists{/gist_id}","starred_url":"https://api.github.com/users/mcovarr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mcovarr/subscriptions","organizations_url":"https://api.github.com/users/mcovarr/orgs","repos_url":"https://api.github.com/users/mcovarr/repos","events_url":"https://api.github.com/users/mcovarr/events{/privacy}","received_events_url":"https://api.github.com/users/mcovarr/received_events","type":"User","site_admin":false},"assignees":[{"login":"mcovarr","id":10790523,"avatar_url":"https://avatars2.githubusercontent.com/u/10790523?v=3","gravatar_id":"","url":"https://api.github.com/users/mcovarr","html_url":"https://github.com/mcovarr","followers_url":"https://api.github.com/users/mcovarr/followers","following_url":"https://api.github.com/users/mcovarr/following{/other_user}","gists_url":"https://api.github.com/users/mcovarr/gists{/gist_id}","starred_url":"https://api.github.com/users/mcovarr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mcovarr/subscriptions","organizations_url":"https://api.github.com/users/mcovarr/orgs","repos_url":"https://api.github.com/users/mcovarr/repos","events_url":"https://api.github.com/users/mcovarr/events{/privacy}","received_events_url":"https://api.github.com/users/mcovarr/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/broadinstitute/cromwell/pulls/2380/commits","review_comments_url":"https://api.github.com/repos/broadinstitute/cromwell/pulls/2380/comments","review_comment_url":"https://api.github.com/repos/broadinstitute/cromwell/pulls/comments{/number}","comments_url":"https://api.github.com/repos/broadinstitute/cromwell/issues/2380/comments","statuses_url":"https://api.github.com/repos/broadinstitute/cromwell/statuses/238913bc88d25a992b41f5d98d85b6861e933c71","head":{"label":"broadinstitute:jg_akka_http","ref":"jg_akka_http","sha":"238913bc88d25a992b41f5d98d85b6861e933c71","user":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars3.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"repo":{"id":34136406,"name":"cromwell","full_name":"broadinstitute/cromwell","owner":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars3.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/broadinstitute/cromwell","description":"Workflow Execution Engine using WDL","fork":false,"url":"https://api.github.com/repos/broadinstitute/cromwell","forks_url":"https://api.github.com/repos/broadinstitute/cromwell/forks","keys_url":"https://api.github.com/repos/broadinstitute/cromwell/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/cromwell/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/cromwell/teams","hooks_url":"https://api.github.com/repos/broadinstitute/cromwell/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/cromwell/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/cromwell/events","assignees_url":"https://api.github.com/repos/broadinstitute/cromwell/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/cromwell/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/cromwell/tags","blobs_url":"https://api.github.com/repos/broadinstitute/cromwell/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/cromwell/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/cromwell/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/cromwell/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/cromwell/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/cromwell/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/cromwell/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/cromwell/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/cromwell/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/cromwell/subscription","commits_url":"https://api.github.com/repos/broadinstitute/cromwell/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/cromwell/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/cromwell/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/cromwell/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/cromwell/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/cromwell/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/cromwell/merges","archive_url":"https://api.github.com/repos/broadinstitute/cromwell/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/cromwell/downloads","issues_url":"https://api.github.com/repos/broadinstitute/cromwell/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/cromwell/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/cromwell/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/cromwell/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/cromwell/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/cromwell/releases{/id}","deployments_url":"https://api.github.com/repos/broadinstitute/cromwell/deployments","created_at":"2015-04-17T19:39:36Z","updated_at":"2017-06-26T15:14:47Z","pushed_at":"2017-06-27T20:37:32Z","git_url":"git://github.com/broadinstitute/cromwell.git","ssh_url":"git@github.com:broadinstitute/cromwell.git","clone_url":"https://github.com/broadinstitute/cromwell.git","svn_url":"https://github.com/broadinstitute/cromwell","homepage":"","size":9063,"stargazers_count":144,"watchers_count":144,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":35,"mirror_url":null,"open_issues_count":278,"forks":35,"open_issues":278,"watchers":144,"default_branch":"develop"}},"base":{"label":"broadinstitute:develop","ref":"develop","sha":"966063323dd0a3cc49179d5f8ba17bc61dd85cbf","user":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars3.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"repo":{"id":34136406,"name":"cromwell","full_name":"broadinstitute/cromwell","owner":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars3.githubusercontent.com/u/393552?v=3","gravatar_id":"","url":"https://api.github.com/users/broadinstitute","html_url":"https://github.com/broadinstitute","followers_url":"https://api.github.com/users/broadinstitute/followers","following_url":"https://api.github.com/users/broadinstitute/following{/other_user}","gists_url":"https://api.github.com/users/broadinstitute/gists{/gist_id}","starred_url":"https://api.github.com/users/broadinstitute/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/broadinstitute/subscriptions","organizations_url":"https://api.github.com/users/broadinstitute/orgs","repos_url":"https://api.github.com/users/broadinstitute/repos","events_url":"https://api.github.com/users/broadinstitute/events{/privacy}","received_events_url":"https://api.github.com/users/broadinstitute/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/broadinstitute/cromwell","description":"Workflow Execution Engine using WDL","fork":false,"url":"https://api.github.com/repos/broadinstitute/cromwell","forks_url":"https://api.github.com/repos/broadinstitute/cromwell/forks","keys_url":"https://api.github.com/repos/broadinstitute/cromwell/keys{/key_id}","collaborators_url":"https://api.github.com/repos/broadinstitute/cromwell/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/broadinstitute/cromwell/teams","hooks_url":"https://api.github.com/repos/broadinstitute/cromwell/hooks","issue_events_url":"https://api.github.com/repos/broadinstitute/cromwell/issues/events{/number}","events_url":"https://api.github.com/repos/broadinstitute/cromwell/events","assignees_url":"https://api.github.com/repos/broadinstitute/cromwell/assignees{/user}","branches_url":"https://api.github.com/repos/broadinstitute/cromwell/branches{/branch}","tags_url":"https://api.github.com/repos/broadinstitute/cromwell/tags","blobs_url":"https://api.github.com/repos/broadinstitute/cromwell/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/broadinstitute/cromwell/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/broadinstitute/cromwell/git/refs{/sha}","trees_url":"https://api.github.com/repos/broadinstitute/cromwell/git/trees{/sha}","statuses_url":"https://api.github.com/repos/broadinstitute/cromwell/statuses/{sha}","languages_url":"https://api.github.com/repos/broadinstitute/cromwell/languages","stargazers_url":"https://api.github.com/repos/broadinstitute/cromwell/stargazers","contributors_url":"https://api.github.com/repos/broadinstitute/cromwell/contributors","subscribers_url":"https://api.github.com/repos/broadinstitute/cromwell/subscribers","subscription_url":"https://api.github.com/repos/broadinstitute/cromwell/subscription","commits_url":"https://api.github.com/repos/broadinstitute/cromwell/commits{/sha}","git_commits_url":"https://api.github.com/repos/broadinstitute/cromwell/git/commits{/sha}","comments_url":"https://api.github.com/repos/broadinstitute/cromwell/comments{/number}","issue_comment_url":"https://api.github.com/repos/broadinstitute/cromwell/issues/comments{/number}","contents_url":"https://api.github.com/repos/broadinstitute/cromwell/contents/{+path}","compare_url":"https://api.github.com/repos/broadinstitute/cromwell/compare/{base}...{head}","merges_url":"https://api.github.com/repos/broadinstitute/cromwell/merges","archive_url":"https://api.github.com/repos/broadinstitute/cromwell/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/broadinstitute/cromwell/downloads","issues_url":"https://api.github.com/repos/broadinstitute/cromwell/issues{/number}","pulls_url":"https://api.github.com/repos/broadinstitute/cromwell/pulls{/number}","milestones_url":"https://api.github.com/repos/broadinstitute/cromwell/milestones{/number}","notifications_url":"https://api.github.com/repos/broadinstitute/cromwell/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/broadinstitute/cromwell/labels{/name}","releases_url":"https://api.github.com/repos/broadinstitute/cromwell/releases{/id}","deployments_url":"https://api.github.com/repos/broadinstitute/cromwell/deployments","created_at":"2015-04-17T19:39:36Z","updated_at":"2017-06-26T15:14:47Z","pushed_at":"2017-06-27T20:37:32Z","git_url":"git://github.com/broadinstitute/cromwell.git","ssh_url":"git@github.com:broadinstitute/cromwell.git","clone_url":"https://github.com/broadinstitute/cromwell.git","svn_url":"https://github.com/broadinstitute/cromwell","homepage":"","size":9063,"stargazers_count":144,"watchers_count":144,"language":"Scala","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":35,"mirror_url":null,"open_issues_count":278,"forks":35,"open_issues":278,"watchers":144,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/cromwell/pulls/2380"},"html":{"href":"https://github.com/broadinstitute/cromwell/pull/2380"},"issue":{"href":"https://api.github.com/repos/broadinstitute/cromwell/issues/2380"},"comments":{"href":"https://api.github.com/repos/broadinstitute/cromwell/issues/2380/comments"},"review_comments":{"href":"https://api.github.com/repos/broadinstitute/cromwell/pulls/2380/comments"},"review_comment":{"href":"https://api.github.com/repos/broadinstitute/cromwell/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/broadinstitute/cromwell/pulls/2380/commits"},"statuses":{"href":"https://api.github.com/repos/broadinstitute/cromwell/statuses/238913bc88d25a992b41f5d98d85b6861e933c71"}}}}
{"actor":{"display_login":"cjllanwarne"}}