{"action":"created","comment":{"url":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls/comments/82119602","pull_request_review_id":3047855,"id":82119602,"diff_hunk":"@@ -0,0 +1,280 @@\n+package eventstore\n+\n+import akka.NotUsed\n+import akka.actor.ActorSystem\n+import akka.http.scaladsl.Http\n+import akka.http.scaladsl.model._\n+import akka.http.scaladsl.model.headers.{ Authorization, BasicHttpCredentials }\n+import akka.http.scaladsl.unmarshalling.Unmarshal\n+import akka.stream.Materializer\n+import akka.stream.ThrottleMode.Shaping\n+import akka.stream.scaladsl.{ Flow, Sink, Source }\n+import eventstore.EsProjectionsClient.{ Continuous, OneTime, ProjectionMode, Transient }\n+import play.api.libs.json.Json\n+\n+import scala.concurrent.Future\n+import scala.concurrent.duration._\n+import scala.util.Try\n+\n+/**\n+ * The API miss documentation so I used the C# client as a starting point\n+ * See : https://github.com/EventStore/EventStore/blob/release-v3.9.0/src/EventStore.ClientAPI/Projections/ProjectionsClient.cs\n+ */\n+protected[this] trait EventStoreProjectionsUrls {\n+  def createProjectionUrl(name: String, mode: ProjectionMode = Continuous, allowEmit: Boolean = true): String = {\n+    val emit = if (allowEmit) \"emit=1&checkpoints=yes\" else \"emit=0\"\n+    val projectionModeStr = mode match {\n+      case OneTime    => \"onetime\"\n+      case Transient  => \"transient\"\n+      case Continuous => \"continuous\"\n+    }\n+    s\"/projections/$projectionModeStr?name=$name&type=JS&$emit\"\n+  }\n+\n+  def projectionBaseUrl(name: String): String = s\"/projection/$name\"\n+\n+  def fetchProjectionStateUrl(name: String, partition: Option[String]): String =\n+    s\"${projectionBaseUrl(name)}/state\" + partition.fold(\"\")(partition => s\"?partition=$partition\")\n+\n+  def fetchProjectionResultUrl(name: String, partition: Option[String]): String =\n+    s\"${projectionBaseUrl(name)}/result\" + partition.fold(\"\")(partition => s\"?partition=$partition\")\n+\n+  def projectionCommandUrl(name: String, command: String): String =\n+    s\"${projectionBaseUrl(name)}/command/$command\"\n+}\n+\n+object EsProjectionsClient {\n+  sealed trait ProjectionMode\n+  object Continuous extends ProjectionMode\n+  object OneTime extends ProjectionMode\n+  object Transient extends ProjectionMode\n+\n+  sealed trait ProjectionStatus\n+  object Running extends ProjectionStatus\n+  object Faulted extends ProjectionStatus\n+  object Completed extends ProjectionStatus\n+  object Stopped extends ProjectionStatus\n+  object Absent extends ProjectionStatus\n+  final case class Other(status: String) extends ProjectionStatus\n+\n+  sealed trait ProjectionCreationResult\n+  object ProjectionCreated extends ProjectionCreationResult\n+  object ProjectionAlreadyExist extends ProjectionCreationResult\n+\n+  sealed trait ProjectionDeleteResult\n+  object ProjectionDeleted extends ProjectionDeleteResult\n+  case class UnableToDeleteProjection(reason: String) extends ProjectionDeleteResult\n+\n+}\n+\n+/**\n+ * A client allowing to create, get the status and delete an existing projection.\n+ */\n+class EsProjectionsClient(settings: Settings = Settings.Default, system: ActorSystem)(implicit materializer: Materializer) extends EventStoreProjectionsUrls {\n+\n+  import materializer.executionContext\n+  import EsProjectionsClient._\n+\n+  private val connection: Flow[HttpRequest, Try[HttpResponse], NotUsed] = {\n+    val uri = Uri(settings.http.url)\n+    val httpExt = Http(system)\n+\n+    val connectionPool = if (settings.http.protocol == \"http\") {\n+      httpExt.cachedHostConnectionPool[Unit](uri.authority.host.address(), uri.authority.port)\n+    } else {\n+      httpExt.cachedHostConnectionPoolHttps[Unit](uri.authority.host.address(), uri.authority.port)\n+    }\n+\n+    Flow[HttpRequest]\n+      .map(req => (req, ()))\n+      .via(connectionPool)\n+      .map { case (resp, _) => resp }\n+  }\n+\n+  private val authorization: Option[Authorization] = settings.defaultCredentials.map(credentials => Authorization(BasicHttpCredentials(credentials.login, credentials.password)))\n+\n+  private val defaultHeaders = authorization.toList\n+\n+  /**\n+   * Create the projection with the specified name and code\n+   * @param name the name of the projection to create\n+   * @param javascriptCode the javascript code for the projection\n+   * @param mode the projection's mode (Either OneTime, Continuous or Transient)\n+   * @param allowEmit\n+   * @return\n+   */\n+  def createProjection(name: String, javascriptCode: String, mode: ProjectionMode = Continuous, allowEmit: Boolean = true): Future[ProjectionCreationResult] = {\n+    val request = HttpRequest(\n+      method = HttpMethods.POST,\n+      uri = Uri(createProjectionUrl(name, mode, allowEmit)),\n+      headers = defaultHeaders,\n+      entity = HttpEntity(ContentTypes.`application/json`, javascriptCode))\n+\n+    singleRequestWithErrorHandling(request)\n+      .map {\n+        case response if response.status == StatusCodes.Created => ProjectionCreated\n+        case response if response.status == StatusCodes.Conflict => ProjectionAlreadyExist\n+        case response => throw new ProjectionException(s\"Received unexpected reponse $response\")\n+      }\n+      .runWith(Sink.head)\n+  }\n+\n+  /**\n+   * Fetch the status for the specified projection.\n+   * @param name the name of the projection\n+   * @return Absent if the projection doesn't exist. Otherwise either Running/Completed/Stopped/Faulted or Other.\n+   */\n+  def fetchProjectionStatus(name: String): Future[ProjectionStatus] = {\n+    val request = HttpRequest(\n+      method = HttpMethods.GET,\n+      uri = Uri(projectionBaseUrl(name)),\n+      headers = defaultHeaders)\n+\n+    singleRequestWithErrorHandling(request)\n+      .mapAsync(1) {\n+        case response if response.status == StatusCodes.NotFound => Future.successful(Absent)\n+        case response => Unmarshal(response).to[String].map { rawJson =>\n+          val json = Json.parse(rawJson)\n+          (json \\ \"status\").as[String] match {\n+            case status if status.startsWith(\"Running\")   => Running\n+            case status if status.startsWith(\"Completed\") => Completed\n+            case status if status.startsWith(\"Stopped\")   => Stopped\n+            case status if status.startsWith(\"Faulted\")   => Faulted\n+            case other                                    => Other(other)\n+          }\n+        }\n+      }\n+      .runWith(Sink.head)\n+  }\n+\n+  private[this] def fetchProjectionData(request: HttpRequest): Future[Option[String]] = {\n+    singleRequestWithErrorHandling(request)\n+      .mapAsync(1) {\n+        case response if response.status == StatusCodes.NotFound => Future.successful(None)\n+        case response => Unmarshal(response).to[String].map(Some(_))\n+      }\n+      .runWith(Sink.head)\n+  }\n+\n+  /**\n+   * Fetch the projection's state\n+   * @param name the name of the projection\n+   * @param partition the name of the partition\n+   * @return a String that should be either empty or a valid json object with the current state.\n+   */\n+  def fetchProjectionState(name: String, partition: Option[String] = None): Future[Option[String]] = {\n+    val request = HttpRequest(\n+      method = HttpMethods.GET,\n+      uri = Uri(fetchProjectionStateUrl(name, partition)),\n+      headers = defaultHeaders)\n+\n+    fetchProjectionData(request)\n+  }\n+\n+  /**\n+   * Fetch the projection's result.\n+   * It only works for OneTime projections as Continuous one dont provide a result.\n+   * @param name the name of the projection\n+   * @param partition the name of the partition\n+   * @return a String that should be either empty or a valid json object with the projection's result.\n+   */\n+  def fetchProjectionResult(name: String, partition: Option[String] = None): Future[Option[String]] = {\n+    val request = HttpRequest(\n+      method = HttpMethods.GET,\n+      uri = Uri(fetchProjectionResultUrl(name, partition)),\n+      headers = defaultHeaders)\n+\n+    fetchProjectionData(request)\n+  }\n+\n+  private[this] def executeCommand(name: String, command: String): Future[Unit] = {\n+    val request = HttpRequest(\n+      method = HttpMethods.POST,\n+      uri = Uri(projectionCommandUrl(name, command)),\n+      headers = defaultHeaders,\n+      entity = HttpEntity(ContentTypes.`application/json`, \"{}\"))\n+\n+    singleRequestWithErrorHandling(request)\n+      .map {\n+        case response if response.status == StatusCodes.NotFound => ()\n+        case response if response.status == StatusCodes.OK => ()\n+        case response => throw new ProjectionException(s\"Received unexpected reponse $response\")\n+      }\n+      .runWith(Sink.head)\n+  }\n+\n+  /**\n+   * Blocks for at most #waitDuration for the projection #name to change to the desired status.\n+   * @param name the name of the projection to wait on\n+   * @param expectedStatus the desired status\n+   * @param waitDuration the maximum wait duration\n+   * @return true is the expectedStatus was reached, false otherwise\n+   */\n+  def waitForProjectionStatus(name: String, expectedStatus: ProjectionStatus, waitDuration: FiniteDuration = 10.seconds): Future[Boolean] = {\n+    val retryCount = 10\n+    val retryDelay = waitDuration / retryCount\n+\n+    Source(1 to retryCount)","path":"src/main/scala/eventstore/EsProjectionsClient.scala","position":217,"original_position":217,"commit_id":"40dc230e0d77f28d095d042255fa8526f72e1b6a","original_commit_id":"40dc230e0d77f28d095d042255fa8526f72e1b6a","user":{"login":"t3hnar","id":327341,"avatar_url":"https://avatars.githubusercontent.com/u/327341?v=3","gravatar_id":"","url":"https://api.github.com/users/t3hnar","html_url":"https://github.com/t3hnar","followers_url":"https://api.github.com/users/t3hnar/followers","following_url":"https://api.github.com/users/t3hnar/following{/other_user}","gists_url":"https://api.github.com/users/t3hnar/gists{/gist_id}","starred_url":"https://api.github.com/users/t3hnar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/t3hnar/subscriptions","organizations_url":"https://api.github.com/users/t3hnar/orgs","repos_url":"https://api.github.com/users/t3hnar/repos","events_url":"https://api.github.com/users/t3hnar/events{/privacy}","received_events_url":"https://api.github.com/users/t3hnar/received_events","type":"User","site_admin":false},"body":"overall I find this construction pretty generic, do we really want to have it supported in EventStore ?","created_at":"2016-10-06T05:33:51Z","updated_at":"2016-10-06T05:39:39Z","html_url":"https://github.com/EventStore/EventStore.JVM/pull/65#discussion_r82119602","pull_request_url":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls/65","_links":{"self":{"href":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls/comments/82119602"},"html":{"href":"https://github.com/EventStore/EventStore.JVM/pull/65#discussion_r82119602"},"pull_request":{"href":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls/65"}}},"pull_request":{"url":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls/65","id":85106045,"html_url":"https://github.com/EventStore/EventStore.JVM/pull/65","diff_url":"https://github.com/EventStore/EventStore.JVM/pull/65.diff","patch_url":"https://github.com/EventStore/EventStore.JVM/pull/65.patch","issue_url":"https://api.github.com/repos/EventStore/EventStore.JVM/issues/65","number":65,"state":"open","locked":false,"title":"Create projections client","user":{"login":"fchaillou","id":515348,"avatar_url":"https://avatars.githubusercontent.com/u/515348?v=3","gravatar_id":"","url":"https://api.github.com/users/fchaillou","html_url":"https://github.com/fchaillou","followers_url":"https://api.github.com/users/fchaillou/followers","following_url":"https://api.github.com/users/fchaillou/following{/other_user}","gists_url":"https://api.github.com/users/fchaillou/gists{/gist_id}","starred_url":"https://api.github.com/users/fchaillou/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fchaillou/subscriptions","organizations_url":"https://api.github.com/users/fchaillou/orgs","repos_url":"https://api.github.com/users/fchaillou/repos","events_url":"https://api.github.com/users/fchaillou/events{/privacy}","received_events_url":"https://api.github.com/users/fchaillou/received_events","type":"User","site_admin":false},"body":"Hello,\r\n\r\nFor work, we needed a projection client so i created one and i'm trying here to upstream it.\r\nIt is based on akka http.\r\n\r\nThis is the exposed API :\r\n```\r\nclass ProjectionsClient {\r\ndef createProjection(name: String, javascriptCode: String, mode: ProjectionMode = Continuous, allowEmit: Boolean = true): Future[ProjectionCreationResult]\r\n\r\n  def fetchProjectionStatus(name: String): Future[ProjectionStatus]\r\n\r\n  def fetchProjectionState(name: String, projection: Option[String] = None): Future[Option[JsValue]]\r\n\r\n  def fetchProjectionResult(name: String, projection: Option[String] = None): Future[Option[JsValue]]\r\n\r\n  def waitForProjectionStatus(name: String, expectedState : ProjectionStatus, waitDuration : FiniteDuration = 10 seconds) : Future[Boolean]\r\n\r\ndef startProjection(name: String): Future[Unit]\r\n\r\n  def stopProjection(name: String): Future[Unit]\r\n\r\n  def deleteProjection(name: String): Future[ProjectionDeleteResult]\r\n}\r\n```\r\nHopes it will fit here !\r\nFabien","created_at":"2016-09-13T19:02:33Z","updated_at":"2016-10-06T05:39:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"b8d5bec58bcd09aa9ba8018a56186a0b67e8cb65","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls/65/commits","review_comments_url":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls/65/comments","review_comment_url":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls/comments{/number}","comments_url":"https://api.github.com/repos/EventStore/EventStore.JVM/issues/65/comments","statuses_url":"https://api.github.com/repos/EventStore/EventStore.JVM/statuses/40dc230e0d77f28d095d042255fa8526f72e1b6a","head":{"label":"fchaillou:projections-client","ref":"projections-client","sha":"40dc230e0d77f28d095d042255fa8526f72e1b6a","user":{"login":"fchaillou","id":515348,"avatar_url":"https://avatars.githubusercontent.com/u/515348?v=3","gravatar_id":"","url":"https://api.github.com/users/fchaillou","html_url":"https://github.com/fchaillou","followers_url":"https://api.github.com/users/fchaillou/followers","following_url":"https://api.github.com/users/fchaillou/following{/other_user}","gists_url":"https://api.github.com/users/fchaillou/gists{/gist_id}","starred_url":"https://api.github.com/users/fchaillou/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fchaillou/subscriptions","organizations_url":"https://api.github.com/users/fchaillou/orgs","repos_url":"https://api.github.com/users/fchaillou/repos","events_url":"https://api.github.com/users/fchaillou/events{/privacy}","received_events_url":"https://api.github.com/users/fchaillou/received_events","type":"User","site_admin":false},"repo":{"id":64321794,"name":"EventStore.JVM","full_name":"fchaillou/EventStore.JVM","owner":{"login":"fchaillou","id":515348,"avatar_url":"https://avatars.githubusercontent.com/u/515348?v=3","gravatar_id":"","url":"https://api.github.com/users/fchaillou","html_url":"https://github.com/fchaillou","followers_url":"https://api.github.com/users/fchaillou/followers","following_url":"https://api.github.com/users/fchaillou/following{/other_user}","gists_url":"https://api.github.com/users/fchaillou/gists{/gist_id}","starred_url":"https://api.github.com/users/fchaillou/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fchaillou/subscriptions","organizations_url":"https://api.github.com/users/fchaillou/orgs","repos_url":"https://api.github.com/users/fchaillou/repos","events_url":"https://api.github.com/users/fchaillou/events{/privacy}","received_events_url":"https://api.github.com/users/fchaillou/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/fchaillou/EventStore.JVM","description":"Event Store JVM Client ","fork":true,"url":"https://api.github.com/repos/fchaillou/EventStore.JVM","forks_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/forks","keys_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/keys{/key_id}","collaborators_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/teams","hooks_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/hooks","issue_events_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/issues/events{/number}","events_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/events","assignees_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/assignees{/user}","branches_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/branches{/branch}","tags_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/tags","blobs_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/git/refs{/sha}","trees_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/git/trees{/sha}","statuses_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/statuses/{sha}","languages_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/languages","stargazers_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/stargazers","contributors_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/contributors","subscribers_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/subscribers","subscription_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/subscription","commits_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/commits{/sha}","git_commits_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/git/commits{/sha}","comments_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/comments{/number}","issue_comment_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/issues/comments{/number}","contents_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/contents/{+path}","compare_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/compare/{base}...{head}","merges_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/merges","archive_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/downloads","issues_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/issues{/number}","pulls_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/pulls{/number}","milestones_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/milestones{/number}","notifications_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/labels{/name}","releases_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/releases{/id}","deployments_url":"https://api.github.com/repos/fchaillou/EventStore.JVM/deployments","created_at":"2016-07-27T15:51:44Z","updated_at":"2016-07-27T15:51:45Z","pushed_at":"2016-10-05T15:36:22Z","git_url":"git://github.com/fchaillou/EventStore.JVM.git","ssh_url":"git@github.com:fchaillou/EventStore.JVM.git","clone_url":"https://github.com/fchaillou/EventStore.JVM.git","svn_url":"https://github.com/fchaillou/EventStore.JVM","homepage":"https://geteventstore.com","size":1116,"stargazers_count":0,"watchers_count":0,"language":"Scala","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":"EventStore:master","ref":"master","sha":"93a60b4f6d4353b3c726bb54f1d9d0ba9ba79af3","user":{"login":"EventStore","id":1628864,"avatar_url":"https://avatars.githubusercontent.com/u/1628864?v=3","gravatar_id":"","url":"https://api.github.com/users/EventStore","html_url":"https://github.com/EventStore","followers_url":"https://api.github.com/users/EventStore/followers","following_url":"https://api.github.com/users/EventStore/following{/other_user}","gists_url":"https://api.github.com/users/EventStore/gists{/gist_id}","starred_url":"https://api.github.com/users/EventStore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EventStore/subscriptions","organizations_url":"https://api.github.com/users/EventStore/orgs","repos_url":"https://api.github.com/users/EventStore/repos","events_url":"https://api.github.com/users/EventStore/events{/privacy}","received_events_url":"https://api.github.com/users/EventStore/received_events","type":"Organization","site_admin":false},"repo":{"id":11423735,"name":"EventStore.JVM","full_name":"EventStore/EventStore.JVM","owner":{"login":"EventStore","id":1628864,"avatar_url":"https://avatars.githubusercontent.com/u/1628864?v=3","gravatar_id":"","url":"https://api.github.com/users/EventStore","html_url":"https://github.com/EventStore","followers_url":"https://api.github.com/users/EventStore/followers","following_url":"https://api.github.com/users/EventStore/following{/other_user}","gists_url":"https://api.github.com/users/EventStore/gists{/gist_id}","starred_url":"https://api.github.com/users/EventStore/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/EventStore/subscriptions","organizations_url":"https://api.github.com/users/EventStore/orgs","repos_url":"https://api.github.com/users/EventStore/repos","events_url":"https://api.github.com/users/EventStore/events{/privacy}","received_events_url":"https://api.github.com/users/EventStore/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/EventStore/EventStore.JVM","description":"Event Store JVM Client ","fork":false,"url":"https://api.github.com/repos/EventStore/EventStore.JVM","forks_url":"https://api.github.com/repos/EventStore/EventStore.JVM/forks","keys_url":"https://api.github.com/repos/EventStore/EventStore.JVM/keys{/key_id}","collaborators_url":"https://api.github.com/repos/EventStore/EventStore.JVM/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/EventStore/EventStore.JVM/teams","hooks_url":"https://api.github.com/repos/EventStore/EventStore.JVM/hooks","issue_events_url":"https://api.github.com/repos/EventStore/EventStore.JVM/issues/events{/number}","events_url":"https://api.github.com/repos/EventStore/EventStore.JVM/events","assignees_url":"https://api.github.com/repos/EventStore/EventStore.JVM/assignees{/user}","branches_url":"https://api.github.com/repos/EventStore/EventStore.JVM/branches{/branch}","tags_url":"https://api.github.com/repos/EventStore/EventStore.JVM/tags","blobs_url":"https://api.github.com/repos/EventStore/EventStore.JVM/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/EventStore/EventStore.JVM/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/EventStore/EventStore.JVM/git/refs{/sha}","trees_url":"https://api.github.com/repos/EventStore/EventStore.JVM/git/trees{/sha}","statuses_url":"https://api.github.com/repos/EventStore/EventStore.JVM/statuses/{sha}","languages_url":"https://api.github.com/repos/EventStore/EventStore.JVM/languages","stargazers_url":"https://api.github.com/repos/EventStore/EventStore.JVM/stargazers","contributors_url":"https://api.github.com/repos/EventStore/EventStore.JVM/contributors","subscribers_url":"https://api.github.com/repos/EventStore/EventStore.JVM/subscribers","subscription_url":"https://api.github.com/repos/EventStore/EventStore.JVM/subscription","commits_url":"https://api.github.com/repos/EventStore/EventStore.JVM/commits{/sha}","git_commits_url":"https://api.github.com/repos/EventStore/EventStore.JVM/git/commits{/sha}","comments_url":"https://api.github.com/repos/EventStore/EventStore.JVM/comments{/number}","issue_comment_url":"https://api.github.com/repos/EventStore/EventStore.JVM/issues/comments{/number}","contents_url":"https://api.github.com/repos/EventStore/EventStore.JVM/contents/{+path}","compare_url":"https://api.github.com/repos/EventStore/EventStore.JVM/compare/{base}...{head}","merges_url":"https://api.github.com/repos/EventStore/EventStore.JVM/merges","archive_url":"https://api.github.com/repos/EventStore/EventStore.JVM/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/EventStore/EventStore.JVM/downloads","issues_url":"https://api.github.com/repos/EventStore/EventStore.JVM/issues{/number}","pulls_url":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls{/number}","milestones_url":"https://api.github.com/repos/EventStore/EventStore.JVM/milestones{/number}","notifications_url":"https://api.github.com/repos/EventStore/EventStore.JVM/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/EventStore/EventStore.JVM/labels{/name}","releases_url":"https://api.github.com/repos/EventStore/EventStore.JVM/releases{/id}","deployments_url":"https://api.github.com/repos/EventStore/EventStore.JVM/deployments","created_at":"2013-07-15T13:28:06Z","updated_at":"2016-10-04T20:23:41Z","pushed_at":"2016-10-05T15:36:22Z","git_url":"git://github.com/EventStore/EventStore.JVM.git","ssh_url":"git@github.com:EventStore/EventStore.JVM.git","clone_url":"https://github.com/EventStore/EventStore.JVM.git","svn_url":"https://github.com/EventStore/EventStore.JVM","homepage":"https://geteventstore.com","size":1121,"stargazers_count":122,"watchers_count":122,"language":"Scala","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":24,"mirror_url":null,"open_issues_count":13,"forks":24,"open_issues":13,"watchers":122,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls/65"},"html":{"href":"https://github.com/EventStore/EventStore.JVM/pull/65"},"issue":{"href":"https://api.github.com/repos/EventStore/EventStore.JVM/issues/65"},"comments":{"href":"https://api.github.com/repos/EventStore/EventStore.JVM/issues/65/comments"},"review_comments":{"href":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls/65/comments"},"review_comment":{"href":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/EventStore/EventStore.JVM/pulls/65/commits"},"statuses":{"href":"https://api.github.com/repos/EventStore/EventStore.JVM/statuses/40dc230e0d77f28d095d042255fa8526f72e1b6a"}}}}
{"actor":{"display_login":"t3hnar"}}