{"action":"created","comment":{"url":"https://api.github.com/repos/broadinstitute/cromwell/pulls/comments/48084207","id":48084207,"diff_hunk":"@@ -0,0 +1,205 @@\n+package cromwell.engine\n+\n+import java.nio.file.{Path, Paths}\n+\n+import ch.qos.logback.classic.encoder.PatternLayoutEncoder\n+import ch.qos.logback.classic.spi.ILoggingEvent\n+import ch.qos.logback.classic.{Level, LoggerContext}\n+import ch.qos.logback.core.FileAppender\n+import com.typesafe.config.{Config, ConfigFactory}\n+import cromwell.binding._\n+import cromwell.engine.backend.Backend\n+import cromwell.engine.workflow.WorkflowOptions\n+import cromwell.server.CromwellServer\n+import lenthall.config.ScalaConfig._\n+import org.slf4j.helpers.NOPLogger\n+import org.slf4j.{Logger, LoggerFactory}\n+import spray.json.{JsObject, _}\n+\n+import scala.util.{Failure, Success, Try}\n+import scalaz.Scalaz._\n+\n+case class WorkflowDescriptor(id: WorkflowId,\n+                              sourceFiles: WorkflowSourceFiles,\n+                              workflowOptions: WorkflowOptions,\n+                              rawInputs: Map[String, JsValue],\n+                              namespace: NamespaceWithWorkflow,\n+                              coercedInputs: WorkflowCoercedInputs,\n+                              declarations: WorkflowCoercedInputs,\n+                              backend: Backend,\n+                              configCallCaching: Boolean,\n+                              lookupDockerHash: Boolean) {\n+  import WorkflowDescriptor._\n+\n+  val shortId = id.toString.split(\"-\")(0)\n+  val ioInterface = backend.ioInterface(workflowOptions)\n+  val name = namespace.workflow.unqualifiedName\n+  val actualInputs: WorkflowCoercedInputs = coercedInputs ++ declarations\n+  val props = sys.props\n+\n+  private lazy val optionCacheWriting = workflowOptions.getBoolean(\"write_to_cache\") getOrElse configCallCaching\n+  private lazy val optionCacheReading = workflowOptions.getBoolean(\"read_from_cache\") getOrElse configCallCaching\n+\n+  if (!configCallCaching) {\n+    if (optionCacheWriting) logWriteDisabled()\n+    if (optionCacheReading) logReadDisabled()\n+  }\n+\n+  lazy val writeToCache = configCallCaching && optionCacheWriting\n+  lazy val readFromCache = configCallCaching && optionCacheReading\n+\n+  lazy val workflowLogger = props.get(\"LOG_MODE\") match {\n+    case Some(x) if x.toUpperCase.contains(\"SERVER\") => makeFileLogger(\n+      Paths.get(props.getOrElse(\"LOG_ROOT\", \".\")),\n+      s\"workflow.$id.log\",\n+      Level.toLevel(props.getOrElse(\"LOG_LEVEL\", \"debug\"))\n+    )\n+    case _ => NOPLogger.NOP_LOGGER\n+  }\n+\n+\n+\n+  private def makeFileLogger(root: Path, name: String, level: Level): Logger = {\n+    val ctx = LoggerFactory.getILoggerFactory.asInstanceOf[LoggerContext]\n+    val encoder = new PatternLayoutEncoder()\n+    encoder.setPattern(\"%date %-5level - %msg%n\")\n+    encoder.setContext(ctx)\n+    encoder.start()\n+\n+    val path = root.resolve(name).toAbsolutePath.toString\n+    val appender = new FileAppender[ILoggingEvent]()\n+    appender.setFile(path)\n+    appender.setEncoder(encoder)\n+    appender.setName(name)\n+    appender.setContext(ctx)\n+    appender.start()\n+\n+    val fileLogger = ctx.getLogger(name)\n+    fileLogger.addAppender(appender)\n+    fileLogger.setAdditive(false)\n+    fileLogger.setLevel(level)\n+    fileLogger\n+  }\n+\n+  private def logWriteDisabled() = workflowLogger.warn(writeDisabled)\n+  private def logReadDisabled() = workflowLogger.warn(readDisabled)\n+}\n+\n+object WorkflowDescriptor {\n+  def apply(id: WorkflowId, sourceFiles: WorkflowSourceFiles): WorkflowDescriptor = {\n+    WorkflowDescriptor(id, sourceFiles, ConfigFactory.load)\n+  }\n+\n+  def apply(id: WorkflowId, sourceFiles: WorkflowSourceFiles, conf: Config): WorkflowDescriptor = {\n+    validateWorkflowDescriptor(id, sourceFiles, CromwellServer.backend, conf) match {\n+      case scalaz.Success(w) => w\n+      case scalaz.Failure(f) => throw new IllegalArgumentException(s\"\"\"\\n${f.list.mkString(\"\\n\")}\"\"\")\n+    }\n+  }\n+\n+  private def validateWorkflowDescriptor(id: WorkflowId,\n+                                         sourceFiles: WorkflowSourceFiles,\n+                                         backend: Backend,\n+                                         conf: Config): ErrorOr[WorkflowDescriptor] = {\n+    val namespace = validateNamespace(sourceFiles.wdlSource, backend)\n+    val rawInputs = validateRawInputs(id, sourceFiles.inputsJson)\n+    val options = validateWorkflowOptions(id, sourceFiles.workflowOptionsJson, backend)\n+    (namespace |@| rawInputs |@| options) { (_, _, _) } match {\n+      case scalaz.Success((n, r, o)) =>\n+        val validatedDescriptor = for {\n+          c <- validateCoercedInputs(id, r, n).disjunction\n+          d <- validateDeclarations(id, n, o, c, backend).disjunction\n+        } yield WorkflowDescriptor(id, sourceFiles, o, r, n, c, d, backend, configCallCaching(conf), lookupDockerHash(conf))\n+        validatedDescriptor.validation\n+      case scalaz.Failure(f) => f.list.mkString(\"\").failureNel\n+    }\n+  }\n+\n+  private def validateNamespace(source: WdlSource, backend: Backend): ErrorOr[NamespaceWithWorkflow] = {\n+    try {\n+      NamespaceWithWorkflow.load(source, backend.backendType).successNel\n+    } catch {\n+      case e: Exception => s\"Workflow ${id.toString} unable to load namespace: ${e.getLocalizedMessage}\".failureNel\n+    }\n+  }\n+\n+  private def validateWorkflowOptions(id: WorkflowId,\n+                                      optionsJson: WorkflowOptionsJson,\n+                                      backend: Backend): ErrorOr[WorkflowOptions] = {\n+    WorkflowOptions.fromJsonString(optionsJson) match {\n+      case Success(o) => buildValidateOptions(o, id, backend)\n+      case Failure(e) => s\"Workflow ${id.toString} contains bad options JSON: ${e.getLocalizedMessage}\".failureNel\n+    }\n+  }\n+\n+  private def buildValidateOptions(options: WorkflowOptions, id: WorkflowId, backend: Backend): ErrorOr[WorkflowOptions] = {\n+    val validatedOptions = options.successNel[String]\n+    val backendOptionsDisjunction = for {\n+      o <- validatedOptions.disjunction\n+      b <- validateBackendOptions(id, o, backend).disjunction\n+    } yield b\n+    val backendOptions = backendOptionsDisjunction.validation\n+    (validatedOptions |@| backendOptions) { (options, b) => options }\n+  }\n+\n+  private def validateRawInputs(id: WorkflowId, json: WdlJson): ErrorOr[Map[String, JsValue]] = {\n+    Try(json.parseJson) match {\n+      case Success(JsObject(inputs)) => inputs.successNel\n+      case _ => s\"Workflow ${id.toString} contains bad inputs JSON: $json\".failureNel\n+    }\n+  }\n+\n+  private def validateCoercedInputs(id: WorkflowId,\n+                                    rawInputs: Map[String, JsValue],\n+                                    namespace: NamespaceWithWorkflow): ErrorOr[WorkflowCoercedInputs] = {\n+    namespace.coerceRawInputs(rawInputs) match {\n+      case Success(r) => r.successNel\n+      case Failure(e) => e.getLocalizedMessage.failureNel","path":"src/main/scala/cromwell/engine/WorkflowDescriptor.scala","position":157,"original_position":157,"commit_id":"26b07ac95ba18e409aef20692b50cda0dd7cc5f2","original_commit_id":"26b07ac95ba18e409aef20692b50cda0dd7cc5f2","user":{"login":"geoffjentry","id":961771,"avatar_url":"https://avatars.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":"I honestly don't know why I used that, and it's throughout. Either something I started from here used it or something I cribbed off of at some point used it. \r\n\r\nI don't see the need to use it anywhere, do you?","created_at":"2015-12-19T00:27:07Z","updated_at":"2015-12-19T00:27:07Z","html_url":"https://github.com/broadinstitute/cromwell/pull/337#discussion_r48084207","pull_request_url":"https://api.github.com/repos/broadinstitute/cromwell/pulls/337","_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/cromwell/pulls/comments/48084207"},"html":{"href":"https://github.com/broadinstitute/cromwell/pull/337#discussion_r48084207"},"pull_request":{"href":"https://api.github.com/repos/broadinstitute/cromwell/pulls/337"}}},"pull_request":{"url":"https://api.github.com/repos/broadinstitute/cromwell/pulls/337","id":54159037,"html_url":"https://github.com/broadinstitute/cromwell/pull/337","diff_url":"https://github.com/broadinstitute/cromwell/pull/337.diff","patch_url":"https://github.com/broadinstitute/cromwell/pull/337.patch","issue_url":"https://api.github.com/repos/broadinstitute/cromwell/issues/337","number":337,"state":"open","locked":false,"title":"Streamline the validation of inputs during submission to a single place","user":{"login":"geoffjentry","id":961771,"avatar_url":"https://avatars.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":"","created_at":"2015-12-18T22:51:22Z","updated_at":"2015-12-19T00:27:07Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ab6fdf323563f5cf2859af6386773e6718961896","assignee":{"login":"kshakir","id":791985,"avatar_url":"https://avatars.githubusercontent.com/u/791985?v=3","gravatar_id":"","url":"https://api.github.com/users/kshakir","html_url":"https://github.com/kshakir","followers_url":"https://api.github.com/users/kshakir/followers","following_url":"https://api.github.com/users/kshakir/following{/other_user}","gists_url":"https://api.github.com/users/kshakir/gists{/gist_id}","starred_url":"https://api.github.com/users/kshakir/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kshakir/subscriptions","organizations_url":"https://api.github.com/users/kshakir/orgs","repos_url":"https://api.github.com/users/kshakir/repos","events_url":"https://api.github.com/users/kshakir/events{/privacy}","received_events_url":"https://api.github.com/users/kshakir/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/broadinstitute/cromwell/pulls/337/commits","review_comments_url":"https://api.github.com/repos/broadinstitute/cromwell/pulls/337/comments","review_comment_url":"https://api.github.com/repos/broadinstitute/cromwell/pulls/comments{/number}","comments_url":"https://api.github.com/repos/broadinstitute/cromwell/issues/337/comments","statuses_url":"https://api.github.com/repos/broadinstitute/cromwell/statuses/26b07ac95ba18e409aef20692b50cda0dd7cc5f2","head":{"label":"broadinstitute:jg_validate_once_and_only_once","ref":"jg_validate_once_and_only_once","sha":"26b07ac95ba18e409aef20692b50cda0dd7cc5f2","user":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars.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://avatars.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}","created_at":"2015-04-17T19:39:36Z","updated_at":"2015-12-07T14:28:37Z","pushed_at":"2015-12-18T22:54:48Z","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":4394,"stargazers_count":11,"watchers_count":11,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3,"mirror_url":null,"open_issues_count":6,"forks":3,"open_issues":6,"watchers":11,"default_branch":"develop"}},"base":{"label":"broadinstitute:develop","ref":"develop","sha":"6b61833d088f224eda347617c8f251a182ac5175","user":{"login":"broadinstitute","id":393552,"avatar_url":"https://avatars.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://avatars.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}","created_at":"2015-04-17T19:39:36Z","updated_at":"2015-12-07T14:28:37Z","pushed_at":"2015-12-18T22:54:48Z","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":4394,"stargazers_count":11,"watchers_count":11,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":3,"mirror_url":null,"open_issues_count":6,"forks":3,"open_issues":6,"watchers":11,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/broadinstitute/cromwell/pulls/337"},"html":{"href":"https://github.com/broadinstitute/cromwell/pull/337"},"issue":{"href":"https://api.github.com/repos/broadinstitute/cromwell/issues/337"},"comments":{"href":"https://api.github.com/repos/broadinstitute/cromwell/issues/337/comments"},"review_comments":{"href":"https://api.github.com/repos/broadinstitute/cromwell/pulls/337/comments"},"review_comment":{"href":"https://api.github.com/repos/broadinstitute/cromwell/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/broadinstitute/cromwell/pulls/337/commits"},"statuses":{"href":"https://api.github.com/repos/broadinstitute/cromwell/statuses/26b07ac95ba18e409aef20692b50cda0dd7cc5f2"}}}}