Cabal revisions of nested-routes-2.0.0
Hackage metadata revisions edit the .cabal file after upload; each diff below is one revision.
revision 1
-Name: nested-routes-Version: 2.0.0-Author: Athan Clark <athan.clark@gmail.com>-Maintainer: Athan Clark <athan.clark@gmail.com>-License: BSD3-License-File: LICENSE-Synopsis: Declarative, compositional Wai responses-Category: Web-Description:- A method to writing Wai responses- .- This library attempts to make it easier to write nice Wai response handlers- by giving us a Sinatra/- <https://hackage.haskell.org/package/scotty Scotty>-like syntax for declaring HTTP-verb oriented- routes, in addition to file-extension handling and rose-tree like composition.- Not only do we have literal route specification, like- <https://hackage.haskell.org/package/scotty Scotty> &- <https://hackage.haskell.org/package/spock Spock>, but we- can also embed- <https://hackage.haskell.org/package/attoparsec Attoparsec>- parsers and <https://hackage.haskell.org/package/regex-compat Regular Expressions>- /directly/ in our routes, with our handlers- reflecting their results. As an example:- .- > router :: Application- > router = route handlers- > where- > handlers = do- > handle o- > (get $ text "home")- > Nothing- > handle ("foo" </> "bar")- > (get $ text "foobar") $ Just $- > handle (p ("baz", double) </> o)- > (\d -> get $ text $ LT.pack (show d) <> " bazs")- > Nothing- > handle (p ("num",double) </> o)- > (\d -> get $ text $ LT.pack $ show d) $ Just $ do- > handle "bar"- > (\d -> get $ do- > text $ (LT.pack $ show d) <> " bars")- > json $ (LT.pack $ show d) <> " bars!")- > Nothing- > handle (r ("email", mkRegex "(^[-a-zA-Z0-9_.]+@[-a-zA-Z0-9]+\\.[-a-zA-Z0-9.]+$)") </> o)- > (\d e -> get $ textOnly $ (LT.pack $ show d) <> " " <> (LT.pack $ show e)- .- The route specification syntax is a little strange right now - @l@ specifies- a "literal chunk" of a handlable url (ie - @l \"foo\" \<\/\> l \"bar\" \<\/\> o@ would- represent the url @\/foo\/bar@), while @p@ represents a "parsable" url chunk,- which expects a pair - the left element being merely a reference name for the- parser during internal plumbing, and the right being the actual @Parser@. @o@ represents- the end of a url string, and can be used alone in a handler to capture requests- to the root path.- .- Each route being handled needs some kind of content. For every parsed url chunk,- the route expects a function- of arity matching 1-for-1 with the parsed contents. For example, @\d -> ...@ in the- demonstration above is such a function, where @d :: Double@.- .- Internally, we match against both the file extension and Accept headers in the- HTTP request - the Accept header may override the file extension.- .- When we test our application:- .- > λ> curl localhost:3000/ -H "Accept: text/plain, */*"- > ↪ "home"- .- requests may end with index- .- > λ> curl localhost:3000/index -H "Accept: text/plain, */*"- > ↪ "home"- .- and specify the file extension- .- > λ> curl localhost:3000/index.txt -H "Accept: text/plain, */*"- > ↪ "home"- .- each responding with the "closest" available file type- .- > λ> curl localhost:3000/index.html -H "Accept: text/html, */*"- > ↪ "home"- .- > λ> curl localhost:3000/foo/bar -H "Accept: text/plain, */*"- > ↪ "foobar"- .- > λ> curl localhost:3000/foo/bar.txt -H "Accept: text/plain, */*"- > ↪ "foobar"- .- > λ> curl localhost:3000/foo/bar/5678.5678 -H "Accept: text/plain, */*"- > ↪ "5678.5678 bazs"- .- > λ> curl localhost:3000/1234.1234 -H "Accept: text/plain, */*"- > ↪ "1234.1234"- .- > λ> curl localhost:3000/2e5 -H "Accept: text/plain, */*"- > ↪ "200000.0"- .- > λ> curl localhost:3000/1234.1234/bar -H "Accept: text/plain, */*"- > ↪ "1234.1234 bars"--Cabal-Version: >= 1.10-Build-Type: Simple--Library- Default-Language: Haskell2010- HS-Source-Dirs: src- GHC-Options: -Wall- Exposed-Modules: Web.Routes.Nested- Web.Routes.Nested.Types- Web.Routes.Nested.Types.UrlChunks- Web.Routes.Nested.VerbListener- Web.Routes.Nested.FileExtListener- Web.Routes.Nested.FileExtListener.Types- Web.Routes.Nested.FileExtListener.Text- Web.Routes.Nested.FileExtListener.Json- Web.Routes.Nested.FileExtListener.Builder- Web.Routes.Nested.FileExtListener.Blaze- Web.Routes.Nested.FileExtListener.ByteString- Web.Routes.Nested.FileExtListener.Lucid- Web.Routes.Nested.FileExtListener.Clay- Web.Routes.Nested.FileExtListener.Julius- Web.Routes.Nested.FileExtListener.Lucius- Web.Routes.Nested.FileExtListener.Cassius- Build-Depends: base >= 4.6 && < 5- , wai- , wai-extra- , wai-util- , http-types- , http-media- , mtl- , transformers- , witherable- , composition- , semigroups- , constraints- , containers- , text- , aeson- , blaze-html- , lucid- , shakespeare- , clay- , bytestring- , attoparsec- , regex-compat- , pred-trie >= 0.1- , poly-arity >= 0.0.4--Test-Suite spec- Type: exitcode-stdio-1.0- Default-Language: Haskell2010- Hs-Source-Dirs: src- , test- Ghc-Options: -Wall- Main-Is: Spec.hs- Build-Depends: base- , hspec- , QuickCheck- , quickcheck-instances--Source-Repository head- Type: git- Location: git://github.com/athanclark/nested-routes.git+Name: nested-routes +Version: 2.0.0 +x-revision: 1 +Author: Athan Clark <athan.clark@gmail.com> +Maintainer: Athan Clark <athan.clark@gmail.com> +License: BSD3 +License-File: LICENSE +Synopsis: Declarative, compositional Wai responses +Category: Web +Description: + A method to writing Wai responses + . + This library attempts to make it easier to write nice Wai response handlers + by giving us a Sinatra/ + <https://hackage.haskell.org/package/scotty Scotty>-like syntax for declaring HTTP-verb oriented + routes, in addition to file-extension handling and rose-tree like composition. + Not only do we have literal route specification, like + <https://hackage.haskell.org/package/scotty Scotty> & + <https://hackage.haskell.org/package/spock Spock>, but we + can also embed + <https://hackage.haskell.org/package/attoparsec Attoparsec> + parsers and <https://hackage.haskell.org/package/regex-compat Regular Expressions> + /directly/ in our routes, with our handlers + reflecting their results. As an example: + . + > router :: Application + > router = route handlers + > where + > handlers = do + > handle o + > (Just $ get $ text "home") + > Nothing + > handle ("foo" </> "bar") + > (Just $ get $ text "foobar") $ Just $ + > handle (p ("baz", double) </> o) + > (Just $ \d -> get $ text $ LT.pack (show d) <> " bazs") + > Nothing + > handle (p ("num",double) </> o) + > (Just $ \d -> get $ text $ LT.pack $ show d) $ Just $ do + > handle "bar" + > (Just $ \d -> get $ do + > text $ (LT.pack $ show d) <> " bars") + > json $ (LT.pack $ show d) <> " bars!") + > Nothing + > handle (r ("email", mkRegex "(^[-a-zA-Z0-9_.]+@[-a-zA-Z0-9]+\\.[-a-zA-Z0-9.]+$)") </> o) + > (Just $ \d e -> get $ textOnly $ (LT.pack $ show d) <> " " <> (LT.pack $ show e) + . + The route specification syntax is a little strange right now - @l@ specifies + a "literal chunk" of a handlable url (ie - @l \"foo\" \<\/\> l \"bar\" \<\/\> o@ would + represent the url @\/foo\/bar@), while @p@ represents a "parsable" url chunk, + which expects a pair - the left element being merely a reference name for the + parser during internal plumbing, and the right being the actual @Parser@. @o@ represents + the end of a url string, and can be used alone in a handler to capture requests + to the root path. + . + Each route being handled needs some kind of content. For every parsed url chunk, + the route expects a function + of arity matching 1-for-1 with the parsed contents. For example, @\d -> ...@ in the + demonstration above is such a function, where @d :: Double@. + . + Internally, we match against both the file extension and Accept headers in the + HTTP request - the Accept header may override the file extension. + . + When we test our application: + . + > λ> curl localhost:3000/ -H "Accept: text/plain, */*" + > ↪ "home" + . + requests may end with index + . + > λ> curl localhost:3000/index -H "Accept: text/plain, */*" + > ↪ "home" + . + and specify the file extension + . + > λ> curl localhost:3000/index.txt -H "Accept: text/plain, */*" + > ↪ "home" + . + each responding with the "closest" available file type + . + > λ> curl localhost:3000/index.html -H "Accept: text/html, */*" + > ↪ "home" + . + > λ> curl localhost:3000/foo/bar -H "Accept: text/plain, */*" + > ↪ "foobar" + . + > λ> curl localhost:3000/foo/bar.txt -H "Accept: text/plain, */*" + > ↪ "foobar" + . + > λ> curl localhost:3000/foo/bar/5678.5678 -H "Accept: text/plain, */*" + > ↪ "5678.5678 bazs" + . + > λ> curl localhost:3000/1234.1234 -H "Accept: text/plain, */*" + > ↪ "1234.1234" + . + > λ> curl localhost:3000/2e5 -H "Accept: text/plain, */*" + > ↪ "200000.0" + . + > λ> curl localhost:3000/1234.1234/bar -H "Accept: text/plain, */*" + > ↪ "1234.1234 bars" + +Cabal-Version: >= 1.10 +Build-Type: Simple + +Library + Default-Language: Haskell2010 + HS-Source-Dirs: src + GHC-Options: -Wall + Exposed-Modules: Web.Routes.Nested + Web.Routes.Nested.Types + Web.Routes.Nested.Types.UrlChunks + Web.Routes.Nested.VerbListener + Web.Routes.Nested.FileExtListener + Web.Routes.Nested.FileExtListener.Types + Web.Routes.Nested.FileExtListener.Text + Web.Routes.Nested.FileExtListener.Json + Web.Routes.Nested.FileExtListener.Builder + Web.Routes.Nested.FileExtListener.Blaze + Web.Routes.Nested.FileExtListener.ByteString + Web.Routes.Nested.FileExtListener.Lucid + Web.Routes.Nested.FileExtListener.Clay + Web.Routes.Nested.FileExtListener.Julius + Web.Routes.Nested.FileExtListener.Lucius + Web.Routes.Nested.FileExtListener.Cassius + Build-Depends: base >= 4.6 && < 5 + , wai + , wai-extra + , wai-util + , http-types + , http-media + , mtl + , transformers + , witherable + , composition + , semigroups + , constraints + , containers + , text + , aeson + , blaze-html + , lucid + , shakespeare + , clay + , bytestring + , attoparsec + , regex-compat + , pred-trie >= 0.1 + , poly-arity >= 0.0.4 + +Test-Suite spec + Type: exitcode-stdio-1.0 + Default-Language: Haskell2010 + Hs-Source-Dirs: src + , test + Ghc-Options: -Wall + Main-Is: Spec.hs + Build-Depends: base + , hspec + , QuickCheck + , quickcheck-instances + +Source-Repository head + Type: git + Location: git://github.com/athanclark/nested-routes.git