packages feed

snap 0.6.0.2 → 0.7

raw patch · 12 files changed

+216/−116 lines, 12 filesdep +skeindep −aeson-nativedep ~aesondep ~attoparsecdep ~clientsessionPVP ok

version bump matches the API change (PVP)

Dependencies added: skein

Dependencies removed: aeson-native

Dependency ranges changed: aeson, attoparsec, clientsession, configurator, heist, snap-core, snap-server

API changes (from Hackage documentation)

+ Snap.Loader.Devel: loadSnapTH :: Q Exp -> Name -> [String] -> Q Exp
+ Snap.Snaplet: getRoutePattern :: Handler b v (Maybe ByteString)
+ Snap.Snaplet: setRoutePattern :: ByteString -> Handler b v ()
+ Snap.Snaplet.Heist: heistInit' :: FilePath -> TemplateState (Handler b b) -> SnapletInit b (Heist b)

Files

project_template/barebones/foo.cabal view
@@ -19,8 +19,8 @@     bytestring >= 0.9.1 && < 0.10,     MonadCatchIO-transformers >= 0.2.1 && < 0.3,     mtl >= 2 && < 3,-    snap-core   == 0.6.*,-    snap-server == 0.6.*+    snap-core   == 0.7.*,+    snap-server == 0.7.*    if impl(ghc >= 6.12.0)     ghc-options: -threaded -Wall -fwarn-tabs -funbox-strict-fields -O2
project_template/default/foo.cabal view
@@ -23,14 +23,14 @@     bytestring >= 0.9.1 && < 0.10,     data-lens >= 2.0.1 && < 2.1,     data-lens-template >= 2.1 && < 2.2,-    heist >= 0.6 && < 0.7,+    heist >= 0.7 && < 0.8,     MonadCatchIO-transformers >= 0.2.1 && < 0.3,     mtl >= 2 && < 3,-    snap == 0.6.*,-    snap-core   == 0.6.*,-    snap-server == 0.6.*,+    snap == 0.7.*,+    snap-core   == 0.7.*,+    snap-server == 0.7.*,     text >= 0.11 && < 0.12,-    time >= 1.1 && < 1.4,+    time >= 1.1 && < 1.5,     xmlhtml == 0.1.*    if flag(development)
project_template/tutorial/foo.cabal view
@@ -19,9 +19,9 @@     bytestring >= 0.9.1 && < 0.10,     MonadCatchIO-transformers >= 0.2.1 && < 0.3,     mtl >= 2 && < 3,-    snap        == 0.6.*,-    snap-core   == 0.6.*,-    snap-server == 0.6.*+    snap        == 0.7.*,+    snap-core   == 0.7.*,+    snap-server == 0.7.*    if impl(ghc >= 6.12.0)     ghc-options: -threaded -Wall -fwarn-tabs -funbox-strict-fields -O2
project_template/tutorial/src/Tutorial.lhs view
@@ -266,9 +266,11 @@  This completes a full working application.  We did leave out a little dummy code for the Foo and Bar snaplets.  This code is included in Part2.hs.  For-more information look in our API documentation.  No really, that wasn't a-joke.  The API docs are written as prose.  It is written to be very easy to-read, while having the benefit of including all the actual type signatures.+more information look in our [API+documentation](http://hackage.haskell.org/packages/archive/snap/0.6.0.2/doc/html/Snap-Snaplet.html).+No really, that wasn't a joke.  The API docs are written as prose.  It is+written to be very easy to read, while having the benefit of including all the+actual type signatures.  Filesystem Data and Automatic Installation ==========================================
snap.cabal view
@@ -1,5 +1,5 @@ name:           snap-version:        0.6.0.2+version:        0.7 synopsis:       Snap: A Haskell Web Framework: project starter executable and glue code library description:    Snap Framework project starter executable and glue code library license:        BSD3@@ -9,7 +9,7 @@ build-type:     Simple cabal-version:  >= 1.8 homepage:       http://snapframework.com/-category:       Web+category:       Web, Snap  extra-source-files:   CONTRIBUTORS,@@ -50,13 +50,10 @@ Library   hs-source-dirs: src -  if flag(hint)-    exposed-modules:-      Snap.Loader.Devel-   exposed-modules:     Snap,-    Snap.Loader.Prod+    Snap.Loader.Prod,+    Snap.Loader.Devel,     Snap.Snaplet,     Snap.Snaplet.Heist,     Snap.Snaplet.Auth,@@ -72,9 +69,6 @@     Data.RBAC.Internal.RoleMap,     Data.RBAC.Internal.Rule,     Data.RBAC.Internal.Types,-    Snap.Loader.Devel.Evaluator,-    Snap.Loader.Devel.Signal,-    Snap.Loader.Devel.TreeWatcher,     Snap.Snaplet.Auth.AuthManager,     Snap.Snaplet.Auth.Types,     Snap.Snaplet.Auth.Handlers,@@ -89,50 +83,59 @@     Snap.Snaplet.Session.SecureCookie,     Snap.Snaplet.Session.SessionManager -  if impl(ghc >= 7.0) && impl(ghc < 7.4)+  if flag(hint)+    other-modules:+      Snap.Loader.Devel.Evaluator,+      Snap.Loader.Devel.Signal,+      Snap.Loader.Devel.TreeWatcher++    cpp-options: -DHINT_ENABLED+     build-depends:-      aeson-native            >= 0.3     && < 0.4-  else+      hint                    >= 0.3.3.1 && < 0.4++  if !os(windows)     build-depends:-      aeson                   >= 0.3.2   && < 0.4+      unix                    >= 2.2.0.0 && < 2.6    build-depends:-    Crypto                    >= 4.2     && < 4.3,-    MonadCatchIO-transformers >= 0.2     && < 0.3,-    attoparsec                (>= 0.8.0.2 && < 0.9) ||-                              (>= 0.9.1.1 && < 0.10),-    base                      >= 4       && < 5,-    bytestring                >= 0.9.1   && < 0.10,-    cereal                    >= 0.3     && < 0.4,-    clientsession             >= 0.7.2   && < 0.8,-    configurator              >= 0.1     && < 0.2,-    containers                >= 0.3     && < 0.5,-    directory                 >= 1.0     && < 1.2,-    directory-tree            >= 0.10    && < 0.11,-    data-lens                 >= 2.0.1   && < 2.1,-    data-lens-template        >= 2.1     && < 2.2,-    filepath                  >= 1.1     && < 1.3,-    hashable                  >= 1.1     && < 1.2,-    heist                     >= 0.6     && < 0.7,-    logict                    >= 0.4.2   && < 0.6,-    mtl                       >  2.0     && < 2.1,-    mwc-random                >= 0.8     && < 0.11,-    old-time                  >= 1.0     && < 1.1,-    pwstore-fast              >= 2.2     && < 2.3,-    safe                      >= 0.3     && < 0.4,-    snap-core                 >= 0.6     && < 0.7,-    snap-server               >= 0.6     && < 0.7,-    stm                       >= 2.2     && < 2.3,-    syb                       >= 0.1     && < 0.4,-    template-haskell          >= 2.2     && < 2.7,-    text                      >= 0.11    && < 0.12,-    time                      >= 1.1     && < 1.5,-    transformers              >= 0.2     && < 0.3,-    unordered-containers      >= 0.1.4   && < 0.2,-    utf8-string               >= 0.3     && < 0.4,-    vector                    >= 0.7.1   && < 0.10,-    vector-algorithms         >= 0.4     && < 0.6,-    xmlhtml                   >= 0.1     && < 0.2+    Crypto                    >= 4.2      && < 4.3,+    MonadCatchIO-transformers >= 0.2      && < 0.3,+    aeson                     >= 0.4      && < 0.5,+    attoparsec                >= 0.10     && < 0.11,+    base                      >= 4        && < 5,+    bytestring                >= 0.9.1    && < 0.10,+    cereal                    >= 0.3      && < 0.4,+    clientsession             >= 0.7.3.6  && <0.8,+    configurator              >= 0.1      && < 0.3,+    containers                >= 0.3      && < 0.5,+    directory                 >= 1.0      && < 1.2,+    directory-tree            >= 0.10     && < 0.11,+    data-lens                 >= 2.0.1    && < 2.1,+    data-lens-template        >= 2.1      && < 2.2,+    filepath                  >= 1.1      && < 1.3,+    hashable                  >= 1.1      && < 1.2,+    heist                     >= 0.7      && < 0.8,+    logict                    >= 0.4.2    && < 0.6,+    mtl                       >  2.0      && < 2.1,+    mwc-random                >= 0.8      && < 0.11,+    old-time                  >= 1.0      && < 1.1,+    pwstore-fast              >= 2.2      && < 2.3,+    safe                      >= 0.3      && < 0.4,+    skein                     >= 0.1.0.3  && < 0.2,+    snap-core                 >= 0.7      && < 0.8,+    snap-server               >= 0.7      && < 0.8,+    stm                       >= 2.2      && < 2.3,+    syb                       >= 0.1      && < 0.4,+    template-haskell          >= 2.2      && < 2.7,+    text                      >= 0.11     && < 0.12,+    time                      >= 1.1      && < 1.5,+    transformers              >= 0.2      && < 0.3,+    unordered-containers      >= 0.1.4    && < 0.2,+    utf8-string               >= 0.3      && < 0.4,+    vector                    >= 0.7.1    && < 0.10,+    vector-algorithms         >= 0.4      && < 0.6,+    xmlhtml                   >= 0.1      && < 0.2    extensions:     BangPatterns,@@ -153,14 +156,6 @@     TypeOperators,     TypeSynonymInstances -  if flag(hint)-    build-depends:-      hint                    >= 0.3.3.1 && < 0.4--  if !os(windows)-    build-depends:-      unix                    >= 2.2.0.0 && < 2.6-   if impl(ghc >= 6.12.0)     ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2                  -fno-warn-orphans -fno-warn-unused-do-bind@@ -182,7 +177,7 @@     directory-tree      >= 0.10    && < 0.11,     filepath            >= 1.1     && < 1.3,     old-time            >= 1.0     && < 1.1,-    snap-server         >= 0.6     && < 0.7,+    snap-server         >= 0.7     && < 0.8,     template-haskell    >= 2.2     && < 2.7,     text                >= 0.11    && < 0.12 
src/Snap/Loader/Devel.hs view
@@ -1,4 +1,5 @@ {-# LANGUAGE TemplateHaskell #-}+{-# LANGUAGE CPP #-} -- | This module includes the machinery necessary to use hint to load -- action code dynamically.  It includes a Template Haskell function -- to gather the necessary compile-time information about code@@ -8,6 +9,7 @@   ( loadSnapTH   ) where +#ifdef HINT_ENABLED import           Control.Monad (liftM2)  import           Data.Char (isAlphaNum)@@ -23,11 +25,13 @@  import           System.Environment (getArgs) ------------------------------------------------------------------------------- import           Snap.Core import           Snap.Loader.Devel.Signal import           Snap.Loader.Devel.Evaluator import           Snap.Loader.Devel.TreeWatcher+#else+import           Language.Haskell.TH+#endif  ------------------------------------------------------------------------------ -- | This function derives all the information necessary to use the@@ -62,14 +66,20 @@            -> [String] -- ^ a list of directories to watch in addition                        -- to those containing code            -> Q Exp+#ifndef HINT_ENABLED+loadSnapTH _ _ _ = fail $ "Snap was built without hint support.  Hint " +++                   "support is necessary for development mode.  " +++                   "Please reinstall snap with hint support.\n\n " +++                   "  cabal install snap -fhint\n\n"+#else loadSnapTH initializer action additionalWatchDirs = do     args <- runIO getArgs      let opts = getHintOpts args         srcPaths = additionalWatchDirs ++ getSrcPaths args -    -- The first line is an extra type check to ensure the provided-    -- names refer to expressions with the correct types+    -- The first line is an extra type check to ensure the arguments+    -- provided have the the correct types     [| do let _ = $initializer >>= $(varE action)           v <- $initializer           (handler, cleanup) <- hintSnap opts actMods srcPaths loadStr v@@ -178,3 +188,4 @@ format (WontCompile errs) = "Compile errors:\r\n\r\n" ++     (intercalate "\r\n" $ nub $ map errMsg errs) +#endif
src/Snap/Snaplet.hs view
@@ -64,6 +64,8 @@   , getSnapletDescription   , getSnapletUserConfig   , getSnapletRootURL+  , getRoutePattern+  , setRoutePattern    -- * Snaplet state manipulation   -- $snapletState@@ -183,7 +185,7 @@ -- > -- snapletValue is defined in the framework: -- > snapletValue :: Lens (Snaplet a) a -- >--- > appQuuxLens :: Lens App (Snaplet Quux)+-- > appQuuxLens :: Lens App Quux -- > appQuuxLens = quux . snapletValue . foo -- -- Lens composition is very similar to function composition, but it gives you
src/Snap/Snaplet/Heist.hs view
@@ -14,6 +14,7 @@   -- * Initializer Functions   -- $initializerSection   , heistInit+  , heistInit'   , addTemplates   , addTemplatesAt   , modifyHeistTS@@ -52,7 +53,8 @@ import           Snap.Snaplet  import qualified Snap.Snaplet.HeistNoClass as Unclassed-import           Snap.Snaplet.HeistNoClass (Heist, heistInit, clearHeistCache)+import           Snap.Snaplet.HeistNoClass (Heist, heistInit+                                           ,heistInit', clearHeistCache)   ------------------------------------------------------------------------------@@ -67,7 +69,7 @@ -- > instance HasHeist App where heistLens = subSnaplet heist -- > -- > appInit = makeSnaplet "app" "" Nothing $ do--- >     h <- nestSnaplet "heist" $ heistInit "templates"+-- >     h <- nestSnaplet "heist" heist $ heistInit "templates" -- >     addSplices myAppSplices -- >     return $ App h class HasHeist b where@@ -85,21 +87,31 @@ -- | Adds templates to the Heist TemplateState.  Other snaplets should use -- this function to add their own templates.  The templates are automatically -- read from the templates directory in the current snaplet's filesystem root.-addTemplates :: HasHeist b => ByteString -> Initializer b v ()+addTemplates :: HasHeist b+             => ByteString+             -- ^ Path to templates (also the url prefix for their routes)+             -> Initializer b v () addTemplates pfx = withTop' heistLens (Unclassed.addTemplates pfx)   ------------------------------------------------------------------------------ -- | Adds templates to the Heist TemplateState, and lets you specify where -- they are found in the filesystem.-addTemplatesAt :: HasHeist b => ByteString -> FilePath -> Initializer b v ()+addTemplatesAt :: HasHeist b+               => ByteString+               -- ^ URL prefix for template routes+               -> FilePath+               -- ^ Path to templates+               -> Initializer b v () addTemplatesAt pfx p = withTop' heistLens (Unclassed.addTemplatesAt pfx p)   ------------------------------------------------------------------------------ -- | Allows snaplets to add splices. addSplices :: (HasHeist b)-           => [(Text, Unclassed.SnapletSplice b v)] -> Initializer b v ()+           => [(Text, Unclassed.SnapletSplice b v)]+           -- ^ Splices to bind+           -> Initializer b v () addSplices = Unclassed.addSplices' heistLens  @@ -109,6 +121,7 @@ -- like the cache tag. modifyHeistTS :: (HasHeist b)               => (TemplateState (Handler b b) -> TemplateState (Handler b b))+              -- ^ TemplateState modifying function               -> Initializer b v () modifyHeistTS = Unclassed.modifyHeistTS' heistLens @@ -117,6 +130,7 @@ -- | Runs a function on with the Heist snaplet's 'TemplateState'. withHeistTS :: (HasHeist b)             => (TemplateState (Handler b b) -> a)+            -- ^ TemplateState function to run             -> Handler b v a withHeistTS = Unclassed.withHeistTS' heistLens @@ -129,14 +143,22 @@ ------------------------------------------------------------------------------ -- | Renders a template as text\/html. If the given template is not found, -- this returns 'empty'.-render :: HasHeist b => ByteString -> Handler b v ()+render :: HasHeist b+       => ByteString+       -- ^ Template name+       -> Handler b v () render t = withTop' heistLens (Unclassed.render t)   ------------------------------------------------------------------------------ -- | Renders a template as the given content type.  If the given template -- is not found, this returns 'empty'.-renderAs :: HasHeist b => ByteString -> ByteString -> Handler b v ()+renderAs :: HasHeist b+         => ByteString+         -- ^ Content type to render with+         -> ByteString+         -- ^ Template name+         -> Handler b v () renderAs ct t = withTop' heistLens (Unclassed.renderAs ct t)  @@ -150,7 +172,10 @@ ------------------------------------------------------------------------------ -- | Analogous to 'fileServeSingle'. If the given template is not found, -- this throws an error.-heistServeSingle :: HasHeist b => ByteString -> Handler b v ()+heistServeSingle :: HasHeist b+                 => ByteString+                 -- ^ Template name+                 -> Handler b v () heistServeSingle t = withTop' heistLens (Unclassed.heistServeSingle t)  @@ -159,7 +184,9 @@ -- a common combination of heistLocal, bindSplices, and render. renderWithSplices :: HasHeist b                   => ByteString+                  -- ^ Template name                   -> [(Text, Unclassed.SnapletSplice b v)]+                  -- ^ Splices to bind                   -> Handler b v () renderWithSplices = Unclassed.renderWithSplices' heistLens @@ -169,7 +196,9 @@ -- 'TemplateState'. withSplices :: HasHeist b             => [(Text, Unclassed.SnapletSplice b v)]+            -- ^ Splices to bind             -> Handler b v a+            -- ^ Handler to run             -> Handler b v a withSplices = Unclassed.withSplices' heistLens @@ -182,7 +211,9 @@ -- > heistLocal (bindSplices mySplices) handlerThatNeedsSplices heistLocal :: HasHeist b            => (TemplateState (Handler b b) -> TemplateState (Handler b b))+           -- ^ TemplateState modifying function            -> Handler b v a+            -- ^ Handler to run            -> Handler b v a heistLocal = Unclassed.heistLocal' heistLens 
src/Snap/Snaplet/HeistNoClass.hs view
@@ -7,6 +7,7 @@ module Snap.Snaplet.HeistNoClass   ( Heist   , heistInit+  , heistInit'   , clearHeistCache    , addTemplates@@ -203,33 +204,65 @@   --------------------------------------------------------------------------------- | The 'Initializer' for 'Heist'.+-- | The 'Initializer' for 'Heist'.  This function is a convenience wrapper+-- around `heistInit'` that uses the default `emptyTemplateState` from Heist+-- and sets up routes for all the templates. heistInit :: FilePath+           -- ^ Path to templates           -> SnapletInit b (Heist b)-heistInit templateDir =+heistInit templateDir = do     makeSnaplet "heist" "" Nothing $ do-        (cacheFunc, cts) <- liftIO mkCacheTag-        let origTs = cacheFunc emptyTemplateState-        ts <- liftIO $ loadTemplates templateDir origTs >>=-                       either error return+        hs <- heistInitWorker templateDir emptyTemplateState         addRoutes [ ("", heistServe) ]-        printInfo $ T.pack $ unwords-            [ "...loaded"-            , (show $ length $ templateNames ts)-            , "templates"-            ]+        return hs -        return $ Heist ts cts +------------------------------------------------------------------------------+-- | A lower level 'Initializer' for 'Heist'.  This initializer requires you+-- to specify the initial TemplateState.  It also does not add any routes for+-- templates, allowing you complete control over which templates get routed.+heistInit' :: FilePath+           -- ^ Path to templates+           -> TemplateState (Handler b b)+           -- ^ Initial TemplateState+           -> SnapletInit b (Heist b)+heistInit' templateDir initialTemplateState =+    makeSnaplet "heist" "" Nothing $+        heistInitWorker templateDir initialTemplateState -addTemplates :: ByteString -> Initializer b (Heist b) ()++------------------------------------------------------------------------------+-- | Internal worker function used by variantsof heistInit.  This is necessary+-- because of the divide between SnapletInit and Initializer.+heistInitWorker :: FilePath+                -> TemplateState (Handler b b)+                -> Initializer b v (Heist b)+heistInitWorker templateDir initialTemplateState = do+    (cacheFunc, cts) <- liftIO mkCacheTag+    let origTs = cacheFunc initialTemplateState+    ts <- liftIO $ loadTemplates templateDir origTs >>=+                   either error return+    printInfo $ T.pack $ unwords+        [ "...loaded"+        , (show $ length $ templateNames ts)+        , "templates"+        ]++    return $ Heist ts cts+++addTemplates :: ByteString+             -- ^ Path to templates (also the url prefix for their routes)+             -> Initializer b (Heist b) () addTemplates urlPrefix = do     snapletPath <- getSnapletFilePath     addTemplatesAt urlPrefix (snapletPath </> "templates")   addTemplatesAt :: ByteString+               -- ^ URL prefix for template routes                -> FilePath+               -- ^ Path to templates                -> Initializer b (Heist b) () addTemplatesAt urlPrefix templateDir = do     ts <- liftIO $ loadTemplates templateDir emptyTemplateState
src/Snap/Snaplet/Internal/Initializer.hs view
@@ -347,8 +347,14 @@ addRoutes rs = do     l <- getLens     ctx <- iGets (_scRouteContext . _curConfig)-    let rs' = map (\(r,h) -> (buildPath (r:ctx), withTop' l h)) rs+    let modRoute (r,h) = ( buildPath (r:ctx)+                         , setPattern r >> withTop' l h)+    let rs' = map modRoute rs     iModify (\v -> modL handlers (++rs') v)+  where+    setPattern r = do+      p <- getRoutePattern+      when (isNothing p) $ setRoutePattern r   ------------------------------------------------------------------------------@@ -431,7 +437,8 @@ runInitializer mvar b@(Initializer i) = do     userConfig <- load [Optional "snaplet.cfg"]     let builtinHandlers = [("/admin/reload", reloadSite)]-    let cfg = SnapletConfig [] "" Nothing "" userConfig [] (mkReloader mvar b)+    let cfg = SnapletConfig [] "" Nothing "" userConfig [] Nothing+                            (mkReloader mvar b)     logRef <- newIORef ""     ((res, s), (Hook hook)) <- runWriterT $ LT.runLensT i id $         InitializerState True (return ()) builtinHandlers id cfg logRef
src/Snap/Snaplet/Internal/Types.hs view
@@ -7,9 +7,9 @@  module Snap.Snaplet.Internal.Types where -import           Prelude hiding ((.))+import           Prelude hiding ((.), id) import           Control.Applicative-import           Control.Category ((.))+import           Control.Category ((.), id) import           Control.Monad.CatchIO hiding (Handler) import           Control.Monad.Reader import           Control.Monad.State.Class@@ -40,6 +40,9 @@     , _scDescription     :: Text     , _scUserConfig      :: Config     , _scRouteContext    :: [ByteString]+    , _scRoutePattern    :: Maybe ByteString+    -- ^ Holds the actual route pattern passed to addRoutes for the current+    -- handler.  Nothing during initialization and before route dispatech.     , _reloader          :: IO (Either String String) -- might change     } @@ -250,6 +253,22 @@     with' !l (Handler !m) = Handler $ L.with l m     withTop' !l (Handler m) = Handler $ L.withTop l m     getOpaqueConfig = Handler $ gets _snapletConfig+++------------------------------------------------------------------------------+-- | Gets the route pattern that matched for the handler.  This lets you find+-- out exactly which of the strings you used in addRoutes matched.+getRoutePattern :: Handler b v (Maybe ByteString)+getRoutePattern = withTop' id $ liftM _scRoutePattern getOpaqueConfig+++------------------------------------------------------------------------------+-- | Sets the route pattern that matched for the handler.  Use this when to+-- override the default pattern which is the key to the alist passed to+-- addRoutes.+setRoutePattern :: ByteString -> Handler b v ()+setRoutePattern p = withTop' id $+    modifySnapletState (setL (scRoutePattern . snapletConfig) (Just p))   ------------------------------------------------------------------------------
test/snap-testsuite.cabal view
@@ -12,7 +12,7 @@     HUnit                      >= 1.2 && < 2,     MonadCatchIO-transformers  >= 0.2 && < 0.3,     QuickCheck                 >= 2.3.0.2,-    attoparsec                 (>= 0.8   && < 0.10),+    attoparsec                 >= 0.10 && <0.11,     base                       >= 4 && < 5,     bytestring                 >= 0.9 && < 0.10,     containers                 >= 0.3,@@ -21,12 +21,12 @@     directory,     directory-tree             >= 0.10 && < 0.11,     filepath,-    heist                      >= 0.6 && < 0.7,-    http-enumerator            >= 0.6.5.3 && < 0.8,+    heist                      >= 0.7 && < 0.8,+    http-enumerator            >= 0.7.1.7 && < 0.8,     mtl                        >= 2,     process                    == 1.*,-    snap-core                  >= 0.6 && < 0.7,-    snap-server                >= 0.6 && < 0.7,+    snap-core                  >= 0.7 && < 0.8,+    snap-server                >= 0.7 && < 0.8,     test-framework             >= 0.4 && < 0.5,     test-framework-hunit       >= 0.2.5 && < 0.3,     test-framework-quickcheck2 >= 0.2.6 && < 0.3,@@ -66,12 +66,12 @@    build-depends:     MonadCatchIO-transformers  >= 0.2 && < 0.3,-    attoparsec                 (>= 0.8   && < 0.10),+    attoparsec                 >= 0.10 && <0.11,     base                       >= 4 && < 5,     bytestring                 >= 0.9 && < 0.10,     cereal                     >= 0.3,-    clientsession              >= 0.6.0,-    configurator               == 0.1.*,+    clientsession              >= 0.7.3.6 && <0.8,+    configurator               >= 0.1 && < 0.3,     containers                 >= 0.3,     data-lens                  >= 2.0.1 && < 2.1,     data-lens-template         >= 2.1.1 && < 2.2,@@ -79,12 +79,12 @@     directory-tree             >= 0.10 && < 0.11,     filepath,     hashable                   >= 1.1,-    heist                      >= 0.6 && < 0.7,+    heist                      >= 0.7 && < 0.8,     mtl                        >= 2,     mwc-random                 >= 0.8,     process                    == 1.*,-    snap-core                  >= 0.6 && < 0.7,-    snap-server                >= 0.6 && < 0.7,+    snap-core                  >= 0.7 && < 0.8,+    snap-server                >= 0.7 && < 0.8,     syb                        >= 0.1,     time                       >= 1.1,     text                       >= 0.11 && < 0.12,@@ -122,7 +122,7 @@    build-depends:     MonadCatchIO-transformers  >= 0.2 && < 0.3,-    attoparsec                 (>= 0.8   && < 0.10),+    attoparsec                 >= 0.10 && <0.11,     base                       >= 4 && < 5,     bytestring                 >= 0.9 && < 0.10,     containers                 >= 0.3,@@ -131,11 +131,11 @@     directory,     directory-tree             >= 0.10 && < 0.11,     filepath,-    heist                      >= 0.6 && < 0.7,+    heist                      >= 0.7 && < 0.8,     mtl                        >= 2,     process                    == 1.*,-    snap-core                  >= 0.6 && < 0.7,-    snap-server                >= 0.6 && < 0.7,+    snap-core                  >= 0.7 && < 0.8,+    snap-server                >= 0.7 && < 0.8,     text                       >= 0.11 && < 0.12,     transformers               >= 0.2,     utf8-string                >= 0.3   && < 0.4,