Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 8 additions & 8 deletions project/Build.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@ import Keys._
object ApplicationBuild extends Build {

val dependencies = Seq(
"org.scalatest" %% "scalatest" % "1.8" % "test",
"io.spray" % "spray-can" % "1.0-M7",
"io.spray" % "spray-client" % "1.0-M7",
"io.spray" % "spray-json_2.9.2" % "1.2.3",
"com.typesafe.akka" % "akka-actor" % "2.0.4",
"org.scalatest" %% "scalatest" % "2.0" % "test",
"io.spray" % "spray-can" % "1.2.0",
"io.spray" % "spray-client" % "1.2.0",
"io.spray" % "spray-json_2.10" % "1.2.5",
"com.typesafe.akka" % "akka-actor_2.10" % "2.2.3",
"com.novocode" % "junit-interface" % "0.10-M1" % "test"
)

val main = Project(id = "sprouch", base = new File("."), settings = Project.defaultSettings ++ Seq(
(scalaVersion := "2.9.2"),
(scalaVersion := "2.10.3"),
(libraryDependencies ++= dependencies),
(resolvers ++= Seq(
"spray repo" at "http://repo.spray.io",
Expand All @@ -22,9 +22,9 @@ object ApplicationBuild extends Build {
(testOptions in Test := Nil),
(publishTo := Some(Resolver.file(
"gh-pages",
new File("/home/k/workspaces/sprouch-pages/repository/")
new File("/Users/thadeu/Documents/source-codes/open-source/sprouch/pages")
))),
(version := "0.5.11")
(version := "0.5.11-custom")
))

}
2 changes: 1 addition & 1 deletion project/build.properties
Original file line number Diff line number Diff line change
@@ -1 +1 @@
sbt.version=0.12.1
sbt.version=0.13.1
1 change: 1 addition & 0 deletions project/plugins.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,4 @@ resolvers += "Typesafe repository" at "http://repo.typesafe.com/typesafe/release

resolvers += "sonatype-snapshots" at "https://oss.sonatype.org/content/repositories/snapshots/"

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "2.4.0")
2 changes: 1 addition & 1 deletion src/main/resources/reference.conf
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
spray.can.client {
ssl-encryption = on

}
12 changes: 6 additions & 6 deletions src/main/scala/sprouch/Couch.scala
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package sprouch

import akka.actor._
import akka.dispatch.Future
import spray.can.client.HttpClient
import spray.client.HttpConduit
import HttpConduit._
import scala.concurrent.Future
import spray.can.Http
import spray.client.pipelining._
import spray.http._
import HttpMethods._
import spray.httpx.encoding.{Gzip, Deflate}
Expand All @@ -16,7 +15,6 @@ import spray.util._
import java.util.UUID
import akka.event.Logging
import java.net.URLEncoder.{encode => urlEncode}

import JsonProtocol._

private[sprouch] trait UriBuilder {
Expand All @@ -35,7 +33,9 @@ case class SprouchException(error:ErrorResponse) extends Exception
* Class that handles the connection to CouchDB. It contains methods for creating, looking up and deleting databases.
*/
class Couch(config:Config) extends UriBuilder {

implicit val system = ActorSystem()
import system.dispatcher // execution context for futures

private val pipelines = new Pipelines(config)
private lazy val pipeline = pipelines.pipeline[OkResponse]
private lazy val getDbPipeline = pipelines.pipeline[GetDbResponse]
Expand Down
10 changes: 6 additions & 4 deletions src/main/scala/sprouch/Database.scala
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package sprouch

import akka.actor._
import java.util.UUID
import spray.httpx.marshalling.Marshaller
import spray.httpx.unmarshalling.Unmarshaller
import akka.actor.ActorRef
import spray.http.HttpMethods.HEAD
import spray.client.HttpConduit
import HttpConduit.{Post, Delete, Get, Put}
import spray.client.pipelining._
import spray.httpx.SprayJsonSupport._
import akka.dispatch.Future
import scala.concurrent.Future
import spray.json.RootJsonFormat
import spray.httpx.RequestBuilding.RequestBuilder
import spray.http.HttpRequest
Expand All @@ -25,7 +25,9 @@ import spray.json.JsValue
*/
class Database private[sprouch](val name:String, pipelines:Pipelines) extends UriBuilder {
import pipelines._

implicit val system = ActorSystem()
import system.dispatcher // execution context for futures

private def dbUri:String = dbUri(name)
private def docUri(doc:Document[_]):String = docUri(doc.id)
private def docUri(id:String) = path(name, id)
Expand Down
4 changes: 1 addition & 3 deletions src/main/scala/sprouch/JsonProtocol.scala
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package sprouch

import spray.can.client.HttpClient
import spray.client.HttpConduit
import HttpConduit._
import spray.client.pipelining
import spray.http._
import HttpMethods._
import spray.httpx.encoding.{Gzip, Deflate}
Expand Down
8 changes: 4 additions & 4 deletions src/main/scala/sprouch/LocalEnv.scala
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package sprouch

import akka.actor.ActorSystem
import akka.util.Duration
import akka.dispatch.Future
import akka.dispatch.Await
import scala.concurrent.duration.Duration
import scala.concurrent.Future
import scala.concurrent.Await

/**
* Convenience methods and values for the default config of a local CouchDb install.
Expand All @@ -23,7 +23,7 @@ object LocalEnv {
/**
* timeout for futures, default 10 seconds
*/
var testDuration = Duration("10 seconds")
val testDuration = Duration("10 seconds")
/**
* convenience method to wait for future completion
*/
Expand Down
67 changes: 30 additions & 37 deletions src/main/scala/sprouch/Pipelines.scala
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package sprouch

import akka.util.Timeout
import akka.actor._
import akka.dispatch.Future
import spray.can.client.HttpClient
import spray.client.HttpConduit
import HttpConduit._
import scala.concurrent.Future
import spray.client.pipelining
import spray.client.pipelining._
import spray.http._
import HttpMethods._
import spray.httpx.encoding.{Gzip, Deflate}
import spray.httpx.SprayJsonSupport._
import spray.httpx.unmarshalling.Unmarshaller
import spray.httpx.unmarshalling.FromResponseUnmarshaller
import spray.json._
import spray.util._
import java.util.UUID
Expand All @@ -19,9 +19,12 @@ import akka.actor.Props
import akka.event.Logging
import sprouch.JsonProtocol.ErrorResponseBody
import sprouch.JsonProtocol.ErrorResponse
import spray.io.IOBridge
import spray.io.IOExtension

import akka.io.IO
import spray.can.Http
import akka.pattern.ask
import spray.io.{ ConnectionTimeouts, ClientSSLEngineProvider, ServerSSLEngineProvider }
import scala.concurrent.duration.Duration
import scala.concurrent.Await
/**
* Configuration data, default values should be valid for a default install of CouchDB.
*
Expand All @@ -39,44 +42,36 @@ case class Config(
https:Boolean = false
)

private[sprouch] class Pipelines(config:Config) {
import config._

private val conduit = {
val ioBridge = IOExtension(actorSystem).ioBridge()
val httpClient = actorSystem.actorOf(Props(new HttpClient(ioBridge)))
actorSystem.actorOf(Props(new HttpConduit(httpClient, hostName, port, https)))
}
private val log = Logging(actorSystem, conduit)
private[sprouch] class Pipelines(config:Config) {
import config._
implicit val system = actorSystem
implicit val timeout = Timeout(10000)
import system.dispatcher

private val logRequest: HttpRequest => HttpRequest = r => {
log.info(r.toString + "\n")
r
}
def transportActorRefFuture = for (
Http.HostConnectorInfo(connector, _) <- IO(Http)(actorSystem) ? Http.HostConnectorSetup(host = hostName, port = port, sslEncryption = https)
) yield connector

private val logResponse: HttpResponse => HttpResponse = r => {
log.info(r.toString + "\n")
r
}
def pipeline[A:Unmarshaller]: HttpRequest => Future[A] = pipeline[A](None)
def pipeline[A:FromResponseUnmarshaller]: HttpRequest => Future[A] = pipeline[A](None)

def pipeline[A:Unmarshaller](etag:Option[String]): HttpRequest => Future[A] = {
def unmarshalEither[A:Unmarshaller]: HttpResponse => A = {
def pipeline[A:FromResponseUnmarshaller](etag:Option[String]): HttpRequest => Future[A] = {
def unmarshalEither[A:FromResponseUnmarshaller]: HttpResponse => A = {
hr => (hr match {
case HttpResponse(status, _, _, _) if status.value == 304 => {//not modified
throw new SprouchException(ErrorResponse(status.value, None))
case HttpResponse(status, _, _, _) if status.intValue == 304 => {//not modified
throw new SprouchException(ErrorResponse(status.intValue, None))
}
case HttpResponse(status, _, _, _) if status.isSuccess => {
unmarshal[A](implicitly[Unmarshaller[A]])(hr)
unmarshal[A](implicitly[FromResponseUnmarshaller[A]])(hr)
}
case HttpResponse(errorStatus, _, _, _) => {
log.error(hr.toString)
val ue = implicitly[Unmarshaller[ErrorResponseBody]]
val ue = implicitly[FromResponseUnmarshaller[ErrorResponseBody]]
val body = unmarshal[ErrorResponseBody](ue)(hr.copy(status = StatusCodes.OK))
throw new SprouchException(ErrorResponse(errorStatus.value, Option(body)))
throw new SprouchException(ErrorResponse(errorStatus.intValue, Option(body)))
}
})
}
val transportActorRef = Await.result[ActorRef](transportActorRefFuture, Duration("10 seconds"))

addHeader("accept", "application/json") ~>
(etag match {
case Some(etag) => addHeader("If-None-Match", "\"" + etag + "\"")
Expand All @@ -86,9 +81,7 @@ private[sprouch] class Pipelines(config:Config) {
case Some((u,p)) => addCredentials(BasicHttpCredentials(u, p))
case None => (x:HttpRequest) => x
}) ~>
// logRequest ~>
sendReceive(conduit) ~>
// logResponse ~>
sendReceive(transportActorRef) ~>
unmarshalEither[A]
}

Expand Down
3 changes: 2 additions & 1 deletion src/main/scala/sprouch/dsl/DslNewDocument.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,9 @@ package sprouch.dsl

import sprouch._
import java.util.UUID
import akka.dispatch.Future
import scala.concurrent.Future
import spray.json.RootJsonFormat
import scala.concurrent.ExecutionContext.Implicits.global

trait DslDocument[A] {

Expand Down
3 changes: 2 additions & 1 deletion src/main/scala/sprouch/dsl/DslRevedDocument.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package sprouch.dsl

import sprouch._
import akka.dispatch.Future
import scala.concurrent.Future
import spray.json.RootJsonFormat
import sprouch.JsonProtocol.OkResponse
import sprouch.JsonProtocol.AllDocsResponse
import spray.json.JsonFormat
import scala.concurrent.ExecutionContext.Implicits.global

class DslRevedDocument[A](id:String, rev:String, data:A, attachments:Map[String, AttachmentStub])
extends RevedDocument[A](id, rev, data, attachments) {
Expand Down
3 changes: 2 additions & 1 deletion src/main/scala/sprouch/dsl/package.scala
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package sprouch

import spray.json.RootJsonFormat
import akka.dispatch.Future
import scala.concurrent.Future
import scala.annotation.implicitNotFound
import spray.json.JsonFormat
import spray.json.JsValue
import sprouch.StaleOption.notStale
import scala.concurrent.ExecutionContext.Implicits.global

package object dsl {
def queryView[K,V](viewDocName:String, viewName:String,
Expand Down
6 changes: 3 additions & 3 deletions src/main/scala/sprouch/synchronous/Couch.scala
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package sprouch.synchronous

import akka.util.Duration
import scala.concurrent.duration.Duration
import sprouch.Config
import akka.dispatch.Future
import akka.dispatch.Await
import scala.concurrent.Future
import scala.concurrent.Await
import sprouch.JsonProtocol.OkResponse

/**
Expand Down
6 changes: 3 additions & 3 deletions src/main/scala/sprouch/synchronous/Database.scala
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package sprouch.synchronous

import akka.util.Duration
import akka.dispatch.Future
import akka.dispatch.Await
import scala.concurrent.duration.Duration
import scala.concurrent.Future
import scala.concurrent.Await
import spray.json.{JsonFormat, RootJsonFormat}
import sprouch._
import JsonProtocol._
Expand Down
1 change: 1 addition & 0 deletions src/test/scala/sprouch/AttachmentsSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import org.scalatest.FunSuite
import org.scalatest.junit.JUnitRunner
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import scala.concurrent.ExecutionContext.Implicits.global

@RunWith(classOf[JUnitRunner])
class AttachmentsSuite extends FunSuite with CouchSuiteHelpers {
Expand Down
1 change: 1 addition & 0 deletions src/test/scala/sprouch/BulkActions.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import org.scalatest.FunSuite
import org.scalatest.junit.JUnitRunner
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import scala.concurrent.ExecutionContext.Implicits.global

@RunWith(classOf[JUnitRunner])
class BulkActions extends FunSuite with CouchSuiteHelpers {
Expand Down
11 changes: 6 additions & 5 deletions src/test/scala/sprouch/CouchSuite.scala
Original file line number Diff line number Diff line change
Expand Up @@ -4,24 +4,25 @@ import org.scalatest.FunSuite
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import akka.actor.ActorSystem
import akka.dispatch.Await
import akka.util.Duration
import scala.concurrent.Await
import scala.concurrent.duration.Duration
import java.util.UUID
import spray.httpx.SprayJsonSupport._
import spray.json._
import akka.dispatch.Future
import scala.concurrent.Future
import spray.httpx.marshalling.Marshaller
import com.typesafe.config.ConfigFactory
import scala.concurrent.ExecutionContext.Implicits.global

@RunWith(classOf[JUnitRunner])
class CouchSuite extends FunSuite with CouchSuiteHelpers {
import JsonProtocol._

test("ssl enabled") {
/*test("ssl enabled") {
val conf = ConfigFactory.load()
val sslEnabled = conf.getBoolean("spray.can.client.ssl-encryption")
assert(sslEnabled, "ssl not enabled in config")
}
}*/

test("create, get, and delete db") {
val dbName = "tempdb" + UUID.randomUUID.toString.toLowerCase
Expand Down
7 changes: 4 additions & 3 deletions src/test/scala/sprouch/CouchSuiteHelpers.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@ package sprouch

import org.scalatest.FunSuite
import akka.actor.ActorSystem
import akka.util.Duration
import akka.dispatch.Await
import akka.dispatch.Future
import scala.concurrent.duration.Duration
import scala.concurrent.Await
import scala.concurrent.Future
import java.util.UUID
import scala.concurrent.ExecutionContext.Implicits.global

case class Test(foo:Int, bar:String)

Expand Down
1 change: 1 addition & 0 deletions src/test/scala/sprouch/Dsl.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import org.scalatest.junit.JUnitRunner
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import sprouch.dsl._
import scala.concurrent.ExecutionContext.Implicits.global

@RunWith(classOf[JUnitRunner])
class Dsl extends FunSuite with CouchSuiteHelpers {
Expand Down
3 changes: 2 additions & 1 deletion src/test/scala/sprouch/DslBulk.scala
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@ import org.scalatest.junit.JUnitRunner
import org.junit.runner.RunWith
import org.scalatest.junit.JUnitRunner
import sprouch.dsl._
import akka.dispatch.Future
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global

class DslBulk extends FunSuite with CouchSuiteHelpers {

Expand Down
Loading