git.iko.soy/typeable/servant-reflex
on 9a3b58c help sign in
18 files changed+152−192
since splitsnapshots
unifiedsplit
.gitignore−2 .travis.yml+2−4 README.md+1−1 ChangeLog.md → changelog.md+1−14 default.nix+19−11 exec/Example.hs+1−2 nix/hspec-webdriver.patch+36 nix/nix.conf+1−2 nix/reflex-platform.nix+2−2 nix/servant-snap.nix−7 servant-reflex.cabal+15−22 shell.nix−1 src/Servant/Common/BaseUrl.hs+6−9 src/Servant/Common/Req.hs+3−26 src/Servant/Reflex.hs+27−45 src/Servant/Reflex/Multi.hs+22−35 testserver/testserver.cabal+3−3 travis.nix+13−6
.gitignore−2
@@ -7,5 +7,3 @@ log
77*.stats
88out
99/.stack-work/
10−TAGS
11−dist-newstyle
.travis.yml+2−4
@@ -1,17 +1,15 @@
11language: nix
2−nix: 2.3.6
2+nix: 2.1.1
33sudo: require
44
5−before_install:
5+install:
66 - sudo cp -rT $TRAVIS_BUILD_DIR/nix /etc/nix
77
88before_script:
9− - sudo systemctl restart nix-daemon.service
109 - git config --global user.email "travis-ci@example.com"
1110 - git config --global user.name "Travis-CI"
1211
1312script:
1413 - nix-build travis.nix -A build
15− - nix-build travis.nix -A buildGhc
1614 - nix-build travis.nix -A testserver
1715 - nix-build travis.nix -A testresults
README.md+1−1
@@ -7,7 +7,7 @@
77Keeping your frontend in sync with your API server can be difficult - when the
88API changes its input parameters or return type, XHR requests from the
99frontend will fail at runtime. If your API is defined by
10−[servant](https://haskell-servant.readthedocs.io) combinators, you can use
10+[servant](haskell-servant.readthedocs.io) combinators, you can use
1111`servant-reflex` to share the API between the server and frontend.
1212Syncronization between is checked at compile time, and rather than building XHR
1313requests by hand, API endpoints are available behind `reflex`'s FRP semantics.
ChangeLog.md → changelog.mdrenamed+1−14
@@ -1,20 +1,7 @@
1−0.3.5
2−-----
3−
4− - Require reflex-dom-core >= 0.6 (for internal handling of case-insensitive headers)
5− - Require servant >= 0.16
6− - Eliminate use of deprecated widgets from reflex-dom-core
7− - Bump the version of reflex-platform used in nix-shell and test suite
8−
9−0.3.4
10−-----
11−
12−Add selenium-based test suite
13−
1410.3.3
152-----
163
17−- Fix encoding issue: Explicitly escape reserved characters from path pieces and query parameters
4+Explicitly escape reserved characters from path pieces and query parameters
185
196
2070.3.2
default.nix+19−11
@@ -1,21 +1,29 @@
1−{ mkDerivation, base, bytestring, case-insensitive, containers
2−, data-default, exceptions, ghcjs-dom, http-api-data, http-media
3−, jsaddle, mtl, network-uri, reflex, reflex-dom, reflex-dom-core
4−, safe, servant, servant-auth, stdenv, string-conversions, text
5−, transformers
1+{ mkDerivation, aeson, base, bytestring, case-insensitive
2+, containers, data-default, exceptions, ghcjs-dom, http-api-data
3+, http-media, jsaddle, mtl, network-uri, reflex, reflex-dom
4+, reflex-dom-core, safe, scientific, servant, servant-auth, stdenv
5+, string-conversions, text, transformers
66}:
77mkDerivation {
88 pname = "servant-reflex";
9− version = "0.3.6";
10− src = ./.;
9+ version = "0.3.4";
10+ src = builtins.filterSource
11+ (path: type:
12+ baseNameOf path != "result"
13+ && baseNameOf path != "nix"
14+ ) ./.;
15+ configureFlags = [ "-fexample" ];
1116 isLibrary = true;
1217 isExecutable = true;
1318 libraryHaskellDepends = [
1419 base bytestring case-insensitive containers data-default exceptions
1520 ghcjs-dom http-api-data http-media jsaddle mtl network-uri reflex
16− reflex-dom reflex-dom-core safe servant servant-auth string-conversions
17− text transformers
21+ reflex-dom-core safe servant servant-auth string-conversions text
22+ transformers
1823 ];
19− description = "servant API generator for reflex apps";
24+ executableHaskellDepends = [
25+ aeson base reflex reflex-dom scientific servant text
26+ ];
27+ description = "Servant reflex API generator";
2028 license = stdenv.lib.licenses.bsd3;
21−}
29+}
exec/Example.hs+1−2
@@ -21,8 +21,7 @@ import Servant.API
2121import API
2222import Data.Proxy
2323import Text.Read (readMaybe)
24−import Reflex.Dom.Core hiding (run, mainWidget)
25−import Reflex.Dom (mainWidget)
24+import Reflex.Dom hiding (run)
2625------------------------------------------------------------------------------
2726import Servant.Reflex
2827import Servant.Reflex.Multi
nix/hspec-webdriver.patchnew file+36
@@ -0,0 +1,36 @@
1+diff --git a/Test/Hspec/WebDriver.hs b/Test/Hspec/WebDriver.hs
2+index 3162656..313360c 100644
3+--- a/Test/Hspec/WebDriver.hs
4++++ b/Test/Hspec/WebDriver.hs
5+@@ -111,7 +111,8 @@ import Data.Traversable (traverse)
6+
7+ import qualified Test.Hspec as H
8+ import Test.Hspec hiding (shouldReturn, shouldBe, shouldSatisfy, shouldThrow, pending, pendingWith, example)
9+-import Test.Hspec.Core.Spec (Result(..), Item(..), Example(..), SpecTree, Tree(..), fromSpecList, runSpecM)
10++import qualified Test.Hspec.Core as H
11++import Test.Hspec.Core.Spec (Result(..), ResultStatus(..), Item(..), Example(..), SpecTree, Tree(..), fromSpecList, runSpecM)
12+
13+ import Test.WebDriver (WD, Capabilities)
14+ import qualified Test.WebDriver as W
15+@@ -398,7 +399,7 @@ procTestSession cfg cap s = do
16+
17+ instance Eq multi => Example (WdExample multi) where
18+ type Arg (WdExample multi) = WdTestSession multi
19+- evaluateExample (WdPending msg) _ _ _ = return $ Pending msg
20++ evaluateExample (WdPending msg) _ _ _ = return $ Result "" $ Pending Nothing msg
21+ evaluateExample (WdExample multi (WdOptions {skipRemainingTestsAfterFailure}) wd) _ act _ = do
22+ prevHadError <- newIORef False
23+ aborted <- newIORef False
24+@@ -445,9 +446,9 @@ instance Eq multi => Example (WdExample multi) where
25+ merr <- readIORef prevHadError
26+ mabort <- readIORef aborted
27+ return $ case (merr, mabort) of
28+- (True, _) -> Pending (Just "Previous example had an error")
29+- (_, True) -> Pending (Just "Session has been aborted")
30+- _ -> Success
31++ (True, _) -> Result "" $ Pending Nothing (Just "Previous example had an error")
32++ (_, True) -> Result "" $ Pending Nothing (Just "Session has been aborted")
33++ _ -> Result "" $ Success
34+
35+ --------------------------------------------------------------------------------
36+ --- Utils
nix/nix.conf+1−2
@@ -1,3 +1,2 @@
1−substituters = https://cache.nixos.org/ https://nixcache.reflex-frp.org/
1+substituters = https://cache.nixos.org https://nixcache.reflex-frp.org
22trusted-public-keys = cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY= ryantrinkle.com-1:JJiAKaRv9mWgpVAz8dwewnZe0AzzEAzPkagE9SP5NWI=
3−trusted-users = travis
nix/reflex-platform.nix+2−2
@@ -1,7 +1,7 @@
11let
2− rev = "1aba6f367982bd6dd78ec2fda75ab246a62d32c5" ;
2+ rev = "3d232e2d1d8e8d10fbafc928972c901c764ae324";
33in import (builtins.fetchTarball
44 {
55 url = "https://github.com/reflex-frp/reflex-platform/archive/${rev}.tar.gz";
6− sha256 = "137vg6i8yy4lp6rz4wbvvhfcc9d9qf7j1b3fnng3r7sj63k7j664" ;
6+ sha256 = "15ysjn0aknbl06spn4qls7xapm0d3qw2awx6k8jl28zwkaid45yg";
77 }) {}
nix/servant-snap.nixdeleted−7
@@ -1,7 +0,0 @@
1−# Servant-snap is marked broken in nixpkgs
2−{ nixpkgs ? import <nixpkgs> {}}: self: super:
3−self.callCabal2nix "servant-snap" (nixpkgs.fetchgit {
4− url = "https://github.com/haskell-servant/servant-snap.git";
5− rev = "af5172a6de5bb2a07eb1bf4c85952075ec6ecdf3";
6− sha256 = "sha256-fzzQGwG8Ko72OO/kwLMG52eNZSt3F2dxhNgM9gaO4yQ=";
7−}) {}
servant-reflex.cabal+15−22
@@ -1,7 +1,7 @@
11Name: servant-reflex
2−Version: 0.3.6
3−Synopsis: servant API generator for reflex apps
4−Description: Generate reflex-compatible client functions from servant API descriptions
2+Version: 0.3.4
3+Synopsis: Servant reflex API generator
4+Description: Servant reflex API generator
55License: BSD3
66License-file: LICENSE.md
77Author: Greg Hale, Doug Beardsley
@@ -17,35 +17,37 @@ Flag Example
1717
1818library
1919 exposed-modules:
20− Servant.Common.BaseUrl
21− Servant.Common.Req
2220 Servant.Reflex
2321 Servant.Reflex.Multi
2422
23+ other-modules:
24+ Servant.Common.BaseUrl
25+ Servant.Common.Req
26+
2527 hs-source-dirs: src
2628 build-depends:
2729 base >= 4.8 && < 5,
2830 bytestring >= 0.10 && < 0.11,
2931 case-insensitive >= 1.2.0.4 && < 1.3,
30− containers >= 0.5.6 && < 0.7,
32+ containers >= 0.5.6 && < 0.6,
3133 data-default >= 0.5 && < 0.8,
3234 exceptions >= 0.8 && < 0.11,
3335 ghcjs-dom >= 0.2 && < 0.10,
34− http-api-data >= 0.3.6 && < 0.5,
35− http-media >= 0.6 && < 0.9,
36+ http-api-data >= 0.3.6 && < 0.4,
37+ http-media >= 0.6 && < 0.8,
3638 jsaddle >= 0.8 && < 0.10,
3739 mtl >= 2.2.1 && < 2.3,
3840 network-uri >= 2.6 && < 2.7,
39− reflex >= 0.5 && < 0.9,
40− reflex-dom-core >= 0.6 && < 0.8,
41+ reflex >= 0.5 && < 0.6,
42+ reflex-dom-core == 0.4 && < 0.5,
4143 safe >= 0.3.9 && < 0.4,
42− servant >= 0.16 && < 0.19,
44+ servant >= 0.8 && < 0.15,
4345 servant-auth >= 0.2.1 && < 0.4,
4446 string-conversions >= 0.4 && < 0.5,
4547 text >= 1.2 && < 1.3,
4648 transformers >= 0.4 && < 0.6
4749
48− ghc-options: -Wall -fwarn-tabs -funbox-strict-fields
50+ ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2
4951
5052 default-language: Haskell2010
5153
@@ -54,16 +56,7 @@ executable example
5456 buildable: True
5557 else
5658 buildable: False
57− build-depends:
58− aeson,
59− reflex,
60− servant-reflex,
61− base,
62− scientific,
63− servant,
64− reflex-dom,
65− reflex-dom-core,
66− text
59+ build-depends: aeson, reflex, servant-reflex, base, scientific, servant, reflex-dom, text
6760 default-language: Haskell2010
6861 main-is: Example.hs
6962 other-modules: API
shell.nixdeleted−1
@@ -1 +0,0 @@
1−(import ./travis.nix {nativeCompiler = "ghc";}).ghcPkgs.servant-reflex.env
src/Servant/Common/BaseUrl.hs+6−9
@@ -1,5 +1,4 @@
11{-# LANGUAGE ConstraintKinds #-}
2−{-# LANGUAGE CPP #-}
32{-# LANGUAGE DeriveDataTypeable #-}
43{-# LANGUAGE DeriveGeneric #-}
54{-# LANGUAGE FlexibleContexts #-}
@@ -32,11 +31,8 @@ import Reflex
3231import Reflex.Dom.Core
3332import Text.Read
3433
35−#if !MIN_VERSION_reflex_dom_core(0,7,0)
34+
3635type SupportsServantReflex t m = (Reflex t, TriggerEvent t m, PerformEvent t m, HasWebView (Performable m), MonadJSM (Performable m))
37−#else
38−type SupportsServantReflex t m = (Reflex t, TriggerEvent t m, PerformEvent t m, MonadJSM (Performable m))
39−#endif
4036
4137-- | URI scheme to use
4238data Scheme =
@@ -89,14 +85,15 @@ baseUrlWidget = elClass "div" "base-url" $ do
8985 where pathWidget :: m (Dynamic t BaseUrl)
9086 pathWidget = do
9187 text "Url base path"
92− t <- inputElement def
88+ t <- textInput (def {_textInputConfig_attributes =
89+ constDyn ("placeholder" =: "/a/b")})
9390 return $ BasePath <$> value t
9491 fullUrlWidget :: m (Dynamic t BaseUrl)
9592 fullUrlWidget = do
9693 schm <- dropdown Https (constDyn $ Https =: "https" <> Http =: "http") def
97− srv <- inputElement def
94+ srv <- textInput def {_textInputConfig_attributes = constDyn $ "placeholder" =: "example.com"}
9895 text ":"
99− prt <- inputElement def
96+ prt <- textInput def { _textInputConfig_attributes = constDyn $ "placeholder" =: "80"}
10097 port :: Dynamic t Int <- holdDyn 80 (fmapMaybe (readMaybe . T.unpack) $ updated (value prt))
101− path <- inputElement def
98+ path <- textInput def { _textInputConfig_attributes = constDyn $ "placeholder" =: "a/b" }
10299 return $ BaseFullUrl <$> value schm <*> value srv <*> port <*> value path
src/Servant/Common/Req.hs+3−26
@@ -12,14 +12,12 @@ module Servant.Common.Req where
1212
1313-------------------------------------------------------------------------------
1414import Control.Applicative (liftA2, liftA3)
15−import Control.Arrow ((&&&))
1615import Control.Concurrent
1716import Control.Monad (join)
1817import Control.Monad.IO.Class (MonadIO, liftIO)
1918import Data.Bifunctor (first)
2019import qualified Data.ByteString.Builder as Builder
2120import qualified Data.ByteString.Lazy.Char8 as BL
22−import Data.ByteString (ByteString)
2321import qualified Data.Map as Map
2422import Data.Maybe (catMaybes, fromMaybe)
2523import Data.Functor.Compose
@@ -93,13 +91,6 @@ reqFailure (ResponseFailure _ s _) = Just s
9391reqFailure (RequestFailure _ s) = Just s
9492reqFailure _ = Nothing
9593
96−------------------------------------------------------------------------------
97−-- | Simple filter/accessor like 'reqFailure', but keeping the request tag
98−reqFailure' :: ReqResult tag a -> Maybe (tag,Text)
99−reqFailure' (ResponseFailure tag s _) = Just (tag,s)
100−reqFailure' (RequestFailure tag s) = Just (tag,s)
101−reqFailure' _ = Nothing
102−
10394
10495------------------------------------------------------------------------------
10596-- | Simple filter/accessor for the raw XHR response
@@ -245,7 +236,7 @@ reqToReflexRequest reqMeth reqHost req =
245236 , _xhrRequestConfig_user = Nothing
246237 , _xhrRequestConfig_password = Nothing
247238 , _xhrRequestConfig_responseType = Just XhrResponseType_ArrayBuffer
248− , _xhrRequestConfig_sendData = mempty
239+ , _xhrRequestConfig_sendData = ""
249240 , _xhrRequestConfig_withCredentials = False
250241 }
251242 Just rBody -> liftA2 mkConfigBody xhrHeaders rBody
@@ -298,9 +289,7 @@ performRequests reqMeth rs reqHost opts trigger = do
298289performSomeRequestsAsync
299290 :: (MonadIO (Performable m),
300291 MonadJSM (Performable m),
301−#if !MIN_VERSION_reflex_dom_core(0,7,0)
302292 HasWebView (Performable m),
303−#endif
304293 PerformEvent t m,
305294 TriggerEvent t m,
306295 Traversable f,
@@ -338,9 +327,9 @@ performSomeRequestsAsync' opts newXhr req = performEventAsync $ ffor req $ \hrs
338327
339328
340329
341−type XhrPayload = ByteString
330+type XhrPayload = T.Text
342331bytesToPayload :: BL.ByteString -> XhrPayload
343−bytesToPayload = BL.toStrict
332+bytesToPayload = TE.decodeUtf8 . BL.toStrict
344333
345334
346335performRequestsCT
@@ -405,18 +394,6 @@ evalResponse decode (tag, xhr) =
405394 else ResponseFailure tag errMsg xhr
406395 in respPayld
407396
408−------------------------------------------------------------------------------
409−-- | Utility for simultaneously accessing/filtering Success and Failure
410−-- response 'Event's,
411−fanReqResult :: Reflex t => Event t (ReqResult tag a) -> (Event t Text, Event t a)
412−fanReqResult = fmapMaybe reqFailure &&& fmapMaybe reqSuccess
413−
414−------------------------------------------------------------------------------
415−-- | Utility for simultaneously accessing/filtering Success and Failure
416−-- response 'Event's, but keeping the request tag
417−fanReqResult' :: Reflex t => Event t (ReqResult tag a) -> (Event t (tag, Text), Event t (tag, a))
418−fanReqResult' = fmapMaybe reqFailure' &&& fmapMaybe reqSuccess'
419−
420397
421398note :: e -> Maybe a -> Either e a
422399note e = maybe (Left e) Right
src/Servant/Reflex.hs+27−45
@@ -39,36 +39,34 @@ module Servant.Reflex
3939
4040------------------------------------------------------------------------------
4141import Control.Applicative
42−import qualified Data.CaseInsensitive as CI
43−import Data.Functor.Identity
44−import qualified Data.Map as Map
4542import Data.Monoid ((<>))
46−import Data.Proxy (Proxy (..))
4743import qualified Data.Set as Set
44+import qualified Data.Text.Encoding as E
45+import Data.CaseInsensitive (mk)
46+import Data.Functor.Identity
47+import Data.Proxy (Proxy (..))
48+import qualified Data.Map as Map
4849import Data.Text (Text)
4950import qualified Data.Text as T
50−import qualified Data.Text.Encoding as E
5151import GHC.Exts (Constraint)
5252import GHC.TypeLits (KnownSymbol, symbolVal)
53−import Servant.API ((:<|>) (..), (:>), BasicAuth,
54− BasicAuthData, BuildHeadersTo (..),
55− Capture, Header, Headers (..),
56− HttpVersion, IsSecure,
57− MimeRender (..), MimeUnrender,
58− NoContent, QueryFlag, QueryParam',
59− QueryParams, Raw, ReflectMethod (..),
53+import Servant.API ((:<|>)(..),(:>), BasicAuth,
54+ BasicAuthData, BuildHeadersTo(..),
55+ Capture, contentType, Header,
56+ Headers(..), HttpVersion, IsSecure,
57+ MimeRender(..), MimeUnrender,
58+ NoContent, QueryFlag, QueryParam,
59+ QueryParams, Raw, ReflectMethod(..),
6060 RemoteHost, ReqBody,
61− ToHttpApiData (..), Vault, Verb,
62− contentType)
63−import Servant.API.Description (Summary)
61+ ToHttpApiData(..), Vault, Verb)
6462import qualified Servant.Auth as Auth
6563
6664import Reflex.Dom.Core (Dynamic, Event, Reflex,
67− XhrRequest (..), XhrResponse (..),
68− XhrResponseHeaders (..),
69− attachPromptlyDynWith, constDyn, ffor,
70− fmapMaybe, leftmost,
71− performRequestsAsync)
65+ XhrRequest(..),
66+ XhrResponseHeaders(..),
67+ XhrResponse(..), attachPromptlyDynWith, constDyn, ffor, fmapMaybe,
68+ leftmost, performRequestsAsync,
69+ )
7270------------------------------------------------------------------------------
7371import Servant.Common.BaseUrl (BaseUrl(..), Scheme(..), baseUrlWidget,
7472 showBaseUrl,
@@ -103,7 +101,7 @@ import Servant.Common.Req (ClientOptions(..),
103101-- >
104102-- > getAllBooks :: Event t l -> m (Event t (l, ReqResult [Book]))
105103-- > postNewBook :: Dynamic t (Maybe Book) -> Event t l
106−-- > -> m (Event t (l, ReqResult Book)))
104+-- -> m (Event t (l, ReqResult Book)))
107105-- > (getAllBooks :<|> postNewBook) = client myApi host
108106-- > where host = constDyn $ BaseUrl Http "localhost" 8080
109107client
@@ -228,26 +226,22 @@ instance {-# OVERLAPPING #-}
228226
229227toHeaders :: BuildHeadersTo ls => ReqResult tag a -> ReqResult tag (Headers ls a)
230228toHeaders r =
231− let hdrs = maybe []
232− (\xhr -> fmap (\(h,v) -> (CI.map E.encodeUtf8 h, E.encodeUtf8 v))
229+ let toBS = E.encodeUtf8
230+ hdrs = maybe []
231+ (\xhr -> fmap (\(h,v) -> (mk (toBS h), toBS v))
233232 (Map.toList $ _xhrResponse_headers xhr))
234233 (response r)
235234 in ffor r $ \a -> Headers {getResponse = a ,getHeadersHList = buildHeadersTo hdrs}
236235
237−
238236class BuildHeaderKeysTo hs where
239− buildHeaderKeysTo :: Proxy hs -> [CI.CI T.Text]
237+ buildHeaderKeysTo :: Proxy hs -> [T.Text]
240238
241239instance {-# OVERLAPPABLE #-} BuildHeaderKeysTo '[]
242240 where buildHeaderKeysTo _ = []
243241
244242instance {-# OVERLAPPABLE #-} (BuildHeaderKeysTo xs, KnownSymbol h)
245243 => BuildHeaderKeysTo ((Header h v) ': xs) where
246− buildHeaderKeysTo _ =
247− let
248− thisKey = CI.mk $ T.pack (symbolVal (Proxy :: Proxy h))
249− in thisKey : buildHeaderKeysTo (Proxy :: Proxy xs)
250−
244+ buildHeaderKeysTo _ = T.pack (symbolVal (Proxy :: Proxy h)) : buildHeaderKeysTo (Proxy :: Proxy xs)
251245
252246-- HEADERS Verb (Content) --
253247-- Headers combinator not treated in fully general case,
@@ -329,19 +323,6 @@ instance HasClient t m sublayout tag
329323 clientWithRouteAndResultHandler Proxy =
330324 clientWithRouteAndResultHandler (Proxy :: Proxy sublayout)
331325
332−-- | Using a 'Summary' combinator in your API doesn't affect the client
333−-- functions.
334−instance (HasClient t m sublayout tag, KnownSymbol sym)
335− => HasClient t m (Summary sym :> sublayout) tag where
336−
337− type Client t m (Summary sym :> sublayout) tag =
338− Client t m sublayout tag
339−
340− clientWithRouteAndResultHandler Proxy =
341− clientWithRouteAndResultHandler (Proxy :: Proxy sublayout)
342−
343−
344−
345326
346327-- | If you use a 'QueryParam' in one of your endpoints in your API,
347328-- the corresponding querying function will automatically take
@@ -370,9 +351,9 @@ instance (HasClient t m sublayout tag, KnownSymbol sym)
370351-- > -- 'getBooksBy Nothing' for all books
371352-- > -- 'getBooksBy (Just "Isaac Asimov")' to get all books by Isaac Asimov
372353instance (KnownSymbol sym, ToHttpApiData a, HasClient t m sublayout tag, Reflex t)
373− => HasClient t m (QueryParam' mods sym a :> sublayout) tag where
354+ => HasClient t m (QueryParam sym a :> sublayout) tag where
374355
375− type Client t m (QueryParam' mods sym a :> sublayout) tag =
356+ type Client t m (QueryParam sym a :> sublayout) tag =
376357 Dynamic t (QParam a) -> Client t m sublayout tag
377358
378359 -- if mparam = Nothing, we don't add it to the query string
@@ -622,3 +603,4 @@ type family HasCookieAuth xs :: Constraint where
622603 HasCookieAuth '[] = CookieAuthNotEnabled
623604
624605class CookieAuthNotEnabled
606+
src/Servant/Reflex/Multi.hs+22−35
@@ -37,30 +37,28 @@ module Servant.Reflex.Multi (
3737 ) where
3838
3939------------------------------------------------------------------------------
40−import Control.Applicative (liftA2)
41−import Data.Functor.Compose (Compose (..), getCompose)
42−import Data.Proxy (Proxy (..))
43−import qualified Data.Set as Set
44−import Data.Text (Text)
45−import qualified Data.Text as T
46−import qualified Data.Text.Encoding as E
47−import GHC.TypeLits (KnownSymbol, symbolVal)
48−import Servant.API ((:<|>) (..), (:>), BasicAuth,
49− BasicAuthData, BuildHeadersTo (..),
50− Capture, Header, Headers (..),
51− HttpVersion, IsSecure,
52− MimeRender (..), MimeUnrender,
53− NoContent, QueryFlag, QueryParam,
54− QueryParams, Raw, ReflectMethod (..),
55− RemoteHost, ReqBody,
56− ToHttpApiData (..), Vault, Verb,
57− contentType)
58−import Servant.API.Description (Summary)
59−
60−import Reflex.Dom.Core (Dynamic, Event, Reflex,
61− XhrRequest (..),
62− XhrResponseHeaders (..),
63− attachPromptlyDynWith, constDyn)
40+import Control.Applicative (liftA2)
41+import Data.Functor.Compose (Compose (..), getCompose)
42+import Data.Proxy (Proxy (..))
43+import qualified Data.Set as Set
44+import Data.Text (Text)
45+import qualified Data.Text as T
46+import qualified Data.Text.Encoding as E
47+import GHC.TypeLits (KnownSymbol, symbolVal)
48+import Servant.API ((:<|>) (..), (:>), BasicAuth,
49+ BasicAuthData, BuildHeadersTo (..),
50+ Capture, Header, Headers (..),
51+ HttpVersion, IsSecure, MimeRender (..),
52+ MimeUnrender, NoContent, QueryFlag,
53+ QueryParam, QueryParams, Raw,
54+ ReflectMethod (..), RemoteHost,
55+ ReqBody, ToHttpApiData (..), Vault,
56+ Verb, contentType)
57+
58+import Reflex.Dom.Core (Dynamic, Event, Reflex,
59+ XhrRequest (..),
60+ XhrResponseHeaders (..),
61+ attachPromptlyDynWith, constDyn)
6462------------------------------------------------------------------------------
6563import Servant.Common.BaseUrl (BaseUrl (..), Scheme (..),
6664 SupportsServantReflex)
@@ -242,17 +240,6 @@ instance HasClientMulti t m sublayout f tag
242240 clientWithRouteMulti (Proxy :: Proxy sublayout) q f tag
243241
244242
245−------------------------------------------------------------------------------
246−instance (HasClientMulti t m sublayout f tag, KnownSymbol sym)
247− => HasClientMulti t m (Summary sym :> sublayout) f tag where
248−
249− type ClientMulti t m (Summary sym :> sublayout) f tag =
250− ClientMulti t m sublayout f tag
251−
252− clientWithRouteMulti Proxy q f tag =
253− clientWithRouteMulti (Proxy :: Proxy sublayout) q f tag
254−
255−
256243------------------------------------------------------------------------------
257244instance (KnownSymbol sym,
258245 ToHttpApiData a,
testserver/testserver.cabal+3−3
@@ -19,13 +19,13 @@ executable back
1919 main-is: Main.hs
2020 -- other-modules:
2121 -- other-extensions:
22− build-depends: aeson >= 0.9 && < 1.5
23− , base >=4.8 && < 5
22+ build-depends: aeson >= 0.9 && < 1.4
23+ , base >=4.8 && <4.12
2424 , mtl
2525 , snap >= 1.0 && < 1.2
2626 , snap-server >= 1.0 && < 1.2
2727 , snap-core >= 1.0 && < 1.1
28− , servant >= 0.16 && < 0.18
28+ , servant >= 0.8 && < 0.15
2929 , servant-snap >= 0.8 && < 0.9
3030 , text >= 1.0 && < 1.3
3131 -- hs-source-dirs:
travis.nix+13−6
@@ -18,20 +18,28 @@ let
1818
1919 ghcjsPkgs = with lib; reflexPlatform.${jsCompiler}.override {
2020 overrides = self: super: {
21− http-media = dontCheck super.http-media;
22− servant = dontCheck super.servant;
23− lens-aeson = dontCheck super.lens-aeson;
21+ http-media = dontCheck super.http-media;
22+ servant = do [ dontCheck doJailbreak ] super.servant;
2423 servant-reflex = lib.appendConfigureFlag
2524 (self.callPackage ./default.nix {}) "-fExample";
25+ uri-bytestring = doJailbreak super.uri-bytestring;
26+ http-api-data = dontHaddock super.http-api-data;
2627 };
2728 };
2829
2930 ghcPkgs = with lib; reflexPlatform.${nativeCompiler}.override {
3031 overrides = self: super: {
31− servant-snap = dontCheck ((import ./nix/servant-snap.nix {}) self super);
32+ heist = do [ doJailbreak dontCheck ] super.heist;
33+ http-media = dontCheck super.http-media;
34+ snap = doJailbreak (self.callHackage "snap" "1.1.1.0" {});
35+ hspec-webdriver = lib.appendPatch super.hspec-webdriver
36+ ./nix/hspec-webdriver.patch;
37+ hspec-snap = doJailbreak super.hspec-snap;
38+ snap-server = dontCheck super.snap-server;
39+ servant-snap = do [ dontCheck doJailbreak ] (self.callHackage "servant-snap" "0.8.1" {});
40+ skylighting = dontCheck super.skylighting;
3241 testdriver = self.callCabal2nix "testdriver" ./testdriver {};
3342 testserver = import nix/testserver.nix ghcjsPkgs.servant-reflex self super;
34− servant-reflex = self.callPackage ./default.nix {};
3543 };
3644 };
3745
@@ -48,7 +56,6 @@ in
4856 inherit reflexPlatform ghcPkgs ghcjsPkgs;
4957
5058 build = ghcjsPkgs.servant-reflex;
51− buildGhc = ghcPkgs.servant-reflex;
5259 testserver = ghcPkgs.testserver;
5360 testdriver = ghcPkgs.testdriver;
5461 inherit testresults;