Update stylish haskell config; apply all; add CI config (#1299)
* Update config default; Copy non-defaults * Update .stylish-haskell config version to match pgrst * Apply stylish haskell to all files * CircleCI config * Remove redundant import. What is used from Network.HTTP.Types.Headers is also exported by Network.HTTP.Types. * Grouped imports * Show un-styled files on CircleCI failure * Fix styling imports * Apply adhoc standard correctly
This commit is contained in:
committed by
Steve Chávez
parent
16af470a99
commit
28b3d6cafd
@@ -77,7 +77,7 @@ jobs:
|
|||||||
sudo apt-get install -y postgresql-client
|
sudo apt-get install -y postgresql-client
|
||||||
stack setup
|
stack setup
|
||||||
rm -rf $(stack path --dist-dir) $(stack path --local-install-root)
|
rm -rf $(stack path --dist-dir) $(stack path --local-install-root)
|
||||||
stack install hlint packdeps cabal-install
|
stack install hlint packdeps cabal-install stylish-haskell
|
||||||
- run:
|
- run:
|
||||||
name: build src and tests
|
name: build src and tests
|
||||||
command: |
|
command: |
|
||||||
@@ -91,6 +91,9 @@ jobs:
|
|||||||
- run:
|
- run:
|
||||||
name: run linter
|
name: run linter
|
||||||
command: git ls-files | grep '\.l\?hs$' | xargs stack exec -- hlint -X QuasiQuotes -X NoPatternSynonyms "$@"
|
command: git ls-files | grep '\.l\?hs$' | xargs stack exec -- hlint -X QuasiQuotes -X NoPatternSynonyms "$@"
|
||||||
|
- run:
|
||||||
|
name: run styler
|
||||||
|
command: git ls-files | grep '\.l\?hs$' | xargs stack exec -- stylish-haskell -i && git diff-index --exit-code HEAD --
|
||||||
- save_cache:
|
- save_cache:
|
||||||
paths:
|
paths:
|
||||||
- "~/.stack"
|
- "~/.stack"
|
||||||
|
|||||||
+40
-5
@@ -39,9 +39,9 @@ steps:
|
|||||||
# - none: Do not perform any alignment.
|
# - none: Do not perform any alignment.
|
||||||
#
|
#
|
||||||
# Default: global.
|
# Default: global.
|
||||||
align: global
|
align: group
|
||||||
|
|
||||||
# Folowing options affect only import list alignment.
|
# The following options affect only import list alignment.
|
||||||
#
|
#
|
||||||
# List align has following options:
|
# List align has following options:
|
||||||
#
|
#
|
||||||
@@ -64,6 +64,25 @@ steps:
|
|||||||
# Default: after_alias
|
# Default: after_alias
|
||||||
list_align: after_alias
|
list_align: after_alias
|
||||||
|
|
||||||
|
# Right-pad the module names to align imports in a group:
|
||||||
|
#
|
||||||
|
# - true: a little more readable
|
||||||
|
#
|
||||||
|
# > import qualified Data.List as List (concat, foldl, foldr,
|
||||||
|
# > init, last, length)
|
||||||
|
# > import qualified Data.List.Extra as List (concat, foldl, foldr,
|
||||||
|
# > init, last, length)
|
||||||
|
#
|
||||||
|
# - false: diff-safe
|
||||||
|
#
|
||||||
|
# > import qualified Data.List as List (concat, foldl, foldr, init,
|
||||||
|
# > last, length)
|
||||||
|
# > import qualified Data.List.Extra as List (concat, foldl, foldr,
|
||||||
|
# > init, last, length)
|
||||||
|
#
|
||||||
|
# Default: true
|
||||||
|
pad_module_names: true
|
||||||
|
|
||||||
# Long list align style takes effect when import is too long. This is
|
# Long list align style takes effect when import is too long. This is
|
||||||
# determined by 'columns' setting.
|
# determined by 'columns' setting.
|
||||||
#
|
#
|
||||||
@@ -75,7 +94,7 @@ steps:
|
|||||||
# short enough to fit to single line. Otherwise it'll be multiline.
|
# short enough to fit to single line. Otherwise it'll be multiline.
|
||||||
#
|
#
|
||||||
# - multiline: One line per import list entry.
|
# - multiline: One line per import list entry.
|
||||||
# Type with contructor list acts like single import.
|
# Type with constructor list acts like single import.
|
||||||
#
|
#
|
||||||
# > import qualified Data.Map as M
|
# > import qualified Data.Map as M
|
||||||
# > ( empty
|
# > ( empty
|
||||||
@@ -109,7 +128,7 @@ steps:
|
|||||||
# Useful for 'file' and 'group' align settings.
|
# Useful for 'file' and 'group' align settings.
|
||||||
list_padding: 4
|
list_padding: 4
|
||||||
|
|
||||||
# Separate lists option affects formating of import list for type
|
# Separate lists option affects formatting of import list for type
|
||||||
# or class. The only difference is single space between type and list
|
# or class. The only difference is single space between type and list
|
||||||
# of constructors, selectors and class functions.
|
# of constructors, selectors and class functions.
|
||||||
#
|
#
|
||||||
@@ -126,6 +145,22 @@ steps:
|
|||||||
# Default: true
|
# Default: true
|
||||||
separate_lists: true
|
separate_lists: true
|
||||||
|
|
||||||
|
# Space surround option affects formatting of import lists on a single
|
||||||
|
# line. The only difference is single space after the initial
|
||||||
|
# parenthesis and a single space before the terminal parenthesis.
|
||||||
|
#
|
||||||
|
# - true: There is single space associated with the enclosing
|
||||||
|
# parenthesis.
|
||||||
|
#
|
||||||
|
# > import Data.Foo ( foo )
|
||||||
|
#
|
||||||
|
# - false: There is no space associated with the enclosing parenthesis
|
||||||
|
#
|
||||||
|
# > import Data.Foo (foo)
|
||||||
|
#
|
||||||
|
# Default: false
|
||||||
|
space_surround: false
|
||||||
|
|
||||||
# Language pragmas
|
# Language pragmas
|
||||||
- language_pragmas:
|
- language_pragmas:
|
||||||
# We can generate different styles of language pragma lists.
|
# We can generate different styles of language pragma lists.
|
||||||
@@ -142,7 +177,7 @@ steps:
|
|||||||
|
|
||||||
# Align affects alignment of closing pragma brackets.
|
# Align affects alignment of closing pragma brackets.
|
||||||
#
|
#
|
||||||
# - true: Brackets are aligned in same collumn.
|
# - true: Brackets are aligned in same column.
|
||||||
#
|
#
|
||||||
# - false: Brackets are not aligned together. There is only one space
|
# - false: Brackets are not aligned together. There is only one space
|
||||||
# between actual import and closing bracket.
|
# between actual import and closing bracket.
|
||||||
|
|||||||
+25
-24
@@ -2,39 +2,40 @@
|
|||||||
|
|
||||||
module Main where
|
module Main where
|
||||||
|
|
||||||
|
import qualified Data.ByteString as BS
|
||||||
|
import qualified Data.ByteString.Base64 as B64
|
||||||
|
import qualified Hasql.Pool as P
|
||||||
|
import qualified Hasql.Transaction.Sessions as HT
|
||||||
|
|
||||||
|
import Control.AutoUpdate (defaultUpdateSettings, mkAutoUpdate,
|
||||||
|
updateAction)
|
||||||
|
import Control.Retry (RetryStatus, capDelay,
|
||||||
|
exponentialBackoff, retrying,
|
||||||
|
rsPreviousDelay)
|
||||||
|
import Data.IORef (IORef, atomicWriteIORef, newIORef,
|
||||||
|
readIORef)
|
||||||
|
import Data.String (IsString (..))
|
||||||
|
import Data.Text (pack, replace, strip, stripPrefix)
|
||||||
|
import Data.Text.Encoding (decodeUtf8, encodeUtf8)
|
||||||
|
import Data.Text.IO (hPutStrLn, readFile)
|
||||||
|
import Data.Time.Clock (getCurrentTime)
|
||||||
|
import Network.Wai.Handler.Warp (defaultSettings, runSettings,
|
||||||
|
setHost, setPort, setServerName)
|
||||||
|
import System.IO (BufferMode (..), hSetBuffering)
|
||||||
|
|
||||||
import PostgREST.App (postgrest)
|
import PostgREST.App (postgrest)
|
||||||
import PostgREST.Config (AppConfig (..), configPoolTimeout',
|
import PostgREST.Config (AppConfig (..), configPoolTimeout',
|
||||||
prettyVersion, readOptions)
|
prettyVersion, readOptions)
|
||||||
import PostgREST.DbStructure (getDbStructure, getPgVersion)
|
import PostgREST.DbStructure (getDbStructure, getPgVersion)
|
||||||
import PostgREST.Error (errorPayload, checkIsFatal, PgError(PgError))
|
import PostgREST.Error (PgError (PgError), checkIsFatal,
|
||||||
|
errorPayload)
|
||||||
import PostgREST.OpenAPI (isMalformedProxyUri)
|
import PostgREST.OpenAPI (isMalformedProxyUri)
|
||||||
import PostgREST.Types (DbStructure, Schema, PgVersion(..), minimumPgVersion, ConnectionStatus(..))
|
import PostgREST.Types (ConnectionStatus (..), DbStructure,
|
||||||
|
PgVersion (..), Schema,
|
||||||
|
minimumPgVersion)
|
||||||
import Protolude hiding (hPutStrLn, replace)
|
import Protolude hiding (hPutStrLn, replace)
|
||||||
|
|
||||||
|
|
||||||
import Control.AutoUpdate (defaultUpdateSettings,
|
|
||||||
mkAutoUpdate, updateAction)
|
|
||||||
import Control.Retry (RetryStatus, capDelay,
|
|
||||||
exponentialBackoff,
|
|
||||||
retrying, rsPreviousDelay)
|
|
||||||
import qualified Data.ByteString as BS
|
|
||||||
import qualified Data.ByteString.Base64 as B64
|
|
||||||
import Data.IORef (IORef, atomicWriteIORef,
|
|
||||||
newIORef, readIORef)
|
|
||||||
import Data.String (IsString (..))
|
|
||||||
import Data.Text (pack, replace, stripPrefix, strip)
|
|
||||||
import Data.Text.Encoding (decodeUtf8, encodeUtf8)
|
|
||||||
import Data.Text.IO (hPutStrLn, readFile)
|
|
||||||
import Data.Time.Clock (getCurrentTime)
|
|
||||||
import qualified Hasql.Pool as P
|
|
||||||
import qualified Hasql.Transaction.Sessions as HT
|
|
||||||
import Network.Wai.Handler.Warp (defaultSettings,
|
|
||||||
runSettings, setHost,
|
|
||||||
setPort, setServerName)
|
|
||||||
import System.IO (BufferMode (..),
|
|
||||||
hSetBuffering)
|
|
||||||
|
|
||||||
#ifndef mingw32_HOST_OS
|
#ifndef mingw32_HOST_OS
|
||||||
import System.Posix.Signals
|
import System.Posix.Signals
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+21
-13
@@ -14,34 +14,42 @@ module PostgREST.ApiRequest (
|
|||||||
, userApiRequest
|
, userApiRequest
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Protolude
|
|
||||||
import qualified Data.Aeson as JSON
|
import qualified Data.Aeson as JSON
|
||||||
import Data.Aeson.Types (emptyObject, emptyArray)
|
|
||||||
import qualified Data.ByteString as BS
|
import qualified Data.ByteString as BS
|
||||||
import qualified Data.ByteString.Internal as BS (c2w)
|
import qualified Data.ByteString.Internal as BS (c2w)
|
||||||
import qualified Data.ByteString.Lazy as BL
|
import qualified Data.ByteString.Lazy as BL
|
||||||
|
import qualified Data.CaseInsensitive as CI
|
||||||
import qualified Data.Csv as CSV
|
import qualified Data.Csv as CSV
|
||||||
import qualified Data.List as L
|
|
||||||
import Data.List (lookup, last, partition)
|
|
||||||
import qualified Data.HashMap.Strict as M
|
import qualified Data.HashMap.Strict as M
|
||||||
|
import qualified Data.List as L
|
||||||
import qualified Data.Set as S
|
import qualified Data.Set as S
|
||||||
import Data.Maybe (fromJust)
|
|
||||||
import Control.Arrow ((***))
|
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
import qualified Data.Vector as V
|
import qualified Data.Vector as V
|
||||||
|
|
||||||
|
import Control.Arrow ((***))
|
||||||
|
import Data.Aeson.Types (emptyArray, emptyObject)
|
||||||
|
import Data.List (last, lookup, partition)
|
||||||
|
import Data.Maybe (fromJust)
|
||||||
|
import Data.Ranged.Ranges (Range (..), emptyRange,
|
||||||
|
rangeIntersection)
|
||||||
import Network.HTTP.Base (urlEncodeVars)
|
import Network.HTTP.Base (urlEncodeVars)
|
||||||
import Network.HTTP.Types.Header (hAuthorization, hCookie)
|
import Network.HTTP.Types.Header (hAuthorization, hCookie)
|
||||||
import Network.HTTP.Types.URI (parseSimpleQuery, parseQueryReplacePlus)
|
import Network.HTTP.Types.URI (parseQueryReplacePlus,
|
||||||
|
parseSimpleQuery)
|
||||||
import Network.Wai (Request (..))
|
import Network.Wai (Request (..))
|
||||||
import Network.Wai.Parse (parseHttpAccept)
|
import Network.Wai.Parse (parseHttpAccept)
|
||||||
import PostgREST.RangeQuery (NonnegRange, rangeRequested, restrictRange, rangeGeq, allRange, rangeLimit, rangeOffset)
|
|
||||||
import Data.Ranged.Boundaries
|
|
||||||
import PostgREST.Types
|
|
||||||
import PostgREST.Error (ApiRequestError(..))
|
|
||||||
import Data.Ranged.Ranges (Range(..), rangeIntersection, emptyRange)
|
|
||||||
import qualified Data.CaseInsensitive as CI
|
|
||||||
import Web.Cookie (parseCookiesText)
|
import Web.Cookie (parseCookiesText)
|
||||||
|
|
||||||
|
|
||||||
|
import Data.Ranged.Boundaries
|
||||||
|
|
||||||
|
import PostgREST.Error (ApiRequestError (..))
|
||||||
|
import PostgREST.RangeQuery (NonnegRange, allRange, rangeGeq,
|
||||||
|
rangeLimit, rangeOffset, rangeRequested,
|
||||||
|
restrictRange)
|
||||||
|
import PostgREST.Types
|
||||||
|
import Protolude
|
||||||
|
|
||||||
type RequestBody = BL.ByteString
|
type RequestBody = BL.ByteString
|
||||||
|
|
||||||
-- | Types of things a user wants to do to tables/views/procs
|
-- | Types of things a user wants to do to tables/views/procs
|
||||||
|
|||||||
+32
-40
@@ -1,64 +1,56 @@
|
|||||||
{-# LANGUAGE FlexibleContexts #-}
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
{-# LANGUAGE ScopedTypeVariables #-}
|
|
||||||
{-# LANGUAGE NamedFieldPuns #-}
|
{-# LANGUAGE NamedFieldPuns #-}
|
||||||
|
{-# LANGUAGE ScopedTypeVariables #-}
|
||||||
|
|
||||||
module PostgREST.App (
|
module PostgREST.App (
|
||||||
postgrest
|
postgrest
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Control.Applicative
|
|
||||||
import Data.Aeson as JSON
|
|
||||||
import qualified Data.ByteString.Char8 as BS
|
import qualified Data.ByteString.Char8 as BS
|
||||||
import Data.Maybe
|
import qualified Data.HashMap.Strict as M
|
||||||
import Data.IORef (IORef, readIORef)
|
|
||||||
import Data.Time.Clock (UTCTime)
|
|
||||||
import qualified Data.Set as S
|
import qualified Data.Set as S
|
||||||
|
|
||||||
import qualified Hasql.Pool as P
|
import qualified Hasql.Pool as P
|
||||||
|
import qualified Hasql.Transaction as H
|
||||||
import qualified Hasql.Transaction as HT
|
import qualified Hasql.Transaction as HT
|
||||||
import qualified Hasql.Transaction.Sessions as HT
|
import qualified Hasql.Transaction.Sessions as HT
|
||||||
|
|
||||||
import Network.HTTP.Types.Header
|
import Data.Aeson as JSON
|
||||||
import Network.HTTP.Types.Status
|
import Data.Function (id)
|
||||||
|
import Data.IORef (IORef, readIORef)
|
||||||
|
import Data.Time.Clock (UTCTime)
|
||||||
import Network.HTTP.Types.URI (renderSimpleQuery)
|
import Network.HTTP.Types.URI (renderSimpleQuery)
|
||||||
import Network.Wai
|
|
||||||
import Network.Wai.Middleware.RequestLogger (logStdout)
|
import Network.Wai.Middleware.RequestLogger (logStdout)
|
||||||
|
|
||||||
import qualified Hasql.Transaction as H
|
import Control.Applicative
|
||||||
|
import Data.Maybe
|
||||||
|
import Network.HTTP.Types.Header
|
||||||
|
import Network.HTTP.Types.Status
|
||||||
|
import Network.Wai
|
||||||
|
|
||||||
import qualified Data.HashMap.Strict as M
|
import PostgREST.ApiRequest (Action (..), ApiRequest (..),
|
||||||
|
ContentType (..),
|
||||||
import PostgREST.ApiRequest ( ApiRequest(..), ContentType(..)
|
PreferRepresentation (..),
|
||||||
, Action(..), Target(..)
|
Target (..), mutuallyAgreeable,
|
||||||
, PreferRepresentation (..)
|
userApiRequest)
|
||||||
, mutuallyAgreeable
|
import PostgREST.Auth (containsRole, jwtClaims,
|
||||||
, userApiRequest
|
parseSecret)
|
||||||
)
|
|
||||||
import PostgREST.Auth (jwtClaims, containsRole, parseSecret)
|
|
||||||
import PostgREST.Config (AppConfig (..))
|
import PostgREST.Config (AppConfig (..))
|
||||||
|
import PostgREST.DbRequestBuilder (fieldNames, mutateRequest,
|
||||||
|
readRequest)
|
||||||
import PostgREST.DbStructure
|
import PostgREST.DbStructure
|
||||||
import PostgREST.DbRequestBuilder( readRequest
|
import PostgREST.Error (PgError (..), SimpleError (..),
|
||||||
, mutateRequest
|
errorResponseFor)
|
||||||
, fieldNames
|
|
||||||
)
|
|
||||||
import PostgREST.Error ( SimpleError(..), PgError(..)
|
|
||||||
, errorResponseFor
|
|
||||||
)
|
|
||||||
import PostgREST.RangeQuery (allRange, rangeOffset)
|
|
||||||
import PostgREST.Middleware
|
import PostgREST.Middleware
|
||||||
import PostgREST.QueryBuilder ( callProc
|
|
||||||
, requestToQuery
|
|
||||||
, requestToCountQuery
|
|
||||||
, createReadStatement
|
|
||||||
, createWriteStatement
|
|
||||||
, ResultsWithCount
|
|
||||||
)
|
|
||||||
import PostgREST.Parsers (pRequestColumns)
|
|
||||||
import PostgREST.Types
|
|
||||||
import PostgREST.OpenAPI
|
import PostgREST.OpenAPI
|
||||||
|
import PostgREST.Parsers (pRequestColumns)
|
||||||
import Data.Function (id)
|
import PostgREST.QueryBuilder (ResultsWithCount, callProc,
|
||||||
import Protolude hiding (intercalate, Proxy)
|
createReadStatement,
|
||||||
|
createWriteStatement,
|
||||||
|
requestToCountQuery,
|
||||||
|
requestToQuery)
|
||||||
|
import PostgREST.RangeQuery (allRange, rangeOffset)
|
||||||
|
import PostgREST.Types
|
||||||
|
import Protolude hiding (Proxy, intercalate)
|
||||||
|
|
||||||
postgrest :: AppConfig -> IORef (Maybe DbStructure) -> P.Pool -> IO UTCTime -> IO () -> Application
|
postgrest :: AppConfig -> IORef (Maybe DbStructure) -> P.Pool -> IO UTCTime -> IO () -> Application
|
||||||
postgrest conf refDbStructure pool getTime worker =
|
postgrest conf refDbStructure pool getTime worker =
|
||||||
|
|||||||
@@ -19,18 +19,20 @@ module PostgREST.Auth (
|
|||||||
, parseSecret
|
, parseSecret
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Control.Lens.Operators
|
import qualified Crypto.JOSE.Types as JOSE.Types
|
||||||
import Control.Lens (set)
|
|
||||||
import qualified Data.Aeson as JSON
|
import qualified Data.Aeson as JSON
|
||||||
import qualified Data.HashMap.Strict as M
|
import qualified Data.HashMap.Strict as M
|
||||||
import Data.Time.Clock (UTCTime)
|
|
||||||
import Data.Vector as V
|
import Data.Vector as V
|
||||||
|
|
||||||
|
import Control.Lens (set)
|
||||||
|
import Data.Time.Clock (UTCTime)
|
||||||
|
|
||||||
|
import Control.Lens.Operators
|
||||||
|
import Crypto.JWT
|
||||||
|
|
||||||
import PostgREST.Types
|
import PostgREST.Types
|
||||||
import Protolude
|
import Protolude
|
||||||
|
|
||||||
import qualified Crypto.JOSE.Types as JOSE.Types
|
|
||||||
import Crypto.JWT
|
|
||||||
|
|
||||||
{-|
|
{-|
|
||||||
Possible situations encountered with client JWTs
|
Possible situations encountered with client JWTs
|
||||||
-}
|
-}
|
||||||
|
|||||||
+21
-18
@@ -12,7 +12,8 @@ turned in configurable behaviour if needed.
|
|||||||
|
|
||||||
Other hardcoded options such as the minimum version number also belong here.
|
Other hardcoded options such as the minimum version number also belong here.
|
||||||
-}
|
-}
|
||||||
{-# LANGUAGE LambdaCase, TemplateHaskell #-}
|
{-# LANGUAGE LambdaCase #-}
|
||||||
|
{-# LANGUAGE TemplateHaskell #-}
|
||||||
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
|
{-# OPTIONS_GHC -fno-warn-type-defaults #-}
|
||||||
|
|
||||||
module PostgREST.Config ( prettyVersion
|
module PostgREST.Config ( prettyVersion
|
||||||
@@ -24,42 +25,44 @@ module PostgREST.Config ( prettyVersion
|
|||||||
)
|
)
|
||||||
where
|
where
|
||||||
|
|
||||||
import Control.Applicative
|
|
||||||
import Control.Monad (fail)
|
|
||||||
import Control.Lens (preview)
|
|
||||||
import Crypto.JWT (StringOrURI,
|
|
||||||
stringOrUri)
|
|
||||||
import qualified Data.ByteString as B
|
import qualified Data.ByteString as B
|
||||||
import qualified Data.ByteString.Char8 as BS
|
import qualified Data.ByteString.Char8 as BS
|
||||||
import qualified Data.CaseInsensitive as CI
|
import qualified Data.CaseInsensitive as CI
|
||||||
import qualified Data.Configurator as C
|
import qualified Data.Configurator as C
|
||||||
import qualified Data.Configurator.Parser as C
|
import qualified Data.Configurator.Parser as C
|
||||||
import Data.Configurator.Types as C
|
import Data.Configurator.Types as C
|
||||||
|
import qualified Text.PrettyPrint.ANSI.Leijen as L
|
||||||
|
|
||||||
|
import Control.Lens (preview)
|
||||||
|
import Control.Monad (fail)
|
||||||
|
import Crypto.JWT (StringOrURI, stringOrUri)
|
||||||
import Data.List (lookup)
|
import Data.List (lookup)
|
||||||
import Data.Monoid
|
|
||||||
import Data.Scientific (floatingOrInteger)
|
import Data.Scientific (floatingOrInteger)
|
||||||
import Data.String (String)
|
import Data.String (String)
|
||||||
import Data.Text (dropWhileEnd, dropEnd,
|
import Data.Text (dropEnd, dropWhileEnd,
|
||||||
intercalate, lines,
|
intercalate, lines, splitOn,
|
||||||
strip, take, splitOn)
|
strip, take)
|
||||||
import Data.Text.Encoding (encodeUtf8)
|
import Data.Text.Encoding (encodeUtf8)
|
||||||
import Data.Text.IO (hPutStrLn)
|
import Data.Text.IO (hPutStrLn)
|
||||||
import Data.Version (versionBranch)
|
import Data.Version (versionBranch)
|
||||||
import Development.GitRev (gitHash)
|
import Development.GitRev (gitHash)
|
||||||
import Network.Wai
|
|
||||||
import Network.Wai.Middleware.Cors (CorsResourcePolicy (..))
|
import Network.Wai.Middleware.Cors (CorsResourcePolicy (..))
|
||||||
import Options.Applicative hiding (str)
|
|
||||||
import Paths_postgrest (version)
|
import Paths_postgrest (version)
|
||||||
import PostgREST.Parsers (pRoleClaimKey)
|
|
||||||
import PostgREST.Types (JSPath, JSPathExp(..))
|
|
||||||
import PostgREST.Error (ApiRequestError(..))
|
|
||||||
import Protolude hiding (hPutStrLn, take,
|
|
||||||
intercalate, (<>))
|
|
||||||
import System.IO (hPrint)
|
import System.IO (hPrint)
|
||||||
import System.IO.Error (IOError)
|
import System.IO.Error (IOError)
|
||||||
|
|
||||||
|
import Control.Applicative
|
||||||
|
import Data.Monoid
|
||||||
|
import Network.Wai
|
||||||
|
import Options.Applicative hiding (str)
|
||||||
import Text.Heredoc
|
import Text.Heredoc
|
||||||
import Text.PrettyPrint.ANSI.Leijen hiding ((<$>), (<>))
|
import Text.PrettyPrint.ANSI.Leijen hiding ((<$>), (<>))
|
||||||
import qualified Text.PrettyPrint.ANSI.Leijen as L
|
|
||||||
|
import PostgREST.Error (ApiRequestError (..))
|
||||||
|
import PostgREST.Parsers (pRoleClaimKey)
|
||||||
|
import PostgREST.Types (JSPath, JSPathExp (..))
|
||||||
|
import Protolude hiding (hPutStrLn, intercalate, take, (<>))
|
||||||
|
|
||||||
|
|
||||||
-- | Config file settings for the server
|
-- | Config file settings for the server
|
||||||
data AppConfig = AppConfig {
|
data AppConfig = AppConfig {
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ This module is in charge of building an intermediate representation(ReadRequest,
|
|||||||
|
|
||||||
A query tree is built in case of resource embedding. By inferring the relationship between tables, join conditions are added for every embedded resource.
|
A query tree is built in case of resource embedding. By inferring the relationship between tables, join conditions are added for every embedded resource.
|
||||||
-}
|
-}
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
|
||||||
{-# LANGUAGE DuplicateRecordFields #-}
|
{-# LANGUAGE DuplicateRecordFields #-}
|
||||||
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
{-# LANGUAGE LambdaCase #-}
|
{-# LANGUAGE LambdaCase #-}
|
||||||
{-# LANGUAGE MultiWayIf #-}
|
{-# LANGUAGE MultiWayIf #-}
|
||||||
{-# LANGUAGE NamedFieldPuns #-}
|
{-# LANGUAGE NamedFieldPuns #-}
|
||||||
@@ -18,37 +18,34 @@ module PostgREST.DbRequestBuilder (
|
|||||||
, fieldNames
|
, fieldNames
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Control.Applicative
|
import qualified Data.ByteString.Char8 as BS
|
||||||
|
import qualified Data.HashMap.Strict as M
|
||||||
|
import qualified Data.Set as S
|
||||||
|
|
||||||
import Control.Arrow ((***))
|
import Control.Arrow ((***))
|
||||||
import Control.Lens.Getter (view)
|
import Control.Lens.Getter (view)
|
||||||
import Control.Lens.Tuple (_1)
|
import Control.Lens.Tuple (_1)
|
||||||
import qualified Data.ByteString.Char8 as BS
|
import Data.Either.Combinators (mapLeft)
|
||||||
|
import Data.Foldable (foldr1)
|
||||||
import Data.List (delete)
|
import Data.List (delete)
|
||||||
import Data.Maybe (fromJust)
|
import Data.Maybe (fromJust)
|
||||||
import qualified Data.Set as S
|
|
||||||
import Data.Text (isInfixOf)
|
import Data.Text (isInfixOf)
|
||||||
import Data.Tree
|
|
||||||
import Data.Either.Combinators (mapLeft)
|
|
||||||
|
|
||||||
import Network.Wai
|
|
||||||
|
|
||||||
import Data.Foldable (foldr1)
|
|
||||||
import qualified Data.HashMap.Strict as M
|
|
||||||
|
|
||||||
import PostgREST.ApiRequest ( ApiRequest(..)
|
|
||||||
, PreferRepresentation(..)
|
|
||||||
, Action(..), Target(..)
|
|
||||||
, PreferRepresentation (..)
|
|
||||||
)
|
|
||||||
import PostgREST.Error (ApiRequestError(..), errorResponseFor)
|
|
||||||
import PostgREST.Parsers
|
|
||||||
import PostgREST.RangeQuery (NonnegRange, restrictRange, allRange)
|
|
||||||
import PostgREST.Types
|
|
||||||
|
|
||||||
import Protolude hiding (from)
|
|
||||||
import Text.Regex.TDFA ((=~))
|
import Text.Regex.TDFA ((=~))
|
||||||
import Unsafe (unsafeHead)
|
import Unsafe (unsafeHead)
|
||||||
|
|
||||||
|
import Control.Applicative
|
||||||
|
import Data.Tree
|
||||||
|
import Network.Wai
|
||||||
|
|
||||||
|
import PostgREST.ApiRequest (Action (..), ApiRequest (..),
|
||||||
|
PreferRepresentation (..),
|
||||||
|
PreferRepresentation (..), Target (..))
|
||||||
|
import PostgREST.Error (ApiRequestError (..), errorResponseFor)
|
||||||
|
import PostgREST.Parsers
|
||||||
|
import PostgREST.RangeQuery (NonnegRange, allRange, restrictRange)
|
||||||
|
import PostgREST.Types
|
||||||
|
import Protolude hiding (from)
|
||||||
|
|
||||||
readRequest :: Maybe Integer -> [Relation] -> Maybe ProcDescription -> ApiRequest -> Either Response ReadRequest
|
readRequest :: Maybe Integer -> [Relation] -> Maybe ProcDescription -> ApiRequest -> Either Response ReadRequest
|
||||||
readRequest maxRows allRels proc apiRequest =
|
readRequest maxRows allRels proc apiRequest =
|
||||||
mapLeft errorResponseFor $
|
mapLeft errorResponseFor $
|
||||||
|
|||||||
@@ -10,10 +10,10 @@ These queries are executed once at startup or when PostgREST is reloaded.
|
|||||||
-}
|
-}
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
{-# LANGUAGE MultiParamTypeClasses #-}
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||||
|
{-# LANGUAGE NamedFieldPuns #-}
|
||||||
{-# LANGUAGE QuasiQuotes #-}
|
{-# LANGUAGE QuasiQuotes #-}
|
||||||
{-# LANGUAGE ScopedTypeVariables #-}
|
{-# LANGUAGE ScopedTypeVariables #-}
|
||||||
{-# LANGUAGE TypeSynonymInstances #-}
|
{-# LANGUAGE TypeSynonymInstances #-}
|
||||||
{-# LANGUAGE NamedFieldPuns #-}
|
|
||||||
module PostgREST.DbStructure (
|
module PostgREST.DbStructure (
|
||||||
getDbStructure
|
getDbStructure
|
||||||
, accessibleTables
|
, accessibleTables
|
||||||
@@ -22,27 +22,27 @@ module PostgREST.DbStructure (
|
|||||||
, getPgVersion
|
, getPgVersion
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import qualified Hasql.Decoders as HD
|
|
||||||
import qualified Hasql.Encoders as HE
|
|
||||||
import qualified Hasql.Statement as H
|
|
||||||
|
|
||||||
import Control.Applicative
|
|
||||||
import qualified Data.HashMap.Strict as M
|
import qualified Data.HashMap.Strict as M
|
||||||
import qualified Data.List as L
|
import qualified Data.List as L
|
||||||
import Data.Set as S (fromList)
|
|
||||||
import Data.Text (split, strip,
|
|
||||||
breakOn, dropAround,
|
|
||||||
splitOn)
|
|
||||||
import qualified Data.Text as T
|
import qualified Data.Text as T
|
||||||
|
import qualified Hasql.Decoders as HD
|
||||||
|
import qualified Hasql.Encoders as HE
|
||||||
import qualified Hasql.Session as H
|
import qualified Hasql.Session as H
|
||||||
|
import qualified Hasql.Statement as H
|
||||||
import qualified Hasql.Transaction as HT
|
import qualified Hasql.Transaction as HT
|
||||||
import PostgREST.Types
|
|
||||||
import Text.InterpolatedString.Perl6 (q, qc)
|
|
||||||
|
|
||||||
|
import Data.Set as S (fromList)
|
||||||
|
import Data.Text (breakOn, dropAround, split,
|
||||||
|
splitOn, strip)
|
||||||
import GHC.Exts (groupWith)
|
import GHC.Exts (groupWith)
|
||||||
import Protolude
|
import Text.InterpolatedString.Perl6 (q, qc)
|
||||||
import Unsafe (unsafeHead)
|
import Unsafe (unsafeHead)
|
||||||
|
|
||||||
|
import Control.Applicative
|
||||||
|
|
||||||
|
import PostgREST.Types
|
||||||
|
import Protolude
|
||||||
|
|
||||||
getDbStructure :: Schema -> PgVersion -> HT.Transaction DbStructure
|
getDbStructure :: Schema -> PgVersion -> HT.Transaction DbStructure
|
||||||
getDbStructure schema pgVer = do
|
getDbStructure schema pgVer = do
|
||||||
HT.sql "set local schema ''" -- for getting the fully qualified name(schema.name) of every db object
|
HT.sql "set local schema ''" -- for getting the fully qualified name(schema.name) of every db object
|
||||||
|
|||||||
@@ -15,18 +15,21 @@ module PostgREST.Error (
|
|||||||
, checkIsFatal
|
, checkIsFatal
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Protolude
|
|
||||||
import Data.Aeson ((.=))
|
|
||||||
import qualified Data.Aeson as JSON
|
import qualified Data.Aeson as JSON
|
||||||
import Data.Text (unwords)
|
|
||||||
import qualified Hasql.Pool as P
|
import qualified Hasql.Pool as P
|
||||||
import qualified Hasql.Session as H
|
import qualified Hasql.Session as H
|
||||||
import Network.HTTP.Types.Header
|
|
||||||
import qualified Network.HTTP.Types.Status as HT
|
import qualified Network.HTTP.Types.Status as HT
|
||||||
|
|
||||||
|
import Data.Aeson ((.=))
|
||||||
|
import Data.Text (unwords)
|
||||||
import Network.Wai (Response, responseLBS)
|
import Network.Wai (Response, responseLBS)
|
||||||
import PostgREST.Types
|
|
||||||
import Text.Read (readMaybe)
|
import Text.Read (readMaybe)
|
||||||
|
|
||||||
|
import Network.HTTP.Types.Header
|
||||||
|
|
||||||
|
import PostgREST.Types
|
||||||
|
import Protolude
|
||||||
|
|
||||||
|
|
||||||
class (JSON.ToJSON a) => PgrstError a where
|
class (JSON.ToJSON a) => PgrstError a where
|
||||||
status :: a -> HT.Status
|
status :: a -> HT.Status
|
||||||
|
|||||||
@@ -3,12 +3,11 @@ Module : PostgREST.Middleware
|
|||||||
Description : Sets the PostgreSQL GUCs, role, search_path and pre-request function. Validates JWT.
|
Description : Sets the PostgreSQL GUCs, role, search_path and pre-request function. Validates JWT.
|
||||||
-}
|
-}
|
||||||
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
||||||
{-# LANGUAGE ScopedTypeVariables #-}
|
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
{-# LANGUAGE ScopedTypeVariables #-}
|
||||||
|
|
||||||
module PostgREST.Middleware where
|
module PostgREST.Middleware where
|
||||||
|
|
||||||
import Crypto.JWT
|
|
||||||
import qualified Data.Aeson as JSON
|
import qualified Data.Aeson as JSON
|
||||||
import qualified Data.HashMap.Strict as M
|
import qualified Data.HashMap.Strict as M
|
||||||
import qualified Hasql.Transaction as H
|
import qualified Hasql.Transaction as H
|
||||||
@@ -18,12 +17,15 @@ import Network.Wai.Middleware.Cors (cors)
|
|||||||
import Network.Wai.Middleware.Gzip (def, gzip)
|
import Network.Wai.Middleware.Gzip (def, gzip)
|
||||||
import Network.Wai.Middleware.Static (only, staticPolicy)
|
import Network.Wai.Middleware.Static (only, staticPolicy)
|
||||||
|
|
||||||
|
import Crypto.JWT
|
||||||
|
|
||||||
import PostgREST.ApiRequest (ApiRequest (..))
|
import PostgREST.ApiRequest (ApiRequest (..))
|
||||||
import PostgREST.Auth (JWTAttempt (..))
|
import PostgREST.Auth (JWTAttempt (..))
|
||||||
import PostgREST.Config (AppConfig (..), corsPolicy)
|
import PostgREST.Config (AppConfig (..), corsPolicy)
|
||||||
import PostgREST.Error (errorResponseFor, SimpleError(JwtTokenMissing, JwtTokenInvalid))
|
import PostgREST.Error (SimpleError (JwtTokenInvalid, JwtTokenMissing),
|
||||||
import PostgREST.QueryBuilder (unquoted, pgFmtSetLocal, pgFmtSetLocalSearchPath)
|
errorResponseFor)
|
||||||
|
import PostgREST.QueryBuilder (pgFmtSetLocal, pgFmtSetLocalSearchPath,
|
||||||
|
unquoted)
|
||||||
import Protolude
|
import Protolude
|
||||||
|
|
||||||
runWithClaims :: AppConfig -> JWTAttempt ->
|
runWithClaims :: AppConfig -> JWTAttempt ->
|
||||||
|
|||||||
+14
-10
@@ -10,25 +10,29 @@ module PostgREST.OpenAPI (
|
|||||||
, pickProxy
|
, pickProxy
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
import qualified Data.Set as Set
|
||||||
|
|
||||||
import Control.Arrow ((&&&))
|
import Control.Arrow ((&&&))
|
||||||
import Control.Lens
|
|
||||||
import Data.Aeson (decode, encode)
|
import Data.Aeson (decode, encode)
|
||||||
import Data.HashMap.Strict.InsOrd (InsOrdHashMap, fromList)
|
import Data.HashMap.Strict.InsOrd (InsOrdHashMap, fromList)
|
||||||
import Data.Maybe (fromJust)
|
import Data.Maybe (fromJust)
|
||||||
import qualified Data.Set as Set
|
|
||||||
import Data.String (IsString (..))
|
import Data.String (IsString (..))
|
||||||
import Data.Text (unpack, pack, init, tail, toLower, intercalate, append, dropWhile, breakOn)
|
import Data.Text (append, breakOn, dropWhile, init,
|
||||||
import Network.URI (parseURI, isAbsoluteURI,
|
intercalate, pack, tail, toLower,
|
||||||
URI (..), URIAuth (..))
|
unpack)
|
||||||
|
import Network.URI (URI (..), URIAuth (..),
|
||||||
import Protolude hiding ((&), Proxy, get, intercalate, dropWhile)
|
isAbsoluteURI, parseURI)
|
||||||
|
|
||||||
|
import Control.Lens
|
||||||
import Data.Swagger
|
import Data.Swagger
|
||||||
|
|
||||||
import PostgREST.ApiRequest (ContentType (..))
|
import PostgREST.ApiRequest (ContentType (..))
|
||||||
import PostgREST.Config (prettyVersion, docsVersion)
|
import PostgREST.Config (docsVersion, prettyVersion)
|
||||||
import PostgREST.Types (Table(..), Column(..), PgArg(..), ForeignKey(..),
|
import PostgREST.Types (Column (..), ForeignKey (..), PgArg (..),
|
||||||
PrimaryKey(..), Proxy(..), ProcDescription(..), toMime)
|
PrimaryKey (..), ProcDescription (..),
|
||||||
|
Proxy (..), Table (..), toMime)
|
||||||
|
import Protolude hiding (Proxy, dropWhile, get,
|
||||||
|
intercalate, (&))
|
||||||
|
|
||||||
makeMimeList :: [ContentType] -> MimeList
|
makeMimeList :: [ContentType] -> MimeList
|
||||||
makeMimeList cs = MimeList $ map (fromString . toS . toMime) cs
|
makeMimeList cs = MimeList $ map (fromString . toS . toMime) cs
|
||||||
|
|||||||
+14
-11
@@ -6,23 +6,26 @@ This module is in charge of parsing all the querystring values in an url, e.g. t
|
|||||||
-}
|
-}
|
||||||
module PostgREST.Parsers where
|
module PostgREST.Parsers where
|
||||||
|
|
||||||
import Protolude hiding (try, intercalate, replace, option)
|
import qualified Data.HashMap.Strict as M
|
||||||
|
import qualified Data.Set as S
|
||||||
|
|
||||||
import Control.Monad ((>>))
|
import Control.Monad ((>>))
|
||||||
|
import Data.Either.Combinators (mapLeft)
|
||||||
import Data.Foldable (foldl1)
|
import Data.Foldable (foldl1)
|
||||||
import Data.Functor (($>))
|
import Data.Functor (($>))
|
||||||
import qualified Data.HashMap.Strict as M
|
|
||||||
import Data.Text (intercalate, replace, strip)
|
|
||||||
import Data.List (init, last)
|
import Data.List (init, last)
|
||||||
import qualified Data.Set as S
|
import Data.Text (intercalate, replace, strip)
|
||||||
import Data.Tree
|
|
||||||
import Data.Either.Combinators (mapLeft)
|
|
||||||
import PostgREST.RangeQuery (NonnegRange)
|
|
||||||
import PostgREST.Error (ApiRequestError(ParseRequestError))
|
|
||||||
import PostgREST.Types
|
|
||||||
import Text.ParserCombinators.Parsec hiding (many, (<|>))
|
|
||||||
import Text.Parsec.Error
|
|
||||||
import Text.Read (read)
|
import Text.Read (read)
|
||||||
|
|
||||||
|
import Data.Tree
|
||||||
|
import Text.Parsec.Error
|
||||||
|
import Text.ParserCombinators.Parsec hiding (many, (<|>))
|
||||||
|
|
||||||
|
import PostgREST.Error (ApiRequestError (ParseRequestError))
|
||||||
|
import PostgREST.RangeQuery (NonnegRange)
|
||||||
|
import PostgREST.Types
|
||||||
|
import Protolude hiding (intercalate, option, replace, try)
|
||||||
|
|
||||||
pRequestSelect :: Text -> Either ApiRequestError [Tree SelectItem]
|
pRequestSelect :: Text -> Either ApiRequestError [Tree SelectItem]
|
||||||
pRequestSelect selStr =
|
pRequestSelect selStr =
|
||||||
mapError $ parse pFieldForest ("failed to parse select parameter (" <> toS selStr <> ")") (toS selStr)
|
mapError $ parse pFieldForest ("failed to parse select parameter (" <> toS selStr <> ")") (toS selStr)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{-# LANGUAGE FlexibleInstances #-}
|
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
|
||||||
{-# LANGUAGE DuplicateRecordFields #-}
|
{-# LANGUAGE DuplicateRecordFields #-}
|
||||||
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
{-# LANGUAGE FlexibleInstances #-}
|
||||||
{-# LANGUAGE LambdaCase #-}
|
{-# LANGUAGE LambdaCase #-}
|
||||||
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
||||||
{-|
|
{-|
|
||||||
@@ -27,29 +27,29 @@ module PostgREST.QueryBuilder (
|
|||||||
, pgFmtSetLocalSearchPath
|
, pgFmtSetLocalSearchPath
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import qualified Hasql.Statement as H
|
|
||||||
import qualified Hasql.Encoders as HE
|
|
||||||
import qualified Hasql.Decoders as HD
|
|
||||||
|
|
||||||
import qualified Data.Aeson as JSON
|
import qualified Data.Aeson as JSON
|
||||||
|
|
||||||
import PostgREST.RangeQuery (rangeLimit, rangeOffset, allRange)
|
|
||||||
import qualified Data.HashMap.Strict as HM
|
|
||||||
import Data.Maybe
|
|
||||||
import qualified Data.Set as S
|
|
||||||
import Data.Text (intercalate, unwords, replace, isInfixOf, toLower)
|
|
||||||
import qualified Data.Text as T (map, takeWhile, null)
|
|
||||||
import qualified Data.Text.Encoding as T
|
|
||||||
import Data.Tree (Tree(..))
|
|
||||||
import PostgREST.Types
|
|
||||||
import Text.InterpolatedString.Perl6 (qc)
|
|
||||||
import qualified Data.ByteString.Char8 as BS
|
import qualified Data.ByteString.Char8 as BS
|
||||||
import Data.Scientific ( FPFormat (..)
|
import qualified Data.HashMap.Strict as HM
|
||||||
, formatScientific
|
import qualified Data.Set as S
|
||||||
, isInteger
|
import qualified Data.Text as T (map, null, takeWhile)
|
||||||
)
|
import qualified Data.Text.Encoding as T
|
||||||
import Protolude hiding ( intercalate, cast, replace)
|
import qualified Hasql.Decoders as HD
|
||||||
|
import qualified Hasql.Encoders as HE
|
||||||
|
import qualified Hasql.Statement as H
|
||||||
|
|
||||||
|
import Data.Scientific (FPFormat (..), formatScientific,
|
||||||
|
isInteger)
|
||||||
|
import Data.Text (intercalate, isInfixOf, replace,
|
||||||
|
toLower, unwords)
|
||||||
|
import Data.Tree (Tree (..))
|
||||||
|
import Text.InterpolatedString.Perl6 (qc)
|
||||||
|
|
||||||
|
import Data.Maybe
|
||||||
|
|
||||||
import PostgREST.ApiRequest (PreferRepresentation (..))
|
import PostgREST.ApiRequest (PreferRepresentation (..))
|
||||||
|
import PostgREST.RangeQuery (allRange, rangeLimit, rangeOffset)
|
||||||
|
import PostgREST.Types
|
||||||
|
import Protolude hiding (cast, intercalate, replace)
|
||||||
|
|
||||||
{-| The generic query result format used by API responses. The location header
|
{-| The generic query result format used by API responses. The location header
|
||||||
is represented as a list of strings containing variable bindings like
|
is represented as a list of strings containing variable bindings like
|
||||||
|
|||||||
@@ -13,17 +13,15 @@ module PostgREST.RangeQuery (
|
|||||||
, NonnegRange
|
, NonnegRange
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
|
||||||
import Control.Applicative
|
|
||||||
import Network.HTTP.Types.Header
|
|
||||||
|
|
||||||
import qualified Data.ByteString.Char8 as BS
|
import qualified Data.ByteString.Char8 as BS
|
||||||
import Data.Ranged.Boundaries
|
|
||||||
import Data.Ranged.Ranges
|
|
||||||
|
|
||||||
import Text.Regex.TDFA ((=~))
|
|
||||||
|
|
||||||
import Data.List (lookup)
|
import Data.List (lookup)
|
||||||
|
import Text.Regex.TDFA ((=~))
|
||||||
|
|
||||||
|
import Control.Applicative
|
||||||
|
import Data.Ranged.Boundaries
|
||||||
|
import Data.Ranged.Ranges
|
||||||
|
import Network.HTTP.Types.Header
|
||||||
|
|
||||||
import Protolude
|
import Protolude
|
||||||
|
|
||||||
|
|||||||
@@ -6,16 +6,19 @@ Description : PostgREST common types and functions used by the rest of the modul
|
|||||||
|
|
||||||
module PostgREST.Types where
|
module PostgREST.Types where
|
||||||
|
|
||||||
import Protolude
|
|
||||||
import qualified GHC.Show
|
|
||||||
import qualified Data.Aeson as JSON
|
import qualified Data.Aeson as JSON
|
||||||
import qualified Data.ByteString.Lazy as BL
|
import qualified Data.ByteString.Lazy as BL
|
||||||
import qualified Data.CaseInsensitive as CI
|
import qualified Data.CaseInsensitive as CI
|
||||||
import qualified Data.HashMap.Strict as M
|
import qualified Data.HashMap.Strict as M
|
||||||
import qualified Data.Set as S
|
import qualified Data.Set as S
|
||||||
|
import qualified GHC.Show
|
||||||
|
|
||||||
|
import Network.HTTP.Types.Header (Header, hContentType)
|
||||||
|
|
||||||
import Data.Tree
|
import Data.Tree
|
||||||
|
|
||||||
import PostgREST.RangeQuery (NonnegRange)
|
import PostgREST.RangeQuery (NonnegRange)
|
||||||
import Network.HTTP.Types.Header (hContentType, Header)
|
import Protolude
|
||||||
|
|
||||||
-- | Enumeration of currently supported response content types
|
-- | Enumeration of currently supported response content types
|
||||||
data ContentType = CTApplicationJSON | CTTextCSV | CTOpenAPI
|
data ContentType = CTApplicationJSON | CTTextCSV | CTOpenAPI
|
||||||
|
|||||||
@@ -1,13 +1,14 @@
|
|||||||
module Feature.AndOrParamsSpec where
|
module Feature.AndOrParamsSpec where
|
||||||
import Test.Hspec
|
|
||||||
import Test.Hspec.Wai
|
|
||||||
import Test.Hspec.Wai.JSON
|
|
||||||
import Network.HTTP.Types
|
|
||||||
|
|
||||||
import Network.Wai (Application)
|
import Network.Wai (Application)
|
||||||
|
|
||||||
import SpecHelper
|
import Network.HTTP.Types
|
||||||
|
import Test.Hspec
|
||||||
|
import Test.Hspec.Wai
|
||||||
|
import Test.Hspec.Wai.JSON
|
||||||
|
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
module Feature.AsymmetricJwtSpec where
|
module Feature.AsymmetricJwtSpec where
|
||||||
|
|
||||||
-- {{{ Imports
|
-- {{{ Imports
|
||||||
import Test.Hspec
|
|
||||||
import Test.Hspec.Wai
|
|
||||||
import Network.HTTP.Types
|
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Network.Wai (Application)
|
import Network.Wai (Application)
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
|
import Test.Hspec
|
||||||
|
import Test.Hspec.Wai
|
||||||
|
|
||||||
import Protolude
|
import Protolude
|
||||||
|
import SpecHelper
|
||||||
-- }}}
|
-- }}}
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
module Feature.AudienceJwtSecretSpec where
|
module Feature.AudienceJwtSecretSpec where
|
||||||
|
|
||||||
-- {{{ Imports
|
-- {{{ Imports
|
||||||
import Test.Hspec
|
|
||||||
import Test.Hspec.Wai
|
|
||||||
import Network.HTTP.Types
|
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Network.Wai (Application)
|
import Network.Wai (Application)
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
|
import Test.Hspec
|
||||||
|
import Test.Hspec.Wai
|
||||||
|
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
-- }}}
|
-- }}}
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
|
|||||||
@@ -1,17 +1,16 @@
|
|||||||
module Feature.AuthSpec where
|
module Feature.AuthSpec where
|
||||||
|
|
||||||
import Text.Heredoc
|
import Network.Wai (Application)
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Test.Hspec.Wai.JSON
|
import Test.Hspec.Wai.JSON
|
||||||
import Network.HTTP.Types
|
import Text.Heredoc
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import Protolude hiding (get)
|
|
||||||
|
|
||||||
import PostgREST.Types (PgVersion, pgVersion112)
|
import PostgREST.Types (PgVersion, pgVersion112)
|
||||||
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
spec :: PgVersion -> SpecWith Application
|
spec :: PgVersion -> SpecWith Application
|
||||||
spec actualPgVersion = describe "authorization" $ do
|
spec actualPgVersion = describe "authorization" $ do
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
module Feature.BinaryJwtSecretSpec where
|
module Feature.BinaryJwtSecretSpec where
|
||||||
|
|
||||||
-- {{{ Imports
|
-- {{{ Imports
|
||||||
import Test.Hspec
|
|
||||||
import Test.Hspec.Wai
|
|
||||||
import Network.HTTP.Types
|
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Network.Wai (Application)
|
import Network.Wai (Application)
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
|
import Test.Hspec
|
||||||
|
import Test.Hspec.Wai
|
||||||
|
|
||||||
import Protolude
|
import Protolude
|
||||||
|
import SpecHelper
|
||||||
-- }}}
|
-- }}}
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
|
|||||||
@@ -1,21 +1,22 @@
|
|||||||
{-# LANGUAGE MultiParamTypeClasses, TypeFamilies, UndecidableInstances #-}
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||||
|
{-# LANGUAGE TypeFamilies #-}
|
||||||
|
{-# LANGUAGE UndecidableInstances #-}
|
||||||
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
{-# OPTIONS_GHC -fno-warn-orphans #-}
|
||||||
module Feature.ConcurrentSpec where
|
module Feature.ConcurrentSpec where
|
||||||
|
|
||||||
import Control.Monad (void)
|
|
||||||
import Control.Monad.Base
|
|
||||||
|
|
||||||
import Control.Monad.Trans.Control
|
|
||||||
import Control.Concurrent.Async (mapConcurrently)
|
import Control.Concurrent.Async (mapConcurrently)
|
||||||
|
import Control.Monad (void)
|
||||||
import Test.Hspec
|
|
||||||
import Test.Hspec.Wai.Internal
|
|
||||||
import Test.Hspec.Wai
|
|
||||||
import Test.Hspec.Wai.JSON
|
|
||||||
import Network.Wai.Test (Session)
|
|
||||||
|
|
||||||
import Network.Wai (Application)
|
import Network.Wai (Application)
|
||||||
|
|
||||||
|
import Control.Monad.Base
|
||||||
|
import Control.Monad.Trans.Control
|
||||||
|
|
||||||
|
import Network.Wai.Test (Session)
|
||||||
|
import Test.Hspec
|
||||||
|
import Test.Hspec.Wai
|
||||||
|
import Test.Hspec.Wai.Internal
|
||||||
|
import Test.Hspec.Wai.JSON
|
||||||
|
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
module Feature.CorsSpec where
|
module Feature.CorsSpec where
|
||||||
|
|
||||||
-- {{{ Imports
|
-- {{{ Imports
|
||||||
import Test.Hspec
|
|
||||||
import Test.Hspec.Wai
|
|
||||||
import Network.Wai.Test (SResponse(simpleHeaders, simpleBody))
|
|
||||||
import qualified Data.ByteString.Lazy as BL
|
import qualified Data.ByteString.Lazy as BL
|
||||||
|
|
||||||
import SpecHelper
|
import Network.Wai (Application)
|
||||||
|
import Network.Wai.Test (SResponse (simpleBody, simpleHeaders))
|
||||||
|
|
||||||
import Network.HTTP.Types
|
import Network.HTTP.Types
|
||||||
import Network.Wai (Application)
|
import Test.Hspec
|
||||||
|
import Test.Hspec.Wai
|
||||||
|
|
||||||
import Protolude
|
import Protolude
|
||||||
|
import SpecHelper
|
||||||
-- }}}
|
-- }}}
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
module Feature.DeleteSpec where
|
module Feature.DeleteSpec where
|
||||||
|
|
||||||
|
import Network.Wai (Application)
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Text.Heredoc
|
import Text.Heredoc
|
||||||
|
|
||||||
import Network.HTTP.Types
|
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
module Feature.ExtraSearchPathSpec where
|
module Feature.ExtraSearchPathSpec where
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
|
import Network.Wai (Application)
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Test.Hspec.Wai.JSON
|
import Test.Hspec.Wai.JSON
|
||||||
import Network.HTTP.Types
|
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import Protolude
|
import Protolude
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
spec = describe "extra search path" $ do
|
spec = describe "extra search path" $ do
|
||||||
|
|||||||
+12
-15
@@ -1,27 +1,24 @@
|
|||||||
module Feature.InsertSpec where
|
module Feature.InsertSpec where
|
||||||
|
|
||||||
import Test.Hspec hiding (pendingWith)
|
|
||||||
import Test.Hspec.Wai
|
|
||||||
import Test.Hspec.Wai.JSON
|
|
||||||
import Test.Hspec.Wai.Matcher (bodyEquals)
|
|
||||||
import Network.Wai.Test (SResponse(simpleBody,simpleHeaders,simpleStatus))
|
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
|
|
||||||
import qualified Data.Aeson as JSON
|
import qualified Data.Aeson as JSON
|
||||||
|
|
||||||
|
import Control.Monad (replicateM_, void)
|
||||||
import Data.List (lookup)
|
import Data.List (lookup)
|
||||||
import Data.Maybe (fromJust)
|
import Data.Maybe (fromJust)
|
||||||
import Text.Heredoc
|
|
||||||
import Network.HTTP.Types.Header
|
|
||||||
import Network.HTTP.Types
|
|
||||||
import Control.Monad (replicateM_, void)
|
|
||||||
|
|
||||||
import TestTypes(IncPK(..), CompoundPK(..))
|
|
||||||
import Network.Wai (Application)
|
import Network.Wai (Application)
|
||||||
|
import Network.Wai.Test (SResponse (simpleBody, simpleHeaders, simpleStatus))
|
||||||
|
import Test.Hspec hiding (pendingWith)
|
||||||
|
import Test.Hspec.Wai.Matcher (bodyEquals)
|
||||||
|
import TestTypes (CompoundPK (..), IncPK (..))
|
||||||
|
|
||||||
import Protolude hiding (get)
|
import Network.HTTP.Types
|
||||||
|
import Test.Hspec.Wai
|
||||||
|
import Test.Hspec.Wai.JSON
|
||||||
|
import Text.Heredoc
|
||||||
|
|
||||||
import PostgREST.Types (PgVersion, pgVersion112)
|
import PostgREST.Types (PgVersion, pgVersion112)
|
||||||
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
spec :: PgVersion -> SpecWith Application
|
spec :: PgVersion -> SpecWith Application
|
||||||
spec actualPgVersion = do
|
spec actualPgVersion = do
|
||||||
|
|||||||
@@ -1,16 +1,15 @@
|
|||||||
module Feature.JsonOperatorSpec where
|
module Feature.JsonOperatorSpec where
|
||||||
|
|
||||||
|
import Network.Wai (Application)
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Test.Hspec.Wai.JSON
|
import Test.Hspec.Wai.JSON
|
||||||
import Network.HTTP.Types
|
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import Protolude hiding (get)
|
|
||||||
|
|
||||||
import PostgREST.Types (PgVersion, pgVersion112)
|
import PostgREST.Types (PgVersion, pgVersion112)
|
||||||
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
spec :: PgVersion -> SpecWith Application
|
spec :: PgVersion -> SpecWith Application
|
||||||
spec actualPgVersion = describe "json and jsonb operators" $ do
|
spec actualPgVersion = describe "json and jsonb operators" $ do
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
module Feature.NoJwtSpec where
|
module Feature.NoJwtSpec where
|
||||||
|
|
||||||
-- {{{ Imports
|
-- {{{ Imports
|
||||||
|
|
||||||
|
import Network.Wai (Application)
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Test.Hspec.Wai.JSON
|
import Test.Hspec.Wai.JSON
|
||||||
import Network.HTTP.Types
|
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import Protolude
|
import Protolude
|
||||||
|
import SpecHelper
|
||||||
-- }}}
|
-- }}}
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
module Feature.NonexistentSchemaSpec where
|
module Feature.NonexistentSchemaSpec where
|
||||||
|
|
||||||
import Network.Wai (Application)
|
import Network.Wai (Application)
|
||||||
import Protolude hiding (get)
|
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
|
|
||||||
|
import Protolude hiding (get)
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
spec =
|
spec =
|
||||||
describe "Non existent api schema" $ do
|
describe "Non existent api schema" $ do
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
module Feature.PgVersion95Spec where
|
module Feature.PgVersion95Spec where
|
||||||
|
|
||||||
|
import Network.Wai (Application)
|
||||||
|
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Test.Hspec.Wai.JSON
|
import Test.Hspec.Wai.JSON
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
spec = describe "features supported on PostgreSQL 9.5" $
|
spec = describe "features supported on PostgreSQL 9.5" $
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
module Feature.PgVersion96Spec where
|
module Feature.PgVersion96Spec where
|
||||||
|
|
||||||
|
import Network.Wai (Application)
|
||||||
|
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Test.Hspec.Wai.JSON
|
import Test.Hspec.Wai.JSON
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
spec =
|
spec =
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
module Feature.ProxySpec where
|
module Feature.ProxySpec where
|
||||||
|
|
||||||
|
import Network.Wai (Application)
|
||||||
import Test.Hspec hiding (pendingWith)
|
import Test.Hspec hiding (pendingWith)
|
||||||
|
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
|
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import Protolude
|
import Protolude
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
spec =
|
spec =
|
||||||
|
|||||||
@@ -1,14 +1,15 @@
|
|||||||
module Feature.QueryLimitedSpec where
|
module Feature.QueryLimitedSpec where
|
||||||
|
|
||||||
|
import Network.Wai (Application)
|
||||||
|
import Network.Wai.Test (SResponse (simpleHeaders, simpleStatus))
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Test.Hspec.Wai.JSON
|
import Test.Hspec.Wai.JSON
|
||||||
import Network.HTTP.Types
|
|
||||||
import Network.Wai.Test (SResponse(simpleHeaders, simpleStatus))
|
|
||||||
import SpecHelper
|
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
spec =
|
spec =
|
||||||
|
|||||||
@@ -1,16 +1,17 @@
|
|||||||
module Feature.QuerySpec where
|
module Feature.QuerySpec where
|
||||||
|
|
||||||
|
import Network.Wai (Application)
|
||||||
|
import Network.Wai.Test (SResponse (simpleHeaders))
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Test.Hspec.Wai.JSON
|
import Test.Hspec.Wai.JSON
|
||||||
import Network.HTTP.Types
|
|
||||||
import Network.Wai.Test (SResponse(simpleHeaders))
|
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Text.Heredoc
|
import Text.Heredoc
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
spec = do
|
spec = do
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
module Feature.RangeSpec where
|
module Feature.RangeSpec where
|
||||||
|
|
||||||
import Test.Hspec
|
|
||||||
import Test.Hspec.Wai
|
|
||||||
import Test.Hspec.Wai.JSON
|
|
||||||
import Network.HTTP.Types
|
|
||||||
import Network.Wai.Test (SResponse(simpleHeaders,simpleStatus))
|
|
||||||
|
|
||||||
import qualified Data.ByteString.Lazy as BL
|
import qualified Data.ByteString.Lazy as BL
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Network.Wai (Application)
|
import Network.Wai (Application)
|
||||||
|
import Network.Wai.Test (SResponse (simpleHeaders, simpleStatus))
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
|
import Test.Hspec
|
||||||
|
import Test.Hspec.Wai
|
||||||
|
import Test.Hspec.Wai.JSON
|
||||||
|
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
defaultRange :: BL.ByteString
|
defaultRange :: BL.ByteString
|
||||||
defaultRange = [json| { "min": 0, "max": 15 } |]
|
defaultRange = [json| { "min": 0, "max": 15 } |]
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
module Feature.RpcSpec where
|
module Feature.RpcSpec where
|
||||||
|
|
||||||
|
import qualified Data.ByteString.Lazy as BL (empty)
|
||||||
|
|
||||||
|
import Network.Wai (Application)
|
||||||
|
import Network.Wai.Test (SResponse (simpleBody, simpleStatus))
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Test.Hspec.Wai.JSON
|
import Test.Hspec.Wai.JSON
|
||||||
import Network.HTTP.Types
|
|
||||||
import Network.Wai.Test (SResponse(simpleStatus, simpleBody))
|
|
||||||
import qualified Data.ByteString.Lazy as BL (empty)
|
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Text.Heredoc
|
import Text.Heredoc
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import Protolude hiding (get)
|
|
||||||
|
|
||||||
import PostgREST.Types (PgVersion, pgVersion95)
|
import PostgREST.Types (PgVersion, pgVersion95)
|
||||||
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
spec :: PgVersion -> SpecWith Application
|
spec :: PgVersion -> SpecWith Application
|
||||||
spec actualPgVersion =
|
spec actualPgVersion =
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
module Feature.SingularSpec where
|
module Feature.SingularSpec where
|
||||||
|
|
||||||
import Text.Heredoc
|
import Network.Wai (Application)
|
||||||
|
import Network.Wai.Test (SResponse (..))
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Test.Hspec.Wai.JSON
|
import Test.Hspec.Wai.JSON
|
||||||
import Network.HTTP.Types
|
import Text.Heredoc
|
||||||
import Network.Wai.Test (SResponse(..))
|
|
||||||
|
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
|
|||||||
@@ -1,21 +1,21 @@
|
|||||||
module Feature.StructureSpec where
|
module Feature.StructureSpec where
|
||||||
|
|
||||||
import Test.Hspec hiding (pendingWith)
|
|
||||||
import Test.Hspec.Wai
|
|
||||||
import Network.HTTP.Types
|
|
||||||
|
|
||||||
import PostgREST.Config (docsVersion)
|
|
||||||
import Control.Lens ((^?))
|
import Control.Lens ((^?))
|
||||||
import Data.Aeson.Types (Value (..))
|
import Data.Aeson.Types (Value (..))
|
||||||
import Data.Aeson.Lens
|
|
||||||
import Data.Aeson.QQ
|
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
|
|
||||||
import Network.Wai (Application)
|
import Network.Wai (Application)
|
||||||
import Network.Wai.Test (SResponse (..))
|
import Network.Wai.Test (SResponse (..))
|
||||||
|
|
||||||
|
import Data.Aeson.Lens
|
||||||
|
import Data.Aeson.QQ
|
||||||
|
import Network.HTTP.Types
|
||||||
|
import Test.Hspec hiding (pendingWith)
|
||||||
|
import Test.Hspec.Wai
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
import PostgREST.Config (docsVersion)
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
spec = do
|
spec = do
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
module Feature.UnicodeSpec where
|
module Feature.UnicodeSpec where
|
||||||
|
|
||||||
|
import Control.Monad (void)
|
||||||
|
import Network.Wai (Application)
|
||||||
|
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Test.Hspec.Wai.JSON
|
import Test.Hspec.Wai.JSON
|
||||||
import Network.Wai (Application)
|
|
||||||
import Control.Monad (void)
|
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
|
|
||||||
import Protolude hiding (get)
|
import Protolude hiding (get)
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
spec =
|
spec =
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
module Feature.UpsertSpec where
|
module Feature.UpsertSpec where
|
||||||
|
|
||||||
|
import Network.Wai (Application)
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
import Test.Hspec
|
import Test.Hspec
|
||||||
import Test.Hspec.Wai
|
import Test.Hspec.Wai
|
||||||
import Test.Hspec.Wai.JSON
|
import Test.Hspec.Wai.JSON
|
||||||
import Network.HTTP.Types
|
import Text.Heredoc
|
||||||
|
|
||||||
import SpecHelper
|
|
||||||
import Network.Wai (Application)
|
|
||||||
|
|
||||||
import Protolude hiding (get, put)
|
import Protolude hiding (get, put)
|
||||||
import Text.Heredoc
|
import SpecHelper
|
||||||
|
|
||||||
spec :: SpecWith Application
|
spec :: SpecWith Application
|
||||||
spec =
|
spec =
|
||||||
|
|||||||
+23
-20
@@ -1,23 +1,28 @@
|
|||||||
module Main where
|
module Main where
|
||||||
|
|
||||||
import Test.Hspec
|
|
||||||
import SpecHelper
|
|
||||||
|
|
||||||
import qualified Hasql.Pool as P
|
import qualified Hasql.Pool as P
|
||||||
import qualified Hasql.Transaction.Sessions as HT
|
import qualified Hasql.Transaction.Sessions as HT
|
||||||
|
|
||||||
import PostgREST.App (postgrest)
|
import Control.AutoUpdate (defaultUpdateSettings, mkAutoUpdate,
|
||||||
import PostgREST.DbStructure (getDbStructure, getPgVersion)
|
updateAction)
|
||||||
import PostgREST.Types (DbStructure(..), pgVersion95, pgVersion96)
|
|
||||||
import Control.AutoUpdate (defaultUpdateSettings, mkAutoUpdate, updateAction)
|
|
||||||
import Data.Function (id)
|
import Data.Function (id)
|
||||||
import Data.IORef
|
|
||||||
import Data.Time.Clock (getCurrentTime)
|
import Data.Time.Clock (getCurrentTime)
|
||||||
|
|
||||||
import qualified Feature.AuthSpec
|
import Data.IORef
|
||||||
|
import Test.Hspec
|
||||||
|
|
||||||
|
import PostgREST.App (postgrest)
|
||||||
|
import PostgREST.DbStructure (getDbStructure, getPgVersion)
|
||||||
|
import PostgREST.Types (DbStructure (..), pgVersion95,
|
||||||
|
pgVersion96)
|
||||||
|
import Protolude
|
||||||
|
import SpecHelper
|
||||||
|
|
||||||
|
import qualified Feature.AndOrParamsSpec
|
||||||
import qualified Feature.AsymmetricJwtSpec
|
import qualified Feature.AsymmetricJwtSpec
|
||||||
import qualified Feature.BinaryJwtSecretSpec
|
|
||||||
import qualified Feature.AudienceJwtSecretSpec
|
import qualified Feature.AudienceJwtSecretSpec
|
||||||
|
import qualified Feature.AuthSpec
|
||||||
|
import qualified Feature.BinaryJwtSecretSpec
|
||||||
import qualified Feature.ConcurrentSpec
|
import qualified Feature.ConcurrentSpec
|
||||||
import qualified Feature.CorsSpec
|
import qualified Feature.CorsSpec
|
||||||
import qualified Feature.DeleteSpec
|
import qualified Feature.DeleteSpec
|
||||||
@@ -25,21 +30,19 @@ import qualified Feature.ExtraSearchPathSpec
|
|||||||
import qualified Feature.InsertSpec
|
import qualified Feature.InsertSpec
|
||||||
import qualified Feature.JsonOperatorSpec
|
import qualified Feature.JsonOperatorSpec
|
||||||
import qualified Feature.NoJwtSpec
|
import qualified Feature.NoJwtSpec
|
||||||
import qualified Feature.QueryLimitedSpec
|
|
||||||
import qualified Feature.QuerySpec
|
|
||||||
import qualified Feature.RangeSpec
|
|
||||||
import qualified Feature.StructureSpec
|
|
||||||
import qualified Feature.SingularSpec
|
|
||||||
import qualified Feature.UnicodeSpec
|
|
||||||
import qualified Feature.ProxySpec
|
|
||||||
import qualified Feature.AndOrParamsSpec
|
|
||||||
import qualified Feature.RpcSpec
|
|
||||||
import qualified Feature.NonexistentSchemaSpec
|
import qualified Feature.NonexistentSchemaSpec
|
||||||
import qualified Feature.PgVersion95Spec
|
import qualified Feature.PgVersion95Spec
|
||||||
import qualified Feature.PgVersion96Spec
|
import qualified Feature.PgVersion96Spec
|
||||||
|
import qualified Feature.ProxySpec
|
||||||
|
import qualified Feature.QueryLimitedSpec
|
||||||
|
import qualified Feature.QuerySpec
|
||||||
|
import qualified Feature.RangeSpec
|
||||||
|
import qualified Feature.RpcSpec
|
||||||
|
import qualified Feature.SingularSpec
|
||||||
|
import qualified Feature.StructureSpec
|
||||||
|
import qualified Feature.UnicodeSpec
|
||||||
import qualified Feature.UpsertSpec
|
import qualified Feature.UpsertSpec
|
||||||
|
|
||||||
import Protolude
|
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
|
|||||||
+19
-22
@@ -1,34 +1,31 @@
|
|||||||
module SpecHelper where
|
module SpecHelper where
|
||||||
|
|
||||||
import Control.Monad (void)
|
import qualified Data.ByteString.Base64 as B64 (decodeLenient, encode)
|
||||||
|
|
||||||
import qualified System.IO.Error as E
|
|
||||||
import System.Environment (getEnv)
|
|
||||||
|
|
||||||
import qualified Data.ByteString.Base64 as B64 (encode, decodeLenient)
|
|
||||||
import Data.CaseInsensitive (CI(..))
|
|
||||||
import qualified Data.Set as S
|
|
||||||
import qualified Data.Map.Strict as M
|
|
||||||
import Data.List (lookup)
|
|
||||||
import Text.Regex.TDFA ((=~))
|
|
||||||
import qualified Data.ByteString.Char8 as BS
|
import qualified Data.ByteString.Char8 as BS
|
||||||
import qualified Data.ByteString.Lazy as BL
|
import qualified Data.ByteString.Lazy as BL
|
||||||
|
import qualified Data.Map.Strict as M
|
||||||
|
import qualified Data.Set as S
|
||||||
|
import qualified JSONSchema.Draft4 as D4
|
||||||
|
import qualified System.IO.Error as E
|
||||||
|
|
||||||
|
import Control.Monad (void)
|
||||||
|
import Data.Aeson (Value (..), decode)
|
||||||
|
import Data.CaseInsensitive (CI (..))
|
||||||
|
import Data.List (lookup)
|
||||||
|
import Data.Maybe (fromJust)
|
||||||
|
import Network.Wai.Test (SResponse (simpleBody, simpleHeaders, simpleStatus))
|
||||||
|
import System.Environment (getEnv)
|
||||||
import System.Process (readProcess)
|
import System.Process (readProcess)
|
||||||
|
import Text.Regex.TDFA ((=~))
|
||||||
|
|
||||||
|
|
||||||
|
import Network.HTTP.Types
|
||||||
|
import Test.Hspec
|
||||||
|
import Test.Hspec.Wai
|
||||||
import Text.Heredoc
|
import Text.Heredoc
|
||||||
|
|
||||||
import PostgREST.Config (AppConfig (..))
|
import PostgREST.Config (AppConfig (..))
|
||||||
import PostgREST.Types (JSPathExp (..))
|
import PostgREST.Types (JSPathExp (..))
|
||||||
|
|
||||||
import Test.Hspec
|
|
||||||
import Test.Hspec.Wai
|
|
||||||
|
|
||||||
import Network.HTTP.Types
|
|
||||||
import Network.Wai.Test (SResponse(simpleStatus, simpleHeaders, simpleBody))
|
|
||||||
|
|
||||||
import Data.Maybe (fromJust)
|
|
||||||
import Data.Aeson (decode, Value(..))
|
|
||||||
import qualified JSONSchema.Draft4 as D4
|
|
||||||
|
|
||||||
import Protolude
|
import Protolude
|
||||||
|
|
||||||
matchContentTypeJson :: MatchHeader
|
matchContentTypeJson :: MatchHeader
|
||||||
|
|||||||
+1
-1
@@ -3,8 +3,8 @@ module TestTypes (
|
|||||||
, CompoundPK(..)
|
, CompoundPK(..)
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import qualified Data.Aeson as JSON
|
|
||||||
import Data.Aeson ((.:))
|
import Data.Aeson ((.:))
|
||||||
|
import qualified Data.Aeson as JSON
|
||||||
|
|
||||||
import Protolude
|
import Protolude
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user