couchdb-conduit 0.7.6 → 0.8.0
raw patch · 17 files changed
+209/−187 lines, 17 filesdep −utf8-stringdep ~attoparsec-conduitdep ~conduitdep ~http-conduitPVP ok
version bump matches the API change (PVP)
Dependencies removed: utf8-string
Dependency ranges changed: attoparsec-conduit, conduit, http-conduit, transformers
API changes (from Hackage documentation)
- Database.CouchDB.Conduit: couchManager :: CouchConnection -> Maybe Manager
+ Database.CouchDB.Conduit.Implicit: couchGet :: MonadCouch m => (Value -> Result a) -> Path -> Path -> Query -> m (Revision, a)
+ Database.CouchDB.Conduit.Implicit: couchPut :: MonadCouch m => (a -> ByteString) -> Path -> Path -> Revision -> Query -> a -> m Revision
+ Database.CouchDB.Conduit.Implicit: couchPut' :: MonadCouch m => (a -> ByteString) -> Path -> Path -> Query -> a -> m Revision
+ Database.CouchDB.Conduit.Implicit: couchPut_ :: MonadCouch m => (a -> ByteString) -> Path -> Path -> Query -> a -> m Revision
- Database.CouchDB.Conduit: class ResourceIO m => MonadCouch m
+ Database.CouchDB.Conduit: class (MonadResource m, MonadBaseControl IO m) => MonadCouch m
- Database.CouchDB.Conduit: couchConnection :: MonadCouch m => m CouchConnection
+ Database.CouchDB.Conduit: couchConnection :: MonadCouch m => m (Manager, CouchConnection)
- Database.CouchDB.Conduit: couchDelete :: MonadCouch m => Path -> Path -> Revision -> ResourceT m ()
+ Database.CouchDB.Conduit: couchDelete :: MonadCouch m => Path -> Path -> Revision -> m ()
- Database.CouchDB.Conduit: couchRev :: MonadCouch m => Path -> Path -> ResourceT m Revision
+ Database.CouchDB.Conduit: couchRev :: MonadCouch m => Path -> Path -> m Revision
- Database.CouchDB.Conduit: couchRev' :: MonadCouch m => Path -> Path -> ResourceT m Revision
+ Database.CouchDB.Conduit: couchRev' :: MonadCouch m => Path -> Path -> m Revision
- Database.CouchDB.Conduit: runCouch :: ResourceIO m => CouchConnection -> ResourceT (ReaderT CouchConnection m) a -> m a
+ Database.CouchDB.Conduit: runCouch :: (MonadThrow m, MonadUnsafeIO m, MonadIO m, MonadBaseControl IO m) => CouchConnection -> ReaderT (Manager, CouchConnection) (ResourceT m) a -> m a
- Database.CouchDB.Conduit: withCouchConnection :: ResourceIO m => CouchConnection -> (CouchConnection -> m a) -> m a
+ Database.CouchDB.Conduit: withCouchConnection :: (MonadResource m, MonadBaseControl IO m) => Manager -> CouchConnection -> ((Manager, CouchConnection) -> m a) -> m a
- Database.CouchDB.Conduit.DB: couchDeleteDB :: MonadCouch m => Path -> ResourceT m ()
+ Database.CouchDB.Conduit.DB: couchDeleteDB :: MonadCouch m => Path -> m ()
- Database.CouchDB.Conduit.DB: couchPutDB :: MonadCouch m => Path -> ResourceT m ()
+ Database.CouchDB.Conduit.DB: couchPutDB :: MonadCouch m => Path -> m ()
- Database.CouchDB.Conduit.DB: couchPutDB_ :: MonadCouch m => Path -> ResourceT m ()
+ Database.CouchDB.Conduit.DB: couchPutDB_ :: MonadCouch m => Path -> m ()
- Database.CouchDB.Conduit.DB: couchReplicateDB :: MonadCouch m => ByteString -> ByteString -> Bool -> Bool -> Bool -> ResourceT m ()
+ Database.CouchDB.Conduit.DB: couchReplicateDB :: MonadCouch m => ByteString -> ByteString -> Bool -> Bool -> Bool -> m ()
- Database.CouchDB.Conduit.DB: couchSecureDB :: MonadCouch m => Path -> [ByteString] -> [ByteString] -> [ByteString] -> [ByteString] -> ResourceT m ()
+ Database.CouchDB.Conduit.DB: couchSecureDB :: MonadCouch m => Path -> [ByteString] -> [ByteString] -> [ByteString] -> [ByteString] -> m ()
- Database.CouchDB.Conduit.Design: couchPutView :: MonadCouch m => Path -> Path -> Path -> ByteString -> Maybe ByteString -> ResourceT m ()
+ Database.CouchDB.Conduit.Design: couchPutView :: MonadCouch m => Path -> Path -> Path -> ByteString -> Maybe ByteString -> m ()
- Database.CouchDB.Conduit.Explicit: couchGet :: (MonadCouch m, FromJSON a) => Path -> Path -> Query -> ResourceT m (Revision, a)
+ Database.CouchDB.Conduit.Explicit: couchGet :: (MonadCouch m, FromJSON a) => Path -> Path -> Query -> m (Revision, a)
- Database.CouchDB.Conduit.Explicit: couchPut :: (MonadCouch m, ToJSON a) => Path -> Path -> Revision -> Query -> a -> ResourceT m Revision
+ Database.CouchDB.Conduit.Explicit: couchPut :: (MonadCouch m, ToJSON a) => Path -> Path -> Revision -> Query -> a -> m Revision
- Database.CouchDB.Conduit.Explicit: couchPut' :: (MonadCouch m, ToJSON a) => Path -> Path -> Query -> a -> ResourceT m Revision
+ Database.CouchDB.Conduit.Explicit: couchPut' :: (MonadCouch m, ToJSON a) => Path -> Path -> Query -> a -> m Revision
- Database.CouchDB.Conduit.Explicit: couchPut_ :: (MonadCouch m, ToJSON a) => Path -> Path -> Query -> a -> ResourceT m Revision
+ Database.CouchDB.Conduit.Explicit: couchPut_ :: (MonadCouch m, ToJSON a) => Path -> Path -> Query -> a -> m Revision
- Database.CouchDB.Conduit.Explicit: toType :: (ResourceIO m, FromJSON a) => Conduit Value m a
+ Database.CouchDB.Conduit.Explicit: toType :: (MonadResource m, FromJSON a) => Conduit Value m a
- Database.CouchDB.Conduit.Generic: couchGet :: (MonadCouch m, Data a) => Path -> Path -> Query -> ResourceT m (Revision, a)
+ Database.CouchDB.Conduit.Generic: couchGet :: (MonadCouch m, Data a) => Path -> Path -> Query -> m (Revision, a)
- Database.CouchDB.Conduit.Generic: couchPut :: (MonadCouch m, Data a) => Path -> Path -> Revision -> Query -> a -> ResourceT m Revision
+ Database.CouchDB.Conduit.Generic: couchPut :: (MonadCouch m, Data a) => Path -> Path -> Revision -> Query -> a -> m Revision
- Database.CouchDB.Conduit.Generic: couchPut' :: (MonadCouch m, Data a) => Path -> Path -> Query -> a -> ResourceT m Revision
+ Database.CouchDB.Conduit.Generic: couchPut' :: (MonadCouch m, Data a) => Path -> Path -> Query -> a -> m Revision
- Database.CouchDB.Conduit.Generic: couchPut_ :: (MonadCouch m, Data a) => Path -> Path -> Query -> a -> ResourceT m Revision
+ Database.CouchDB.Conduit.Generic: couchPut_ :: (MonadCouch m, Data a) => Path -> Path -> Query -> a -> m Revision
- Database.CouchDB.Conduit.Generic: toType :: (ResourceIO m, Data a) => Conduit Value m a
+ Database.CouchDB.Conduit.Generic: toType :: (MonadResource m, Data a) => Conduit Value m a
- Database.CouchDB.Conduit.LowLevel: couch :: MonadCouch m => Method -> Path -> RequestHeaders -> Query -> RequestBody m -> (CouchResponse m -> ResourceT m (CouchResponse m)) -> ResourceT m (CouchResponse m)
+ Database.CouchDB.Conduit.LowLevel: couch :: MonadCouch m => Method -> Path -> RequestHeaders -> Query -> RequestBody m -> (CouchResponse m -> m (CouchResponse m)) -> m (CouchResponse m)
- Database.CouchDB.Conduit.LowLevel: couch' :: MonadCouch m => Method -> (Path -> Path) -> RequestHeaders -> Query -> RequestBody m -> (CouchResponse m -> ResourceT m (CouchResponse m)) -> ResourceT m (CouchResponse m)
+ Database.CouchDB.Conduit.LowLevel: couch' :: MonadCouch m => Method -> (Path -> Path) -> RequestHeaders -> Query -> RequestBody m -> (CouchResponse m -> m (CouchResponse m)) -> m (CouchResponse m)
- Database.CouchDB.Conduit.LowLevel: protect :: MonadCouch m => [Int] -> (CouchResponse m -> ResourceT m (CouchResponse m)) -> CouchResponse m -> ResourceT m (CouchResponse m)
+ Database.CouchDB.Conduit.LowLevel: protect :: MonadCouch m => [Int] -> (CouchResponse m -> m (CouchResponse m)) -> CouchResponse m -> m (CouchResponse m)
- Database.CouchDB.Conduit.LowLevel: protect' :: MonadCouch m => CouchResponse m -> ResourceT m (CouchResponse m)
+ Database.CouchDB.Conduit.LowLevel: protect' :: MonadCouch m => CouchResponse m -> m (CouchResponse m)
- Database.CouchDB.Conduit.View: couchView :: MonadCouch m => Path -> Path -> Path -> Query -> ResourceT m (Source m Object)
+ Database.CouchDB.Conduit.View: couchView :: MonadCouch m => Path -> Path -> Path -> Query -> m (Source m Object)
- Database.CouchDB.Conduit.View: couchView' :: MonadCouch m => Path -> Path -> Path -> Query -> Sink Object m a -> ResourceT m a
+ Database.CouchDB.Conduit.View: couchView' :: MonadCouch m => Path -> Path -> Path -> Query -> Sink Object m a -> m a
- Database.CouchDB.Conduit.View: couchViewPost :: (MonadCouch m, ToJSON a) => Path -> Path -> Path -> Query -> a -> ResourceT m (Source m Object)
+ Database.CouchDB.Conduit.View: couchViewPost :: (MonadCouch m, ToJSON a) => Path -> Path -> Path -> Query -> a -> m (Source m Object)
- Database.CouchDB.Conduit.View: couchViewPost' :: (MonadCouch m, ToJSON a) => Path -> Path -> Path -> Query -> a -> Sink Object m a -> ResourceT m a
+ Database.CouchDB.Conduit.View: couchViewPost' :: (MonadCouch m, ToJSON a) => Path -> Path -> Path -> Query -> a -> Sink Object m a -> m a
- Database.CouchDB.Conduit.View: rowValue :: ResourceIO m => Conduit Object m Value
+ Database.CouchDB.Conduit.View: rowValue :: Monad m => Conduit Object m Value
Files
- couchdb-conduit.cabal +31/−32
- src/Database/CouchDB/Conduit.hs +3/−5
- src/Database/CouchDB/Conduit/DB.hs +7/−7
- src/Database/CouchDB/Conduit/Design.hs +3/−5
- src/Database/CouchDB/Conduit/Explicit.hs +6/−6
- src/Database/CouchDB/Conduit/Generic.hs +6/−6
- src/Database/CouchDB/Conduit/Implicit.hs +4/−5
- src/Database/CouchDB/Conduit/Internal/Connection.hs +36/−27
- src/Database/CouchDB/Conduit/Internal/Doc.hs +16/−17
- src/Database/CouchDB/Conduit/Internal/Parser.hs +5/−3
- src/Database/CouchDB/Conduit/Internal/View.hs +5/−3
- src/Database/CouchDB/Conduit/LowLevel.hs +17/−20
- src/Database/CouchDB/Conduit/View.hs +14/−14
- test/Database/CouchDB/Conduit/Test/Base.hs +28/−9
- test/Database/CouchDB/Conduit/Test/Explicit.hs +13/−13
- test/Database/CouchDB/Conduit/Test/Generic.hs +13/−13
- test/Database/CouchDB/Conduit/Test/View.hs +2/−2
couchdb-conduit.cabal view
@@ -1,8 +1,8 @@ name: couchdb-conduit-version: 0.7.6 +version: 0.8.0 cabal-version: >= 1.8 build-type: Simple-stability: Stable +stability: Testing category: Database, Conduit license: BSD3 license-file: LICENSE@@ -28,23 +28,22 @@ base >= 4 && < 5, aeson >= 0.6 && < 0.7, attoparsec >= 0.8 && < 0.11,- attoparsec-conduit >= 0.2 && < 0.3,+ attoparsec-conduit >= 0.4 && < 0.5,+ blaze-builder >= 0.2.1 && < 0.4, bytestring >= 0.9 && < 0.10,- conduit >= 0.2 && < 0.3,+ conduit >= 0.4 && < 0.5, containers >= 0.2,- http-conduit >= 1.2 && < 1.3,+ data-default,+ http-conduit >= 1.4 && < 1.5, http-types >= 0.6 && < 0.7,- monad-control >= 0.3 && < 0.4,- transformers >= 0.2 && < 0.3,- transformers-base >= 0.4 && < 0.5, lifted-base >= 0.1 && < 0.2,- utf8-string >= 0.3 && < 0.4,- text >= 0.11 && < 0.12,- unordered-containers >= 0.1,+ monad-control >= 0.3 && < 0.4, string-conversions, syb,- data-default,- blaze-builder >= 0.2.1 && < 0.4+ transformers >= 0.2 && < 0.4,+ transformers-base >= 0.4 && < 0.5,+ text >= 0.11 && < 0.12,+ unordered-containers >= 0.1 ghc-options: -Wall exposed-modules: Database.CouchDB.Conduit, @@ -52,14 +51,14 @@ Database.CouchDB.Conduit.Design, Database.CouchDB.Conduit.Explicit, Database.CouchDB.Conduit.Generic, + Database.CouchDB.Conduit.Implicit, Database.CouchDB.Conduit.LowLevel, Database.CouchDB.Conduit.View other-modules: Database.CouchDB.Conduit.Internal.Doc, Database.CouchDB.Conduit.Internal.Parser, Database.CouchDB.Conduit.Internal.View, - Database.CouchDB.Conduit.Internal.Connection, - Database.CouchDB.Conduit.Implicit + Database.CouchDB.Conduit.Internal.Connection test-suite test type: exitcode-stdio-1.0@@ -72,31 +71,31 @@ couchdb-conduit, aeson >= 0.6 && < 0.7, attoparsec >= 0.8 && < 0.11,- attoparsec-conduit >= 0.2 && < 0.3,+ attoparsec-conduit >= 0.4 && < 0.5,+ blaze-builder >= 0.2.1 && < 0.4, bytestring >= 0.9 && < 0.10,- conduit >= 0.2 && < 0.3,+ conduit >= 0.4 && < 0.5, containers >= 0.2,- http-conduit >= 1.2 && < 1.3,+ data-default,+ http-conduit >= 1.4 && < 1.5, http-types >= 0.6 && < 0.7,+ lifted-base >= 0.1 && < 0.2, monad-control >= 0.3 && < 0.4,- transformers >= 0.2 && < 0.3,+ string-conversions,+ syb,+ transformers >= 0.2 && < 0.4, transformers-base >= 0.4 && < 0.5,- lifted-base >= 0.1 && < 0.2,- utf8-string >= 0.3 && < 0.4, text >= 0.11 && < 0.12,- unordered-containers >= 0.1,- syb,- data-default,- blaze-builder >= 0.2.1 && < 0.4+ unordered-containers >= 0.1 ghc-options: -Wall -rtsopts -threaded hs-source-dirs: test main-is: Main.hs- other-modules: - Database.CouchDB.Conduit.Test.Explicit,- Database.CouchDB.Conduit.Test.Util,- Database.CouchDB.Conduit.Test.View,- Database.CouchDB.Conduit.Test.Generic,- CouchDBAuth,- Database.CouchDB.Conduit.Test.Base+ other-modules: + CouchDBAuth, + Database.CouchDB.Conduit.Test.Base, + Database.CouchDB.Conduit.Test.Explicit, + Database.CouchDB.Conduit.Test.Generic, + Database.CouchDB.Conduit.Test.Util, + Database.CouchDB.Conduit.Test.View
src/Database/CouchDB/Conduit.hs view
@@ -24,7 +24,6 @@ def, couchHost, couchPort, - couchManager, couchLogin, couchPass, couchPrefix, @@ -48,7 +47,6 @@ ) where -import Data.Conduit (ResourceT) import Database.CouchDB.Conduit.Internal.Connection import qualified Database.CouchDB.Conduit.Internal.Doc as D @@ -56,7 +54,7 @@ couchRev :: MonadCouch m => Path -- ^ Database. -> Path -- ^ Document path. - -> ResourceT m Revision + -> m Revision couchRev db p = D.couchRev (mkPath [db, p]) -- | Brain-free version of 'couchRev'. If document absent, @@ -64,7 +62,7 @@ couchRev' :: MonadCouch m => Path -- ^ Database. -> Path -- ^ Document path. - -> ResourceT m Revision + -> m Revision couchRev' db p = D.couchRev' (mkPath [db, p]) -- | Delete the given revision of the object. @@ -72,5 +70,5 @@ Path -- ^ Database. -> Path -- ^ Document path. -> Revision -- ^ Revision - -> ResourceT m () + -> m () couchDelete db p = D.couchDelete (mkPath [db, p])
src/Database/CouchDB/Conduit/DB.hs view
@@ -23,11 +23,11 @@ import qualified Data.ByteString as B import qualified Data.Aeson as A -import Data.Conduit (ResourceT) - import qualified Network.HTTP.Conduit as H import qualified Network.HTTP.Types as HT + + import Database.CouchDB.Conduit.Internal.Connection (MonadCouch(..), Path, mkPath) import Database.CouchDB.Conduit.LowLevel (couch, couch', protect, protect') @@ -36,7 +36,7 @@ -- | Create CouchDB database. couchPutDB :: MonadCouch m => Path -- ^ Database - -> ResourceT m () + -> m () couchPutDB db = void $ couch HT.methodPut (mkPath [db]) [] [] (H.RequestBodyBS B.empty) @@ -46,7 +46,7 @@ -- absence. For this it handles @412@ responses. couchPutDB_ :: MonadCouch m => Path -- ^ Database - -> ResourceT m () + -> m () couchPutDB_ db = void $ couch HT.methodPut (mkPath [db]) [] [] (H.RequestBodyBS B.empty) @@ -55,7 +55,7 @@ -- | Delete a database. couchDeleteDB :: MonadCouch m => Path -- ^ Database - -> ResourceT m () + -> m () couchDeleteDB db = void $ couch HT.methodDelete (mkPath [db]) [] [] (H.RequestBodyBS B.empty) protect' @@ -67,7 +67,7 @@ -> [B.ByteString] -- ^ Admin names -> [B.ByteString] -- ^ Readers roles -> [B.ByteString] -- ^ Readers names - -> ResourceT m () + -> m () couchSecureDB db adminRoles adminNames readersRoles readersNames = void $ couch HT.methodPut (mkPath [db, "_security"]) [] [] @@ -89,7 +89,7 @@ -> Bool -- ^ Target creation flag -> Bool -- ^ Continuous flag -> Bool -- ^ Cancel flag - -> ResourceT m () + -> m () couchReplicateDB source target createTarget continuous cancel = void $ couch' HT.methodPost (const "/_replicate") [] [] reqBody protect'
src/Database/CouchDB/Conduit/Design.hs view
@@ -7,12 +7,10 @@ couchPutView ) where -import Prelude hiding (catch) +import Prelude hiding (catch) import Control.Monad (void) import Control.Exception.Lifted (catch) -import Data.Conduit (ResourceT) - import qualified Data.ByteString as B import qualified Data.Text as T import qualified Data.Text.Encoding as TE @@ -32,7 +30,7 @@ -> Path -- ^ View name -> B.ByteString -- ^ Map function -> Maybe B.ByteString -- ^ Reduce function - -> ResourceT m () + -> m () couchPutView db designName viewName mapF reduceF = do (_, A.Object d) <- getDesignDoc path void $ couchPutWith' A.encode path [] $ inferViews (purge_ d) @@ -53,7 +51,7 @@ getDesignDoc :: MonadCouch m => Path - -> ResourceT m (Revision, AT.Value) + -> m (Revision, AT.Value) getDesignDoc designName = catch (couchGetWith A.Success designName []) (\(_ :: CouchError) -> return (B.empty, AT.emptyObject))
src/Database/CouchDB/Conduit/Explicit.hs view
@@ -52,7 +52,7 @@ ) where import qualified Data.Aeson as A -import Data.Conduit (ResourceT, Conduit(..), ResourceIO) +import Data.Conduit (Conduit, MonadResource) import Network.HTTP.Types (Query) @@ -71,7 +71,7 @@ Path -- ^ Database -> Path -- ^ Document path -> Query -- ^ Query - -> ResourceT m (Revision, a) + -> m (Revision, a) couchGet db p = couchGetWith A.fromJSON (mkPath [db, p]) -- | Put an 'A.FromJSON' object in Couch DB with revision, returning the @@ -82,7 +82,7 @@ -> Revision -- ^ Document revision. For new docs provide empty string. -> Query -- ^ Query arguments. -> a -- ^ The object to store. - -> ResourceT m Revision + -> m Revision couchPut db p = couchPutWith A.encode (mkPath [db, p]) -- | \"Don't care\" version of 'couchPut'. Creates document only in its @@ -92,7 +92,7 @@ -> Path -- ^ Document path -> Query -- ^ Query arguments. -> a -- ^ The object to store. - -> ResourceT m Revision + -> m Revision couchPut_ db p = couchPutWith_ A.encode (mkPath [db, p]) -- | Brute force version of 'couchPut'. Creates a document regardless of @@ -102,7 +102,7 @@ -> Path -- ^ Document path -> Query -- ^ Query arguments. -> a -- ^ The object to store. - -> ResourceT m Revision + -> m Revision couchPut' db p = couchPutWith' A.encode (mkPath [db, p]) ------------------------------------------------------------------------------ @@ -113,7 +113,7 @@ -- to concrete 'A.FromJSON' type. -- -- > res <- couchView "mydesign" "myview" [] $ rowValue =$= toType =$ consume -toType :: (ResourceIO m, A.FromJSON a) => Conduit A.Value m a +toType :: (MonadResource m, A.FromJSON a) => Conduit A.Value m a toType = toTypeWith A.fromJSON
src/Database/CouchDB/Conduit/Generic.hs view
@@ -51,7 +51,7 @@ import Data.Generics (Data) import qualified Data.Aeson as A import qualified Data.Aeson.Generic as AG -import Data.Conduit (ResourceT, Conduit(..), ResourceIO) +import Data.Conduit (Conduit, MonadResource) import Network.HTTP.Types (Query) @@ -66,7 +66,7 @@ Path -- ^ Database -> Path -- ^ Document path -> Query -- ^ Query - -> ResourceT m (Revision, a) + -> m (Revision, a) couchGet db p = couchGetWith AG.fromJSON (mkPath [db, p]) -- | Put an object in Couch DB with revision, returning the new Revision. @@ -76,7 +76,7 @@ -> Revision -- ^ Document revision. For new docs provide empty string. -> Query -- ^ Query arguments. -> a -- ^ The object to store. - -> ResourceT m Revision + -> m Revision couchPut db p = couchPutWith AG.encode (mkPath [db, p]) -- | \"Don't care\" version of 'couchPut'. Creates document only in its @@ -86,7 +86,7 @@ -> Path -- ^ Document path -> Query -- ^ Query arguments. -> a -- ^ The object to store. - -> ResourceT m Revision + -> m Revision couchPut_ db p = couchPutWith_ AG.encode (mkPath [db, p]) -- | Brute force version of 'couchPut'. Creates a document regardless of @@ -96,7 +96,7 @@ -> Path -- ^ Document path -> Query -- ^ Query arguments. -> a -- ^ The object to store. - -> ResourceT m Revision + -> m Revision couchPut' db p = couchPutWith' AG.encode (mkPath [db, p]) ------------------------------------------------------------------------------ @@ -107,5 +107,5 @@ -- to concrete type. -- -- > res <- couchView "mydesign" "myview" [] $ rowValue =$= toType =$ consume -toType :: (ResourceIO m, Data a) => Conduit A.Value m a +toType :: (MonadResource m, Data a) => Conduit A.Value m a toType = toTypeWith AG.fromJSON
src/Database/CouchDB/Conduit/Implicit.hs view
@@ -13,7 +13,6 @@ import qualified Data.Aeson as A import qualified Data.ByteString.Lazy as BL (ByteString) -import Data.Conduit (ResourceT) import Database.CouchDB.Conduit.Internal.Connection (MonadCouch(..), Path, mkPath, Revision) @@ -30,7 +29,7 @@ -> Path -- ^ Document path. -> Path -- ^ Document path. -> Query -- ^ Query - -> ResourceT m (Revision, a) + -> m (Revision, a) couchGet f db p = couchGetWith f (mkPath [db, p]) -- | Put document, with given encoder @@ -42,7 +41,7 @@ -- ^ empty string. -> Query -- ^ Query arguments. -> a -- ^ The object to store. - -> ResourceT m Revision + -> m Revision couchPut f db p = couchPutWith f (mkPath [db, p]) -- | \"Don't care\" version of 'couchPut'. Creates document only in its @@ -53,7 +52,7 @@ -> Path -- ^ Document path. -> Query -- ^ Query arguments. -> a -- ^ The object to store. - -> ResourceT m Revision + -> m Revision couchPut_ f db p = couchPutWith_ f (mkPath [db, p]) -- | Brute force version of 'couchPut'. Creates a document regardless of @@ -64,6 +63,6 @@ -> Path -- ^ Document path. -> Query -- ^ Query arguments. -> a -- ^ The object to store. - -> ResourceT m Revision + -> m Revision couchPut' f db p = couchPutWith' f (mkPath [db, p])
src/Database/CouchDB/Conduit/Internal/Connection.hs view
@@ -1,5 +1,6 @@ {-# LANGUAGE DeriveDataTypeable #-} {-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE FlexibleInstances #-} {-# LANGUAGE FlexibleContexts #-} @@ -16,7 +17,6 @@ def, couchHost, couchPort, - couchManager, couchLogin, couchPass, couchPrefix, @@ -32,14 +32,19 @@ import Control.Monad.Trans.Reader (ReaderT, ask, runReaderT) import Control.Exception (Exception) import Control.Monad.Trans.Class (lift) +import Control.Monad.IO.Class (MonadIO) +import Control.Monad.Trans.Control (MonadBaseControl (..)) + +import Data.Conduit (MonadResource, MonadThrow, MonadUnsafeIO, + ResourceT, runResourceT) import Data.Generics (Typeable) import Data.Default (Default (def)) import qualified Data.ByteString as B import qualified Data.Text.Encoding as TE import qualified Blaze.ByteString.Builder as BLB -import Data.Conduit (ResourceIO, ResourceT, runResourceT) + import qualified Network.HTTP.Conduit as H import qualified Network.HTTP.Types as HT @@ -88,10 +93,6 @@ -- ^ Hostname. Default value is \"localhost\" , couchPort :: Int -- ^ Port. 5984 by default. - , couchManager :: Maybe H.Manager - -- ^ Connection 'Manager'. 'Nothing' by default. If you need to use - -- your 'H.Manager' (for connection pooling for example), set it to - -- 'Just' 'H.Manager'. , couchLogin :: B.ByteString -- ^ CouchDB login. By default is 'B.empty'. , couchPass :: B.ByteString @@ -102,7 +103,7 @@ } instance Default CouchConnection where - def = CouchConnection "localhost" 5984 Nothing B.empty B.empty B.empty + def = CouchConnection "localhost" 5984 B.empty B.empty B.empty ----------------------------------------------------------------------------- -- Runtime @@ -119,12 +120,16 @@ -- larger monad an instance of 'MonadCouch' and skip the intermediate ReaderT, -- since then performance is improved by eliminating one monad from the final -- transformer stack. -class ResourceIO m => MonadCouch m where - couchConnection :: m CouchConnection +class (MonadResource m, MonadBaseControl IO m) => MonadCouch m where + couchConnection :: m (H.Manager, CouchConnection) -instance (ResourceIO m) => MonadCouch (ReaderT CouchConnection m) where +instance (MonadResource m, MonadBaseControl IO m) => + MonadCouch (ReaderT (H.Manager, CouchConnection) m) where couchConnection = ask +--No instance for (MonadCouch (ResourceT (ReaderT +-- (H.Manager, CouchConnection) (ResourceT IO)))) + -- | A CouchDB Error. data CouchError = CouchHttpError Int B.ByteString @@ -139,28 +144,32 @@ deriving (Show, Typeable) instance Exception CouchError --- | Run a sequence of CouchDB actions. This function is a combination of +-- | Connect to a CouchDB server, run a sequence of CouchDB actions, and then +-- close the connection.. This function is a combination of 'H.withManager', -- 'withCouchConnection', 'runReaderT' and 'runResourceT'. -- --- If you create your own instance of 'MonadCouch', use 'withCouchConnection'. -runCouch :: ResourceIO m => - CouchConnection -- ^ Couch connection - -> ResourceT (ReaderT CouchConnection m) a -- ^ CouchDB actions +-- If you create your own instance of 'MonadCouch' or use connection pool, +-- use 'withCouchConnection'. +runCouch :: (MonadThrow m, MonadUnsafeIO m, MonadIO m, MonadBaseControl IO m) =>+ CouchConnection -- ^ Couch connection+ -> ReaderT (H.Manager, CouchConnection) (ResourceT m) a + -- ^ Actions -> m a -runCouch c = withCouchConnection c . runReaderT . runResourceT +runCouch c f = H.withManager $ \manager -> + withCouchConnection manager c . runReaderT . runResourceT . lift $ f --- | Connect to a CouchDB server, call the supplied function, and then close --- the connection. +-- | Run a sequence of CouchDB actions with provided 'H.Manager' and +-- 'CouchConnection'. -- --- > withCouchConnection def {couchDB = "db"} . runReaderT . runResourceT $ do +-- > withCouchConnection manager def {couchDB = "db"} . runReaderT . +-- > runResourceT . lift $ do -- > ... -- actions -withCouchConnection :: ResourceIO m => - CouchConnection -- ^ Couch connection - -> (CouchConnection -> m a) -- ^ Function to run +withCouchConnection :: (MonadResource m, MonadBaseControl IO m) => + H.Manager -- ^ Connection manager + -> CouchConnection -- ^ Couch connection + -> ((H.Manager, CouchConnection) -> m a) + -- ^ Actions -> m a -withCouchConnection c@(CouchConnection _ _ mayMan _ _ _) f = - case mayMan of - -- Allocate manager with helper - Nothing -> H.withManager $ \m -> lift $ f $ c {couchManager = Just m} - _ -> f c +withCouchConnection man c@(CouchConnection{}) f = + f (man, c)
src/Database/CouchDB/Conduit/Internal/Doc.hs view
@@ -15,15 +15,14 @@ import Prelude hiding (catch) import Control.Monad (void) -import Control.Exception.Lifted (catch) -import Control.Monad.Trans.Class (lift) +import Control.Exception.Lifted (catch, throw) import Data.Maybe (fromJust) import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as BL import qualified Data.Text.Encoding as TE import qualified Data.Aeson as A -import Data.Conduit (ResourceT, resourceThrow, ($$)) +import Data.Conduit (($$),) import qualified Data.Conduit.Attoparsec as CA import qualified Network.HTTP.Conduit as H @@ -40,9 +39,9 @@ -- | Get Revision of a document. couchRev :: MonadCouch m => Path -- ^ Correct 'Path' with escaped fragments. - -> ResourceT m Revision + -> m Revision couchRev p = do - (H.Response _ hs _) <- couch HT.methodHead p [] [] + (H.Response _ _ hs _) <- couch HT.methodHead p [] [] (H.RequestBodyBS B.empty) protect' return $ peekRev hs where @@ -52,18 +51,18 @@ -- just return 'B.empty'. couchRev' :: MonadCouch m => Path -- ^ Correct 'Path' with escaped fragments. - -> ResourceT m Revision + -> m Revision couchRev' p = catch (couchRev p) handler404 where handler404 (CouchHttpError 404 _) = return B.empty - handler404 e = lift $ resourceThrow e + handler404 e = throw e -- | Delete the given revision of the object. couchDelete :: MonadCouch m => Path -- ^ Correct 'Path' with escaped fragments. -> Revision -- ^ Revision - -> ResourceT m () + -> m () couchDelete p r = void $ couch methodDelete p [] [("rev", Just r)]@@ -78,14 +77,14 @@ (A.Value -> A.Result a) -- ^ Parser -> Path -- ^ Correct 'Path' with escaped fragments. -> Query -- ^ Query - -> ResourceT m (Revision, a) + -> m (Revision, a) couchGetWith f p q = do - H.Response _ _ bsrc <- couch HT.methodGet + H.Response _ _ _ bsrc <- couch HT.methodGet p [] q (H.RequestBodyBS B.empty) protect' j <- bsrc $$ CA.sinkParser A.json - A.String r <- lift $ either resourceThrow return $ extractField "_rev" j - o <- lift $ jsonToTypeWith f j + A.String r <- either throw return $ extractField "_rev" j + o <- jsonToTypeWith f j return (TE.encodeUtf8 r, o) -- | Put document, with given encoder @@ -96,13 +95,13 @@ -- ^ empty string. -> Query -- ^ Query arguments. -> a -- ^ The object to store.- -> ResourceT m Revision+ -> m Revision couchPutWith f p r q val = do- H.Response _ _ bsrc <- couch HT.methodPut + H.Response _ _ _ bsrc <- couch HT.methodPut p (ifMatch r) q (H.RequestBodyLBS $ f val) protect' j <- bsrc $$ CA.sinkParser A.json - lift $ either resourceThrow return $ extractRev j + either throw return $ extractRev j where ifMatch "" = [] ifMatch rv = [("If-Match", rv)] @@ -114,7 +113,7 @@ -> Path -- ^ Correct 'Path' with escaped fragments. -> HT.Query -- ^ Query arguments. -> a -- ^ The object to store. - -> ResourceT m Revision + -> m Revision couchPutWith_ f p q val = do rev <- couchRev' p if rev == "" @@ -127,7 +126,7 @@ -> Path -- ^ Correct 'Path' with escaped fragments. -> HT.Query -- ^ Query arguments. -> a -- ^ The object to store. - -> ResourceT m Revision + -> m Revision couchPutWith' f p q val = do rev <- couchRev' p couchPutWith f p rev q val
src/Database/CouchDB/Conduit/Internal/Parser.hs view
@@ -2,7 +2,9 @@ module Database.CouchDB.Conduit.Internal.Parser where -import Data.Conduit +import Control.Exception.Lifted (throw) + +import Data.Conduit (MonadResource) import qualified Data.Text as T import qualified Data.HashMap.Lazy as M import qualified Data.Aeson as A @@ -24,12 +26,12 @@ look _ = Left $ CouchInternalError "CouchDB object has't revision" -- | Convert to type with given convertor -jsonToTypeWith :: ResourceIO m =>+jsonToTypeWith :: MonadResource m => (A.Value -> A.Result a) -> A.Value -> m a jsonToTypeWith f j = case f j of - A.Error e -> resourceThrow $ CouchInternalError $ + A.Error e -> throw $ CouchInternalError $ "Error parsing json: " <> cs e A.Success o -> return o
src/Database/CouchDB/Conduit/Internal/View.hs view
@@ -2,8 +2,10 @@ module Database.CouchDB.Conduit.Internal.View where +import Control.Exception.Lifted (throw) + import qualified Data.Aeson as A -import Data.Conduit (resourceThrow, Conduit(..), ResourceIO) +import Data.Conduit (Conduit(..), MonadResource) import qualified Data.Conduit.List as CL (mapM) import Data.String.Conversions ((<>), cs) @@ -13,10 +15,10 @@ -- to concrete type. -- -- > res <- couchView "mydesign" "myview" [] $ rowValue =$= toType =$ consume -toTypeWith :: ResourceIO m => +toTypeWith :: MonadResource m => (A.Value -> A.Result a) -- ^ Parser -> Conduit A.Value m a toTypeWith f = CL.mapM (\v -> case f v of - A.Error e -> resourceThrow $ CouchInternalError $ + A.Error e -> throw $ CouchInternalError $ "Error parsing json: " <> cs e A.Success o -> return o)
src/Database/CouchDB/Conduit/LowLevel.hs view
@@ -12,25 +12,22 @@ couch', -- * Response protection - protect, + protect + , protect' ) where import Prelude hiding (catch) -import Control.Exception.Lifted (catch) +import Control.Exception.Lifted (catch, throw) import Control.Exception (SomeException) -import Control.Monad.Trans.Class (lift) -import Control.Monad.Base (liftBase) -import Data.Maybe (fromJust) import qualified Data.ByteString as B import qualified Data.Aeson as A import qualified Data.HashMap.Lazy as M import Data.String.Conversions ((<>), cs) -import Data.Conduit (ResourceT, Source, - ($$), resourceThrow) +import Data.Conduit (Source, ($$)) import Data.Conduit.Attoparsec (sinkParser) import qualified Network.HTTP.Conduit as H @@ -52,9 +49,9 @@ -> HT.RequestHeaders -- ^ Headers -> HT.Query -- ^ Query args -> H.RequestBody m -- ^ Request body - -> (CouchResponse m -> ResourceT m (CouchResponse m)) + -> (CouchResponse m -> m (CouchResponse m)) -- ^ Protect function. See 'protect' - -> ResourceT m (CouchResponse m) + -> m (CouchResponse m) couch meth path = couch' meth withPrefix where @@ -71,11 +68,11 @@ -> HT.RequestHeaders -- ^ Headers -> HT.Query -- ^ Query args -> H.RequestBody m -- ^ Request body - -> (CouchResponse m -> ResourceT m (CouchResponse m)) + -> (CouchResponse m -> m (CouchResponse m)) -- ^ Protect function. See 'protect' - -> ResourceT m (CouchResponse m) -couch' meth pathFn hdrs qs reqBody protectFn = do - conn <- lift couchConnection + -> m (CouchResponse m) +couch' meth pathFn hdrs qs reqBody protectFn = do + (manager, conn) <- couchConnection let req = H.def { H.method = meth , H.host = couchHost conn @@ -88,7 +85,7 @@ -- Apply auth if needed let req' = if couchLogin conn == B.empty then req else H.applyBasicAuth (couchLogin conn) (couchPass conn) req - res <- H.http req' (fromJust $ couchManager conn) + res <- H.http req' manager protectFn res -- | Protect 'H.Response' from bad status codes. If status code in list @@ -100,16 +97,16 @@ -- To protect from typical errors use 'protect''. protect :: MonadCouch m => [Int] -- ^ Good codes - -> (CouchResponse m -> ResourceT m (CouchResponse m)) -- ^ handler + -> (CouchResponse m -> m (CouchResponse m)) -- ^ handler -> CouchResponse m -- ^ Response - -> ResourceT m (CouchResponse m) -protect goodCodes h ~resp@(H.Response (HT.Status sc sm) _ bsrc) - | sc == 304 = liftBase $ resourceThrow NotModified + -> m (CouchResponse m) +protect goodCodes h ~resp@(H.Response (HT.Status sc sm) _ _ bsrc) + | sc == 304 = throw NotModified | sc `elem` goodCodes = h resp | otherwise = do v <- catch (bsrc $$ sinkParser A.json) (\(_::SomeException) -> return A.Null) - liftBase $ resourceThrow $ CouchHttpError sc $ msg v + throw $ CouchHttpError sc $ msg v where msg v = sm <> reason v reason (A.Object v) = case M.lookup "reason" v of @@ -124,5 +121,5 @@ -- See 'protect' for details. protect' :: MonadCouch m => CouchResponse m -- ^ Response - -> ResourceT m (CouchResponse m) + -> m (CouchResponse m) protect' = protect [200, 201, 202, 304] return
src/Database/CouchDB/Conduit/View.hs view
@@ -50,8 +50,8 @@ ) where -import Control.Monad.Trans.Class (lift) import Control.Applicative ((<|>)) +import Control.Exception.Lifted (throw) import Data.Monoid (mconcat) import qualified Data.ByteString as B @@ -61,10 +61,10 @@ import qualified Data.Aeson as A import Data.Attoparsec -import Data.Conduit (ResourceIO, ResourceT, +import Data.Conduit (MonadResource, Source, Conduit, Sink, ($$), ($=), sequenceSink, SequencedSinkResponse(..), - resourceThrow ) + ) import qualified Data.Conduit.List as CL import qualified Data.Conduit.Attoparsec as CA @@ -257,9 +257,9 @@ -> Path -- ^ Design document -> Path -- ^ View name -> HT.Query -- ^ Query parameters - -> ResourceT m (Source m A.Object)+ -> m (Source m A.Object) couchView db design view q = do- H.Response _ _ bsrc <- couch HT.methodGet + H.Response _ _ _ bsrc <- couch HT.methodGet (viewPath db design view) [] q (H.RequestBodyBS B.empty) protect' @@ -281,7 +281,7 @@ -> Path -- ^ View name -> HT.Query -- ^ Query parameters -> Sink A.Object m a -- ^ Sink for handle view rows.- -> ResourceT m a + -> m a couchView' db design view q sink = do raw <- couchView db design view q raw $$ sink @@ -301,9 +301,9 @@ -> Path -- ^ View name -> HT.Query -- ^ Query parameters -> a -- ^ View @keys@. Must be list or cortege. - -> ResourceT m (Source m A.Object) + -> m (Source m A.Object) couchViewPost db design view q ks = do - H.Response _ _ bsrc <- couch HT.methodPost + H.Response _ _ _ bsrc <- couch HT.methodPost (viewPath db design view) [] q @@ -320,16 +320,16 @@ -> HT.Query -- ^ Query parameters -> a -- ^ View @keys@. Must be list or cortege. -> Sink A.Object m a -- ^ Sink for handle view rows. - -> ResourceT m a + -> m a couchViewPost' db design view q ks sink = do raw <- couchViewPost db design view q ks raw $$ sink -- | Conduit for extract \"value\" field from CouchDB view row. -rowValue :: ResourceIO m => Conduit A.Object m A.Value +rowValue :: Monad m => Conduit A.Object m A.Value rowValue = CL.mapM (\v -> case M.lookup "value" v of (Just o) -> return o - _ -> resourceThrow $ CouchInternalError $ BS8.pack + _ -> throw $ CouchInternalError $ BS8.pack ("View row does not contain value: " ++ show v)) ----------------------------------------------------------------------------- @@ -344,20 +344,20 @@ -- Internal view parser ----------------------------------------------------------------------------- -conduitCouchView :: ResourceIO m => Conduit B.ByteString m A.Object +conduitCouchView :: MonadResource m => Conduit B.ByteString m A.Object conduitCouchView = sequenceSink () $ \() -> do b <- CA.sinkParser viewStart if b then return $ StartConduit viewLoop else return Stop -viewLoop :: ResourceIO m => Conduit B.ByteString m A.Object +viewLoop :: MonadResource m => Conduit B.ByteString m A.Object viewLoop = sequenceSink False $ \isLast -> if isLast then return Stop else do v <- CA.sinkParser (A.json <?> "json object") vobj <- case v of (A.Object o) -> return o - _ -> lift $ resourceThrow $ + _ -> throw $ CouchInternalError "view entry is not an object" res <- CA.sinkParser (commaOrClose <?> "comma or close") case res of
test/Database/CouchDB/Conduit/Test/Base.hs view
@@ -12,8 +12,8 @@ import Control.Monad.IO.Class (liftIO) import qualified Data.ByteString as B ---import Data.Conduit ---import qualified Data.Conduit.List as CL +import Data.Conduit (($$)) +import qualified Data.Conduit.List as CL import qualified Network.HTTP.Conduit as H import qualified Network.HTTP.Types as HT @@ -24,20 +24,39 @@ tests :: Test tests = mutuallyExclusive $ testGroup "Base" [ - testCase "Just connect" case_justConnect, - testCase "Put DB" case_dbPut + testCase "Just HTTP" caseJustHttp, + testCase "Just HTTP IO" caseJustHttpIO, + testCase "Just connect" caseJustConnect, + testCase "Put and delete DB" caseDbPut ] +-- testCase "Put DB" case_dbPut +caseJustHttp :: Assertion +caseJustHttp = do + request <- H.parseUrl "http://google.com/" + r <- H.withManager $ \manager -> do + H.Response _ _ _ bsrc <- H.http request manager + bsrc $$ CL.consume + print r + +caseJustHttpIO :: Assertion +caseJustHttpIO = do + request <- H.parseUrl "http://google.com/" + H.withManager $ \manager -> do + H.Response _ _ _ bsrc <- H.http request manager + r <- bsrc $$ CL.consume + liftIO $ print r + -- | Just connect -case_justConnect :: Assertion -case_justConnect = runCouch def $ do - H.Response (HT.Status sc _) _h _bsrc <- couch HT.methodGet "" [] [] +caseJustConnect :: Assertion +caseJustConnect = runCouch def $ do + H.Response (HT.Status sc _) _ _h _bsrc <- couch HT.methodGet "" [] [] (H.RequestBodyBS B.empty) protect' liftIO $ sc @=? 200 -- | Put and delete -case_dbPut :: Assertion -case_dbPut = runCouch def {couchLogin = login, +caseDbPut :: Assertion +caseDbPut = runCouch def {couchLogin = login, couchPass=pass} $ do couchPutDB_ "cdbc_dbputdel" couchDeleteDB "cdbc_dbputdel"
test/Database/CouchDB/Conduit/Test/Explicit.hs view
@@ -15,15 +15,15 @@ import Data.ByteString (ByteString) import Data.Aeson -import Data.ByteString.UTF8 (fromString) +import Data.String.Conversions ((<>), cs) import Database.CouchDB.Conduit import Database.CouchDB.Conduit.Explicit tests :: Test tests = mutuallyExclusive $ testGroup "Explicit" [ - testCase "Just put-get-delete" case_justPutGet, - testCase "Mass flow" case_massFlow, - testCase "Mass Iter" case_massIter + testCase "Just put-get-delete" caseJustPutGet, + testCase "Mass flow" caseMassFlow, + testCase "Mass Iter" caseMassIter ] data TestDoc = TestDoc { kind :: String, intV :: Int, strV :: String } @@ -36,8 +36,8 @@ instance ToJSON TestDoc where toJSON (TestDoc k i s) = object ["kind" .= k, "intV" .= i, "strV" .= s] -case_justPutGet :: Assertion -case_justPutGet = bracket_ +caseJustPutGet :: Assertion +caseJustPutGet = bracket_ setup teardown $ runCouch conn $ do rev <- couchPut dbName "doc-just" "" [] $ TestDoc "doc" 1 "1" @@ -46,25 +46,25 @@ liftIO $ rev' @=? rev'' couchDelete dbName "doc-just" rev'' -case_massFlow :: Assertion -case_massFlow = bracket_ +caseMassFlow :: Assertion +caseMassFlow = bracket_ setup teardown $ runCouch conn $ do revs <- mapM (\n -> couchPut dbName (docn n) "" [] $ TestDoc "doc" n $ show n ) [1..100] liftIO $ length revs @=? 100 - revs' <- mapM (\n -> couchRev dbName $ docn n) [1..100] + revs' <- mapM (couchRev dbName . docn) [1..100] liftIO $ revs @=? revs' liftIO $ length revs' @=? 100 mapM_ (\(n,r) -> couchDelete dbName (docn n) r) $ zip [1..100] revs' where - docn n = fromString $ "doc-" ++ show (n :: Int) + docn n = cs $ "doc-" <> show (n :: Int) -case_massIter :: Assertion -case_massIter = bracket_ +caseMassIter :: Assertion +caseMassIter = bracket_ setup teardown $ runCouch conn $ mapM_ (\n -> do @@ -79,7 +79,7 @@ couchDelete dbName (docn n) rev'' ) [1..100] where - docn n = fromString $ "doc-" ++ show (n :: Int) + docn n = cs $ "doc-" <> show (n :: Int) setup :: IO () setup = setupDB dbName
test/Database/CouchDB/Conduit/Test/Generic.hs view
@@ -15,22 +15,22 @@ import Data.ByteString (ByteString) import Data.Generics (Data, Typeable) -import Data.ByteString.UTF8 (fromString) +import Data.String.Conversions (cs, (<>)) import Database.CouchDB.Conduit import Database.CouchDB.Conduit.Generic tests :: Test tests = mutuallyExclusive $ testGroup "Generic" [ - testCase "Just put-get-delete" case_justPutGet, --- testCase "Mass flow" case_massFlow, - testCase "Mass Iter" case_massIter + testCase "Just put-get-delete" caseJustPutGet, + testCase "Mass flow" caseMassFlow, + testCase "Mass Iter" caseMassIter ] data TestDoc = TestDoc { kind :: String, intV :: Int, strV :: String } deriving (Show, Eq, Data, Typeable) -case_justPutGet :: Assertion -case_justPutGet = bracket_ +caseJustPutGet :: Assertion +caseJustPutGet = bracket_ setup teardown $ runCouch conn $ do rev <- couchPut dbName "doc-just" "" [] $ TestDoc "doc" 1 "1" @@ -39,25 +39,25 @@ liftIO $ rev' @=? rev'' couchDelete dbName "doc-just" rev'' -case_massFlow :: Assertion -case_massFlow = bracket_ +caseMassFlow :: Assertion +caseMassFlow = bracket_ setup teardown $ runCouch conn $ do revs <- mapM (\n -> couchPut dbName (docn n) "" [] $ TestDoc "doc" n $ show n ) [1..100] liftIO $ length revs @=? 100 - revs' <- mapM (\n -> couchRev dbName $ docn n) [1..100] + revs' <- mapM (couchRev dbName . docn) [1..100] liftIO $ revs @=? revs' liftIO $ length revs' @=? 100 mapM_ (\(n,r) -> couchDelete dbName (docn n) r) $ zip [1..100] revs' where - docn n = fromString $ "doc-" ++ show (n :: Int) + docn n = cs $ "doc-" <> show (n :: Int) -case_massIter :: Assertion -case_massIter = bracket_ +caseMassIter :: Assertion +caseMassIter = bracket_ setup teardown $ runCouch conn $ mapM_ (\n -> do @@ -72,7 +72,7 @@ couchDelete dbName (docn n) rev'' ) [1..100] where - docn n = fromString $ "doc-" ++ show (n :: Int) + docn n = cs $ "doc-" <> show (n :: Int) setup :: IO () setup = setupDB dbName
test/Database/CouchDB/Conduit/Test/View.hs view
@@ -15,7 +15,7 @@ import Control.Applicative ((<$>), (<*>), empty) import qualified Data.ByteString as B -import Data.ByteString.UTF8 (fromString) +import Data.String.Conversions ((<>), cs) import Data.Aeson ((.:), (.=)) import qualified Data.Aeson as A --import qualified Data.Aeson.Generic as AG @@ -131,4 +131,4 @@ doc n = T "doc" n $ show n docName :: Int -> B.ByteString -docName n = fromString $ "doc" ++ show n +docName n = cs $ "doc" <> show n