<commit_before>homepage: https://ajnsit.github.io/wai-routes/
changelog-type: ''
hash: 9aa8e55b5f48c3ba6cc71334014528a1d77751459711a8210fd5b29b34563dc0
test-bench-deps:
  wai: ! '>=3.0 && <3.3'
  hspec-wai-json: ! '>=0.6 && <0.9'
  base: ! '>=4.7 && <4.10'
  hspec: ! '>=2.1 && <2.5'
  text: ! '>=1.2 && <1.3'
  hspec-wai: ! '>=0.6 && <0.9'
  wai-routes: -any
  aeson: ! '>=0.8 && <1.2'
maintainer: <EMAIL>
synopsis: Typesafe URLs for Wai applications.
changelog: ''
basic-deps:
  cookie: ! '>=0.4 && <0.5'
  bytestring: ! '>=0.10 && <0.11'
  wai: ! '>=3.0 && <3.3'
  case-insensitive: ! '>=1.2 && <1.3'
  base: ! '>=4.7 && <4.10'
  data-default-class: ! '>=0.0 && <0.2'
  text: ! '>=1.2 && <1.3'
  monad-loops: ! '>=0.4 && <0.5'
  filepath: ! '>=1.3 && <1.5'
  path-pieces: ! '>=0.2 && <0.3'
  containers: ! '>=0.5 && <0.6'
  blaze-builder: ! '>=0.4 && <0.5'
  vault: ! '>=0.3 && <0.4'
  mime-types: ! '>=0.1 && <0.2'
  mtl: ! '>=2.1 && <2.3'
  wai-extra: ! '>=3.0 && <3.1'
  random: ! '>=1.1 && <1.2'
  http-types: ! '>=0.8 && <0.10'
  wai-app-static: ! '>=3.0 && <3.2'
  aeson: ! '>=0.8 && <1.2'
  template-haskell: ! '>=2.9 && <2.12'
