wai-routing 0.11.1 → 0.12
raw patch · 4 files changed
+34/−12 lines, 4 filesdep +containersdep ~wai-route
Dependencies added: containers
Dependency ranges changed: wai-route
Files
- CHANGELOG.md +5/−0
- src/Network/Wai/Routing/Route.hs +19/−7
- test/Tests/Wai/Route.hs +7/−3
- wai-routing.cabal +3/−2
CHANGELOG.md view
@@ -1,3 +1,8 @@+0.12+-----------------------------------------------------------------------------+- Update `wai-route` dependency and change `prepare` and `route` to work on+ `Tree (App m)` instead of `[(ByteString, App m)]`.+ 0.11.1 ----------------------------------------------------------------------------- - Bugfix release
src/Network/Wai/Routing/Route.hs view
@@ -29,6 +29,16 @@ , patch , Renderer , renderer++ -- * Re-exports+ , Tree+ , Tree.toList+ , Tree.foldTree+ , Tree.mapTree++ , Tree.Payload+ , Tree.path+ , Tree.value ) where import Control.Applicative hiding (Const)@@ -44,6 +54,7 @@ import Network.Wai import Network.Wai.Predicate import Network.Wai.Predicate.Request+import Network.Wai.Route.Tree (Tree) import Network.Wai.Routing.Request import qualified Data.ByteString.Char8 as C@@ -184,11 +195,11 @@ -- | Routes requests to handlers based on predicated route declarations. -- Note that @route (prepare ...)@ behaves like a WAI 'Application' generalised to -- arbitrary monads.-route :: Monad m => [(ByteString, App m)] -> Request -> Continue m -> m ResponseReceived-route rm = let !tr = Tree.fromList rm in \rq k ->+route :: Monad m => Tree (App m) -> Request -> Continue m -> m ResponseReceived+route tr rq k = case Tree.lookup tr (Tree.segments $ rawPathInfo rq) of- Just (f, v) -> f (fromReq v (fromRequest rq)) k- Nothing -> k notFound+ Just e -> Tree.value e (fromReq (Tree.captured $ Tree.captures e) (fromRequest rq)) k+ Nothing -> k notFound where notFound = responseLBS status404 [] Lazy.empty @@ -212,10 +223,11 @@ {-# INLINE continue #-} -- | Run the 'Routes' monad and return the handlers per path.-prepare :: Monad m => Routes a m b -> [(ByteString, App m)]+prepare :: Monad m => Routes a m b -> Tree (App m) prepare (Routes rr) =- let s = execState rr zero in- map (\g -> (_path (L.head g), select (renderfn s) g)) (normalise (routes s))+ let s = execState rr zero+ r = normalise (routes s)+ in Tree.fromList $ map (\g -> (_path (L.head g), select (renderfn s) g)) r -- | Group routes by path. normalise :: [Route a m] -> [[Route a m]]
test/Tests/Wai/Route.hs view
@@ -22,6 +22,7 @@ import Test.Tasty.HUnit import Tests.Wai.Util +import qualified Data.Set as Set import qualified Data.ByteString.Lazy as Lazy type ApplicationM m = Request -> (Response -> m ResponseReceived) -> m ResponseReceived@@ -38,8 +39,11 @@ let routes = prepare sitemap [7,6,5,4,3,2,1,0] @=? map routeMeta (examine sitemap)- ["/a", "/b", "/c", "/d", "/e", "/f", "/g", "/h"] @=? map fst routes + let ra = Set.fromList ["/a", "/b", "/c", "/d", "/e", "/f", "/g", "/h"]+ let rb = foldTree (\p a -> path p `Set.insert` a) Set.empty routes+ ra @=? rb+ let handler = route routes testEndpointA handler@@ -231,7 +235,7 @@ testMedia :: IO () testMedia = do- let [(_, h)] = prepare sitemapMedia+ let [h] = map value . toList $ prepare sitemapMedia expectMedia "application/json;q=0.3, application/x-thrift;q=0.7" "application/x-thrift" h expectMedia "application/json;q=0.7, application/x-thrift;q=0.3" "application/json" h @@ -257,7 +261,7 @@ testErrorRenderer :: IO () testErrorRenderer = do- let [(_, h)] = prepare sitemapErrorRenderer+ let [h] = map value . toList $ prepare sitemapErrorRenderer let rq = defaultRequest { rawPathInfo = "/error" } rs <- apply h $ fromReq [] . fromRequest $ rq status400 @=? responseStatus rs
wai-routing.cabal view
@@ -1,5 +1,5 @@ name: wai-routing-version: 0.11.1+version: 0.12 synopsis: Declarative routing for WAI. license: OtherLicense license-file: LICENSE@@ -86,7 +86,7 @@ , transformers >= 0.3 && < 0.5 , wai >= 3.0 && < 4.0 , wai-predicates == 0.8.*- , wai-route == 0.2.*+ , wai-route == 0.3.* test-suite wai-routing-tests type: exitcode-stdio-1.0@@ -106,6 +106,7 @@ , bytestring , bytestring-conversion , case-insensitive+ , containers , http-types , tasty >= 0.8 , tasty-hunit >= 0.9