packages feed

hasql-dynamic-statements 0.1.0.2 → 0.2

raw patch · 6 files changed

+87/−29 lines, 6 filesdep +QuickCheckdep +hasql-dynamic-statementsdep +hasql-implicitsdep −data-defaultdep ~hasql

Dependencies added: QuickCheck, hasql-dynamic-statements, hasql-implicits, quickcheck-instances, rerebase, tasty, tasty-hunit, tasty-quickcheck

Dependencies removed: data-default

Dependency ranges changed: hasql

Files

hasql-dynamic-statements.cabal view
@@ -1,5 +1,5 @@ name: hasql-dynamic-statements-version: 0.1.0.2+version: 0.2 synopsis: Toolkit for constructing Hasql statements dynamically description:   This library introduces into the Hasql ecosystem a new abstraction named Snippet,@@ -36,6 +36,22 @@     base >=4.12 && <5,     bytestring >=0.10 && <0.11,     containers >=0.6 && <0.7,-    data-default >=0.7 && <0.8,-    hasql >=1.3.0.5 && <1.4,+    hasql >=1.4 && <1.5,+    hasql-implicits >=0.1 && <0.2,     ptr >=0.16.6 && <0.17++test-suite test+  type: exitcode-stdio-1.0+  hs-source-dirs: test+  main-is: Main.hs+  default-extensions: Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeApplications, TypeFamilies, TypeOperators, UnboxedTuples+  default-language: Haskell2010+  build-depends:+    hasql,+    hasql-dynamic-statements,+    QuickCheck >=2.8.1 && <3,+    quickcheck-instances >=0.3.11 && <0.4,+    rerebase <2,+    tasty >=0.12 && <2,+    tasty-hunit >=0.9 && <0.11,+    tasty-quickcheck >=0.9 && <0.11
library/Hasql/DynamicStatements/Prelude.hs view
@@ -80,7 +80,3 @@ -- bytestring ------------------------- import Data.ByteString as Exports (ByteString)---- data-default---------------------------import Data.Default as Exports
library/Hasql/DynamicStatements/Snippet.hs view
@@ -2,9 +2,7 @@ (   Snippet,   param,-  nullableParam,   encoderAndParam,-  encoderAndNullableParam, ) where 
library/Hasql/DynamicStatements/Snippet/Defs.hs view
@@ -2,6 +2,7 @@  import Hasql.DynamicStatements.Prelude import qualified Hasql.Encoders as Encoders+import qualified Hasql.Implicits.Encoders as Encoders   {-|@@ -48,26 +49,11 @@ {-| Parameter encoded using an implicitly derived encoder from the type. -}-param :: Default (Encoders.Value param) => param -> Snippet-param = encoderAndParam def--{-|-Nullable parameter encoded using an implicitly derived encoder from the type.--}-nullableParam :: Default (Encoders.Value param) => Maybe param -> Snippet-nullableParam = encoderAndNullableParam def+param :: Encoders.DefaultParamEncoder param => param -> Snippet+param = encoderAndParam Encoders.defaultParam  {-| Parameter with an explicitly defined encoder. -}-encoderAndParam :: Encoders.Value param -> param -> Snippet-encoderAndParam = paramsEncoderAndParam . Encoders.param--{-|-Nullable parameter with an explicitly defined encoder.--}-encoderAndNullableParam :: Encoders.Value param -> Maybe param -> Snippet-encoderAndNullableParam =  paramsEncoderAndParam . Encoders.nullableParam--paramsEncoderAndParam :: Encoders.Params param -> param -> Snippet-paramsEncoderAndParam encoder param = Snippet (pure (ParamSnippetChunk (param >$ encoder)))+encoderAndParam :: Encoders.NullableOrNot Encoders.Value param -> param -> Snippet+encoderAndParam encoder param = Snippet (pure (ParamSnippetChunk (param >$ Encoders.param encoder)))
library/Hasql/DynamicStatements/Statement.hs view
@@ -26,7 +26,7 @@     foldMap (mappend " from " . Snippet.'SnippetDefs.param') from <>     foldMap (mappend " for " . Snippet.'SnippetDefs.param') to <>     ")"-  decoder = Decoders.'Decoders.singleRow' (Decoders.'Decoders.column' Decoders.'Decoders.text')+  decoder = Decoders.'Decoders.singleRow' (Decoders.'Decoders.column' (Decoders.'Decoders.nonNullable' Decoders.'Decoders.text'))   in 'dynamicallyParameterized' snippet decoder @ 
+ test/Main.hs view
@@ -0,0 +1,62 @@+module Main where++import Prelude hiding (assert)+import Test.QuickCheck.Instances+import Test.Tasty+import Test.Tasty.Runners+import Test.Tasty.HUnit+import Test.Tasty.QuickCheck+import qualified Test.QuickCheck as QuickCheck+import qualified Hasql.Statement as Statement+import qualified Hasql.Encoders as Encoders+import qualified Hasql.Decoders as Decoders+import qualified Hasql.Session as Session+import qualified Hasql.Connection as Connection+import qualified Hasql.DynamicStatements.Snippet as Snippet+import qualified Hasql.DynamicStatements.Session as Session+++main =+  defaultMain tree++tree =+  testGroup "All tests"+  [+    testCase "Select substring" $ let+      sample string from to = let+        snippet =+          "select substring(" <> Snippet.param @Text string <>+          foldMap (mappend " from " . Snippet.param @Int32) from <>+          foldMap (mappend " for " . Snippet.param @Int32) to <>+          ")"+        decoder = Decoders.singleRow (Decoders.column (Decoders.nonNullable Decoders.text))+        in runSession (Session.dynamicallyParameterizedStatement snippet decoder)+      in do+        assertEqual "" (Right (Right "bc")) =<< sample "abcd" (Just 2) (Just 2)+        assertEqual "" (Right (Right "bcd")) =<< sample "abcd" (Just 2) (Just 3)+        assertEqual "" (Right (Right "abc")) =<< sample "abcd" Nothing (Just 3)+        assertEqual "" (Right (Right "bcd")) =<< sample "abcd" (Just 2) Nothing+  ]++runSession :: Session.Session a -> IO (Either Connection.ConnectionError (Either Session.QueryError a))+runSession = withConnection . Session.run++withConnection :: (Connection.Connection -> IO a) -> IO (Either Connection.ConnectionError a)+withConnection handler =+  runExceptT $ acquire >>= \connection -> use connection <* release connection+  where+    acquire =+      ExceptT $ Connection.acquire settings+      where+        settings =+          Connection.settings host port user password database+          where+            host = "localhost"+            port = 5432+            user = "postgres"+            password = ""+            database = "postgres"+    use connection =+      lift $ handler connection+    release connection =+      lift $ Connection.release connection