all-versions:
- '0.1'
- '0.2'
- '0.2.1'
- '0.2.2'
- '0.2.3'
- '0.2.4'
- '0.3.0'
- '0.3.1'
- '0.3.2'
- '0.3.3'
- '0.3.4'
- '0.4.0'
- '0.4.1'
- '0.5.0'
- '0.5.1'
- '0.6.0'
- '0.6.1'
- '0.6.2'
- '0.7.0'
- '0.7.1'
- '0.7.2'
- '0.7.3'
- '0.8.0'
- '0.8.1'
- '0.9.0'
- '0.9.1'
- '0.9.2'
- '0.9.3'
- '0.9.4'
- '0.9.5'
- '0.9.6'
- '0.9.7'
- '0.9.8'
- '0.9.9'
- '0.9.10'
author: <NAME>
latest: '0.9.10'
description-type: markdown
description: ! "[Wai-Routes](https://ajnsit.github.io/wai-routes) [![Hackage](https://img.shields.io/badge/hackage-v0.9.10-brightgreen.svg)](https://hackage.haskell.org/package/wai-routes)
  [![Hackage-Deps](https://img.shields.io/hackage-deps/v/wai-routes.svg)](http://packdeps.haskellers.com/feed?needle=wai-routes)
  [![Build Status](https://img.shields.io/travis/ajnsit/wai-routes.svg)](https://travis-ci.org/ajnsit/wai-routes)
  [![Join the chat at https://gitter.im/ajnsit/wai-routes](https://img.shields.io/badge/gitter-join%20chat%20%E2%86%A3-blue.svg)](https://gitter.im/ajnsit/wai-routes)\n====================================\n\nWai-routes
  is a micro web framework for Haskell that focuses on typesafe URLs.\n\nWai-routes
  is based on the Haskell [Web Application Interface](http://hackage.haskell.org/package/wai)
  and uses it for most of the heavy lifting. It also provides a convenient but thin
  veneer over most of the wai API so it is unnecessary to directly use raw wai APIs
  when building web apps.\n\nMuch of Wai-route's typesafe URL functionality was pulled
  from the corresponding features in [Yesod](http://www.yesodweb.com/), and indeed
  the underlying aim of wai-routes is - *\"To provide a similar level of typesafe
  URL functionality to Wai applications as is available to Yesod applications.\"*.\n\n***Note***
  - If you are looking for typesafe URLs for Snap, take a look at [Snap-Routes](https://github.com/ajnsit/snap-routes)
  - A port of this library for Snap.\n\nFeatures\n==========\n\nWai-routes adds the
  following features on top of wai -\n\n  - Typesafe URLs, including automatic boilerplate
  generation using TH. Including features such as -\n    - Nested Routes\n    - Subsites\n
  \   - Route Annotations\n  - Seamlessly mix and match \"unrouted\" request handlers
  with typesafe routing.\n  - Sitewide Master data which is passed to all handlers
  and can be used for persistent data (like DB connections)\n  - Easy to use Handler
  Monad which allows direct access to request and master data\n  - Easy composition
  of multiple routes and middleware to construct an application\n  - Ability to abort
  processing and pass control to the next application in the wai stack\n  - Streaming
  responses\n\n\nPerformance\n===========\n\nWhen it comes to performance, Wai-routes
  compares quite favorably with other Haskell web development micro frameworks.\n\nSee
  more details here - [philopon/apiary-benchmark](https://github.com/philopon/apiary-benchmark)\n\n![result](./benchmark/result-tama.png)\n\n\nExample
  Usage\n=============\n\nWai-routes comes with several examples in the `examples/`
  directory. New examples are being added regularly.\n\n**Example 1. Hello World**
  - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/hello-world/src)\n\nA
  simple hello-world web app with two interlinked pages. This provides the simplest
  example of using routing and linking between pages with typesafe routes.\n\n**Example
  2. Hello World with Subsites** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/subsites/src)\n\nSimilar
  functionality as the first example, but uses a hello world subsites to provide the
  hello world functionality. A subsite is an independently developed site that can
  be embedded into a parent site as long as the parent site satisfies a particular
  api contract. It's easy to swap out subsites for different functionality as long
  as the api contract remains constant.\n\n**Example 3. Using Blaze-HTML to generate
  HTML** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/blaze-html/src)\n\nA
  simple example of how to generate HTML using blaze-html combinators in your handlers.\n\n**Example
  4. Using Shakespearean Templates (hamlet, cassius, lucius, julius) to generate HTML/CSS/JS**
  - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/shakespeare/src)\n\nA
  simple example of how to generate HTML/CSS/JS using shakespearean templates. You
  can use both external and inline templates.\n\n**Example 5. Building a JSON REST
  Service** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/rest-json/src)\n\nProvides
  a simple example of how to build JSON REST services with wai-routes. Uses Aeson
  for JSON conversion. Note that this example just demonstrates the web facing side
  of the application. It doesn't permanently persist data, and is also not threadsafe.
  You must use a more robust data storage mechanism in production! An example of doing
  this with a Relational DB adapter (like persistent) is in the works.\n\n**Example
  6. Stream a response** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/streaming-response/src)\n\nWai
  has had the ability to stream content for a long time. Now wai-routes exposes this
  functionality with the `stream` function. This example shows how to stream content
  in a handler. Note that most browsers using default settings will not show content
  as it is being streamed. You can use \"curl\" to observe the effect of streaming.
  E.g. - `curl localhost:8080` will dump the data as it is being streamed from the
  server.\n\n**Example 7. Kitchen sink** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/kitchen/src)\n\n*Work
  in progress*. Demonstrates all major features in wai-routes.\n\n**Example 8. Unrouted**
  - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/unrouted/src)\n\nDemonstrates
  \"unrouted\" applications. These require no TH, or GHC extensions. Basically allow
  you to sequence request handlers in a cascade, with each handler having the full
  functionality of HandlerM monad available to them. Each handler also has access
  to untyped (but parsed) route information. Unrouted handlers are freely mixable
  with typesafe routing.\n\n**Example 9. Typesafe \"Bare\" Wai routing** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/bare-wai/src)\n\nDemonstrates
  writing no-overhead \"bare\" wai applications with routing. Wai-routes handlers
  are simple functions that return wai responses. This means that you are free to
  use typesafe routing, but without using runHandlerM, instead accessing the master
  datatype and the route args as arguments passed to the handler function.\n\nDeployment\n==========\n\nThe
  current recommended route (pun not intended) for deploying wai-routes apps is [keter](http://hackage.haskell.org/package/keter).
  You need to read the port from the environment variables -\n\n    -- Run the application\n
  \   main :: IO ()\n    main = do\n      port' <- getEnv \"PORT\"\n      let port
  = read port'\n      run port $ waiApp application\n\nThen put something like this
  in `config/keter.yaml` -\n\n    exec: ../path/to/executable\n    host: mydomainname.example.com\n\nThen
  create a tarball with `config/keter.yaml`, `path/to/executable`, and any other files
  needed at runtime for your application. Rename the tarball to have a `.keter` extension.\n\nUpload
  that file to your server's `incoming` folder for keter to pick it up. You obviously
  need keter already installed and configured properly at the server.\n\nPlanned Features\n====================\n\nThe
  following features are planned for later releases -\n\n- Support for raw network
  responses (see http://hackage.haskell.org/package/wai-3.0.3.0/docs/Network-Wai.html#v:responseRaw)\n-
  Seamless websocket support\n- Development mode\n- Scaffolding\n- Better documentation,
  and a getting started tutorial\n- More tests and code coverage\n\n\nChangelog\n=========\n\n*
  0.9.10: Aeson and hspec version bump.\n* 0.9.9 : GHC 8 compatibility. Change namespace
  from Network.Wai.Middleware.Routes -> Wai.Routes\n* 0.9.8 : Allow Data.Default-0.1.0.
  Allow comments in route definitions. Some other minor changes.\n* 0.9.7 : Allow
  Aeson-0.11. Export Env, RequestData, and show/readRoute to enable \"bare\" handlers.\n*
  0.9.6 : Subsites now receive parent route arguments, in line with regular nested
  routes\n* 0.9.5 : Subsites now play well with hierarchical routes\n* 0.9.4 : Wai-3.2
  compatibility. Added functions to manipulate wai \"vault\". Minor changes to internal
  types.\n* 0.9.3 : Added `content` and `whenContent`. Allow http-types-0.9.\n* 0.9.2
  : Fix failing test in release tarball. (Only tests changed).\n* 0.9.1 : Greatly
  simplified subsites (simply use mkRouteSub). Added 'mountedAppHandler' to integrate
  external full wai apps.\n* 0.9.0 : Support for \"unrouted\" handlers. API changes
  to avoid returning lazy text or bytestring. Methods to fetch post/file params. Removed
  'HandlerMM' and made 'Handler' more useful.\n* 0.8.1 : Bumped dependencies. Added
  'HandlerMM' type alias\n* 0.8.0 : Replaced 'show/renderRoute' with 'show/renderRouteSub'
  and 'show/renderRouteMaster'. Added functions to access request headers (reqHeader/s),
  send a part of a file (filepart). Auto infer mime-types when sending files. Added
  cookie handling functions (get/setCookie/s). Added 'sub' to allow access to subsite
  datatype.\n* 0.7.3 : Added 'stream' to stream responses. Added 'asContent', 'css',
  and 'javascript' functions.\n* 0.7.2 : Added 'file' to send a raw file directly,
  'rawBody' and 'jsonBody' to consume request body. Refactored RouteM to add 'catchAll'
  and 'waiApp'.\n* 0.7.1 : Added 'showRouteQuery', renamed 'text' to 'plain', 'html'
  now accepts Text instead of ByteString\n* 0.7.0 : Subsites support added\n* 0.6.2
  : Added 'maybeRoute' and 'routeAttrSet', to get information about the currently
  executing route\n* 0.6.1 : Fixed cabal and travis files\n* 0.6.0 : Removed dependency
  on yesod-routes. Updated code to compile with wai-3 and ghc-7.8, ghc-7.10\n* 0.5.1
  : Bumped dependency upper bounds to allow text 1.*\n* 0.5.0 : Added raw,text,html,json
  helpers. Update to wai-2.1.\n* 0.4.1 : showRoute now returns \"/\" instead of \"\"\n*
  0.4.0 : Wai 2 compatibility. Replaced 'liftResourceT' with 'lift'\n* 0.3.4 : Added
  'liftResourceT' to lift a ResourceT into HandlerM\n* 0.3.3 : Better exports from
  the Network.Wai.Middleware.Routes module\n* 0.3.2 : Added HandlerM Monad which makes
  it easier to build Handlers\n* 0.3.1 : Removed internal 'App' synonym which only<commit_msg>Update from Hackage at 2017-04-17T10:38:35Z<commit_after>homepage: https://ajnsit.github.io/wai-routes/
changelog-type: ''
hash: fac96f99bc524bf88d83b927dc6c98f6cedf5dd01ef9b3eefbf1c7fae87518b0
test-bench-deps:
  wai: ! '>=3.0 && <3.3'
  hspec-wai-json: ! '>=0.6 && <0.9'
  base: ! '>=4.7 && <4.10'
  hspec: ! '>=2.1 && <2.5'
  text: ! '>=1.2 && <1.3'
  hspec-wai: ! '>=0.6 && <0.9'
  wai-routes: -any
  aeson: ! '>=0.8 && <1.3'
maintainer: <EMAIL>
synopsis: Typesafe URLs for Wai applications.
changelog: ''
basic-deps:
  cookie: ! '>=0.4 && <0.5'
  bytestring: ! '>=0.10 && <0.11'
  wai: ! '>=3.0 && <3.3'
  case-insensitive: ! '>=1.2 && <1.3'
  base: ! '>=4.7 && <4.10'
  data-default-class: ! '>=0.0 && <0.2'
  text: ! '>=1.2 && <1.3'
  monad-loops: ! '>=0.4 && <0.5'
  filepath: ! '>=1.3 && <1.5'
  path-pieces: ! '>=0.2 && <0.3'
  containers: ! '>=0.5 && <0.6'
  blaze-builder: ! '>=0.4 && <0.5'
  vault: ! '>=0.3 && <0.4'
  mime-types: ! '>=0.1 && <0.2'
  mtl: ! '>=2.1 && <2.3'
  wai-extra: ! '>=3.0 && <3.1'
  random: ! '>=1.1 && <1.2'
  http-types: ! '>=0.8 && <0.10'
  aeson: ! '>=0.8 && <1.3'
  template-haskell: ! '>=2.9 && <2.12'
all-versions:
- '0.1'
- '0.2'
- '0.2.1'
- '0.2.2'
- '0.2.3'
- '0.2.4'
- '0.3.0'
- '0.3.1'
- '0.3.2'
- '0.3.3'
- '0.3.4'
- '0.4.0'
- '0.4.1'
- '0.5.0'
- '0.5.1'
- '0.6.0'
- '0.6.1'
- '0.6.2'
- '0.7.0'
- '0.7.1'
- '0.7.2'
- '0.7.3'
- '0.8.0'
- '0.8.1'
- '0.9.0'
- '0.9.1'
- '0.9.2'
- '0.9.3'
- '0.9.4'
- '0.9.5'
- '0.9.6'
- '0.9.7'
- '0.9.8'
- '0.9.9'
- '0.9.10'
- '0.10.0'
author: <NAME>
latest: '0.10.0'
description-type: markdown
description: ! "[Wai-Routes](https://ajnsit.github.io/wai-routes) [![Hackage](https://img.shields.io/badge/hackage-v0.10.0-brightgreen.svg)](https://hackage.haskell.org/package/wai-routes)
  [![Hackage-Deps](https://img.shields.io/hackage-deps/v/wai-routes.svg)](http://packdeps.haskellers.com/feed?needle=wai-routes)
  [![Build Status](https://img.shields.io/travis/ajnsit/wai-routes.svg)](https://travis-ci.org/ajnsit/wai-routes)
  [![Join the chat at https://gitter.im/ajnsit/wai-routes](https://img.shields.io/badge/gitter-join%20chat%20%E2%86%A3-blue.svg)](https://gitter.im/ajnsit/wai-routes)\n====================================\n\nWai-routes
  is a micro web framework for Haskell that focuses on typesafe URLs.\n\nWai-routes
  is based on the Haskell [Web Application Interface](http://hackage.haskell.org/package/wai)
  and uses it for most of the heavy lifting. It also provides a convenient but thin
  veneer over most of the wai API so it is unnecessary to directly use raw wai APIs
  when building web apps.\n\nMuch of Wai-route's typesafe URL functionality was pulled
  from the corresponding features in [Yesod](http://www.yesodweb.com/), and indeed
  the underlying aim of wai-routes is - *\"To provide a similar level of typesafe
  URL functionality to Wai applications as is available to Yesod applications.\"*.\n\n***Note***
  - If you are looking for typesafe URLs for Snap, take a look at [Snap-Routes](https://github.com/ajnsit/snap-routes)
  - A port of this library for Snap.\n\nFeatures\n==========\n\nWai-routes adds the
  following features on top of wai -\n\n  - Typesafe URLs, including automatic boilerplate
  generation using TH. Including features such as -\n    - Nested Routes\n    - Subsites\n
  \   - Route Annotations\n  - Seamlessly mix and match \"unrouted\" request handlers
  with typesafe routing.\n  - Sitewide Master data which is passed to all handlers
  and can be used for persistent data (like DB connections)\n  - Easy to use Handler
  Monad which allows direct access to request and master data\n  - Easy composition
  of multiple routes and middleware to construct an application\n  - Ability to abort
  processing and pass control to the next application in the wai stack\n  - Streaming
  responses\n\n\nPerformance\n===========\n\nWhen it comes to performance, Wai-routes
  compares quite favorably with other Haskell web development micro frameworks.\n\nSee
  more details here - [philopon/apiary-benchmark](https://github.com/philopon/apiary-benchmark)\n\n![result](./benchmark/result-tama.png)\n\n\nExample
  Usage\n=============\n\nWai-routes comes with several examples in the `examples/`
  directory. New examples are being added regularly.\n\n**Example 1. Hello World**
  - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/hello-world/src)\n\nA
  simple hello-world web app with two interlinked pages. This provides the simplest
  example of using routing and linking between pages with typesafe routes.\n\n**Example
  2. Hello World with Subsites** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/subsites/src)\n\nSimilar
  functionality as the first example, but uses a hello world subsites to provide the
  hello world functionality. A subsite is an independently developed site that can
  be embedded into a parent site as long as the parent site satisfies a particular
  api contract. It's easy to swap out subsites for different functionality as long
  as the api contract remains constant.\n\n**Example 3. Using Blaze-HTML to generate
  HTML** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/blaze-html/src)\n\nA
  simple example of how to generate HTML using blaze-html combinators in your handlers.\n\n**Example
  4. Using Shakespearean Templates (hamlet, cassius, lucius, julius) to generate HTML/CSS/JS**
  - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/shakespeare/src)\n\nA
  simple example of how to generate HTML/CSS/JS using shakespearean templates. You
  can use both external and inline templates.\n\n**Example 5. Building a JSON REST
  Service** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/rest-json/src)\n\nProvides
  a simple example of how to build JSON REST services with wai-routes. Uses Aeson
  for JSON conversion. Note that this example just demonstrates the web facing side
  of the application. It doesn't permanently persist data, and is also not threadsafe.
  You must use a more robust data storage mechanism in production! An example of doing
  this with a Relational DB adapter (like persistent) is in the works.\n\n**Example
  6. Stream a response** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/streaming-response/src)\n\nWai
  has had the ability to stream content for a long time. Now wai-routes exposes this
  functionality with the `stream` function. This example shows how to stream content
  in a handler. Note that most browsers using default settings will not show content
  as it is being streamed. You can use \"curl\" to observe the effect of streaming.
  E.g. - `curl localhost:8080` will dump the data as it is being streamed from the
  server.\n\n**Example 7. Kitchen sink** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/kitchen/src)\n\n*Work
  in progress*. Demonstrates all major features in wai-routes.\n\n**Example 8. Unrouted**
  - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/unrouted/src)\n\nDemonstrates
  \"unrouted\" applications. These require no TH, or GHC extensions. Basically allow
  you to sequence request handlers in a cascade, with each handler having the full
  functionality of HandlerM monad available to them. Each handler also has access
  to untyped (but parsed) route information. Unrouted handlers are freely mixable
  with typesafe routing.\n\n**Example 9. Typesafe \"Bare\" Wai routing** - [Code](https://github.com/ajnsit/wai-routes/tree/master/examples/bare-wai/src)\n\nDemonstrates
  writing no-overhead \"bare\" wai applications with routing. Wai-routes handlers
  are simple functions that return wai responses. This means that you are free to
  use typesafe routing, but without using runHandlerM, instead accessing the master
  datatype and the route args as arguments passed to the handler function.\n\nDeployment\n==========\n\nThe
  current recommended route (pun not intended) for deploying wai-routes apps is [keter](http://hackage.haskell.org/package/keter).
  You need to read the port from the environment variables -\n\n    -- Run the application\n
  \   main :: IO ()\n    main = do\n      port' <- getEnv \"PORT\"\n      let port
  = read port'\n      run port $ waiApp application\n\nThen put something like this
  in `config/keter.yaml` -\n\n    exec: ../path/to/executable\n    host: mydomainname.example.com\n\nThen
  create a tarball with `config/keter.yaml`, `path/to/executable`, and any other files
  needed at runtime for your application. Rename the tarball to have a `.keter` extension.\n\nUpload
  that file to your server's `incoming` folder for keter to pick it up. You obviously
  need keter already installed and configured properly at the server.\n\nPlanned Features\n====================\n\nThe
  following features are planned for later releases -\n\n- Support for raw network
  responses (see http://hackage.haskell.org/package/wai-3.0.3.0/docs/Network-Wai.html#v:responseRaw)\n-
  Seamless websocket support\n- Development mode\n- Scaffolding\n- Better documentation,
  and a getting started tutorial\n- More tests and code coverage\n\n\nChangelog\n=========\n\n*
  0.10.0: Allow aeson v1.2. Routing improvements. Remove wai-app-static dependency.
  Add nix expression.\n* 0.9.10: Aeson and hspec version bump.\n* 0.9.9 : GHC 8 compatibility.
  Change namespace from Network.Wai.Middleware.Routes -> Wai.Routes\n* 0.9.8 : Allow
  Data.Default-0.1.0. Allow comments in route definitions. Some other minor changes.\n*
  0.9.7 : Allow Aeson-0.11. Export Env, RequestData, and show/readRoute to enable
  \"bare\" handlers.\n* 0.9.6 : Subsites now receive parent route arguments, in line
  with regular nested routes\n* 0.9.5 : Subsites now play well with hierarchical routes\n*
  0.9.4 : Wai-3.2 compatibility. Added functions to manipulate wai \"vault\". Minor
  changes to internal types.\n* 0.9.3 : Added `content` and `whenContent`. Allow http-types-0.9.\n*
  0.9.2 : Fix failing test in release tarball. (Only tests changed).\n* 0.9.1 : Greatly
  simplified subsites (simply use mkRouteSub). Added 'mountedAppHandler' to integrate
  external full wai apps.\n* 0.9.0 : Support for \"unrouted\" handlers. API changes
  to avoid returning lazy text or bytestring. Methods to fetch post/file params. Removed
  'HandlerMM' and made 'Handler' more useful.\n* 0.8.1 : Bumped dependencies. Added
  'HandlerMM' type alias\n* 0.8.0 : Replaced 'show/renderRoute' with 'show/renderRouteSub'
  and 'show/renderRouteMaster'. Added functions to access request headers (reqHeader/s),
  send a part of a file (filepart). Auto infer mime-types when sending files. Added
  cookie handling functions (get/setCookie/s). Added 'sub' to allow access to subsite
  datatype.\n* 0.7.3 : Added 'stream' to stream responses. Added 'asContent', 'css',
  and 'javascript' functions.\n* 0.7.2 : Added 'file' to send a raw file directly,
  'rawBody' and 'jsonBody' to consume request body. Refactored RouteM to add 'catchAll'
  and 'waiApp'.\n* 0.7.1 : Added 'showRouteQuery', renamed 'text' to 'plain', 'html'
  now accepts Text instead of ByteString\n* 0.7.0 : Subsites support added\n* 0.6.2
  : Added 'maybeRoute' and 'routeAttrSet', to get information about the currently
  executing route\n* 0.6.1 : Fixed cabal and travis files\n* 0.6.0 : Removed dependency
  on yesod-routes. Updated code to compile with wai-3 and ghc-7.8, ghc-7.10\n* 0.5.1
  : Bumped dependency upper bounds to allow text 1.*\n* 0.5.0 : Added raw,text,html,json
  helpers. Update to wai-2.1.\n* 0.4.1 : showRoute now returns \"/\" instead of \"\"\n*
  0.4.0 : Wai 2 compatibility. Replaced 'liftResourceT' with 'lift'\n* 0.3.4 : Added
  'liftResourceT' to lift a ResourceT into HandlerM\n* 0.3.3 : Better exports from
  the Network.Wai.Middleware.Routes module\n* 0.3.2 : Added HandlerM Monad which makes
  it easier to build Handlers\n* 0.3.1 : Removed internal 'App' synonym which only
{'fraction_non_alphanumeric': 0.14498360104280547, 'fraction_numerical': 0.03439576150029434, 'mean_word_length': 3.539606795189922, 'pattern_counts': {'":': 0, '<': 64, '<?xml version=': 0, '>': 64, 'https://': 42, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 2, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '330909', 'n_tokens_mistral': 8673, 'n_tokens_neox': 8269, 'n_words': 2575}