{"id":13858780,"url":"https://github.com/sinatra/mustermann","last_synced_at":"2025-05-14T07:08:31.531Z","repository":{"id":674728,"uuid":"9714238","full_name":"sinatra/mustermann","owner":"sinatra","description":"your personal string matching expert","archived":false,"fork":false,"pushed_at":"2024-09-03T10:17:24.000Z","size":993,"stargazers_count":665,"open_issues_count":8,"forks_count":63,"subscribers_count":16,"default_branch":"main","last_synced_at":"2025-05-06T08:10:37.350Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://sinatrarb.com/mustermann/","language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sinatra.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":"support/lib/support.rb","governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2013-04-27T12:14:43.000Z","updated_at":"2025-02-25T06:18:00.000Z","dependencies_parsed_at":"2024-01-22T12:39:32.918Z","dependency_job_id":"a0b0a316-db59-49e2-aa28-dd7007a5ddb8","html_url":"https://github.com/sinatra/mustermann","commit_stats":{"total_commits":324,"total_committers":41,"mean_commits":7.902439024390244,"dds":"0.48456790123456794","last_synced_commit":"573cd316cc33755b38ebd04021870fce4c87cdc1"},"previous_names":["rkh/mustermann"],"tags_count":27,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinatra%2Fmustermann","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinatra%2Fmustermann/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinatra%2Fmustermann/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sinatra%2Fmustermann/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sinatra","download_url":"https://codeload.github.com/sinatra/mustermann/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253247684,"owners_count":21877904,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-08-05T03:02:20.438Z","updated_at":"2025-05-14T07:08:31.474Z","avatar_url":"https://github.com/sinatra.png","language":"Ruby","funding_links":[],"categories":["Ruby"],"sub_categories":[],"readme":"# The Amazing Mustermann\n\n[![Build Status](https://github.com/sinatra/mustermann/actions/workflows/test.yml/badge.svg)](https://github.com/sinatra/mustermann/actions/workflows/test.yml) [![Coverage Status](https://coveralls.io/repos/github/rkh/mustermann/badge.svg?branch=master)](https://coveralls.io/github/rkh/mustermann?branch=master) ![Code Climate maintainability](https://img.shields.io/codeclimate/maintainability-percentage/rkh/mustermann) [![Gem Version](https://img.shields.io/gem/v/mustermann.svg)](https://rubygems.org/gems/mustermann)\n[![Inline docs](http://inch-ci.org/github/rkh/mustermann.svg)](http://inch-ci.org/github/rkh/mustermann)\n[![Documentation](http://img.shields.io/:yard-docs-38c800.svg)](http://www.rubydoc.info/gems/mustermann/frames)\n[![License](http://img.shields.io/:license-MIT-38c800.svg)](http://rkh.mit-license.org)\n[![Badges](http://img.shields.io/:badges-9/9-38c800.svg)](http://img.shields.io)\n\nThis repository contains multiple projects (each installable as separate gems).\n\n* **[mustermann](https://github.com/sinatra/mustermann/blob/master/mustermann/README.md): Your personal string matching expert. This is probably what you're looking for.**\n* [mustermann-contrib](https://github.com/sinatra/mustermann/blob/master/mustermann-contrib/README.md): A meta gem depending on all other official mustermann gems.\n* [mustermann-fileutils](https://github.com/sinatra/mustermann/blob/master/mustermann-contrib/README.md#-mustermann-fileutils): Efficient file system operations using Mustermann patterns.\n* [mustermann-strscan](https://github.com/sinatra/mustermann/blob/master/mustermann-contrib/README.md#-mustermann-strscan): A version of Ruby's [StringScanner](http://ruby-doc.org/stdlib-2.0/libdoc/strscan/rdoc/StringScanner.html) made for pattern objects.\n* [mustermann-visualizer](https://github.com/sinatra/mustermann/blob/master/mustermann-contrib/README.md#-mustermann-visualizer): Syntax highlighting and tree visualization for patterns.'\n* A selection of pattern types for mustermann, each as their own little library, see [below](#-pattern-types).\n\n## Git versions with Bundler\n\nYou can easily use the latest edge version from GitHub of any of these gems via [Bundler](http://bundler.io/):\n\n``` ruby\ngithub 'sinatra/mustermann' do\n  gem 'mustermann'\n  gem 'mustermann-contrib'\nend\n```\n\n\u003ca name=\"-pattern-types\"\u003e\u003c/a\u003e\n## Pattern Types\n\nThe `identity`, `regexp` and `sinatra` types are included in the `mustermann` gem, all the other types have their own gems.\n\n\u003ctable\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003eType\u003c/th\u003e\n      \u003cth\u003eExample\u003c/th\u003e\n      \u003cth\u003eCompatible with\u003c/th\u003e\n      \u003cth\u003eNotes\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003ca href=\"mustermann-contrib/README.md#-mustermann-cake\"\u003e\u003ctt\u003ecake\u003c/tt\u003e\u003c/a\u003e\u003c/th\u003e\n      \u003ctd\u003e\u003ctt\u003e/:prefix/**\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003ca href=\"http://cakephp.org/\"\u003eCakePHP\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003ca href=\"mustermann-contrib/README.md#-mustermann-express\"\u003e\u003ctt\u003eexpress\u003c/tt\u003e\u003c/a\u003e\u003c/th\u003e\n      \u003ctd\u003e\u003ctt\u003e/:prefix+/:id(\\d+)\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ca href=\"http://expressjs.com/\"\u003eExpress\u003c/a\u003e,\n        \u003ca href=\"https://pillarjs.github.io/\"\u003epillar.js\u003c/a\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003ca href=\"mustermann-contrib/README.md#-mustermann-flask\"\u003e\u003ctt\u003eflask\u003c/tt\u003e\u003c/a\u003e\u003c/th\u003e\n      \u003ctd\u003e\u003ctt\u003e/\u0026lt;prefix\u0026gt;/\u0026lt;int:id\u0026gt;\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ca href=\"http://flask.pocoo.org/\"\u003eFlask\u003c/a\u003e,\n        \u003ca href=\"http://werkzeug.pocoo.org/\"\u003eWerkzeug\u003c/a\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003ca href=\"mustermann/README.md#-identity-pattern\"\u003e\u003ctt\u003eidentity\u003c/tt\u003e\u003c/a\u003e\u003c/th\u003e\n      \u003ctd\u003e\u003ctt\u003e/image.png\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003eany software using strings\u003c/td\u003e\n      \u003ctd\u003e\n        Exact string matching (no parameter parsing).\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003ca href=\"mustermann-contrib/README.md#-mustermann-pyramid\"\u003e\u003ctt\u003epyramid\u003c/tt\u003e\u003c/a\u003e\u003c/th\u003e\n      \u003ctd\u003e\u003ctt\u003e/{prefix:.*}/{id}\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ca href=\"http://www.pylonsproject.org/projects/pyramid/about\"\u003ePyramid\u003c/a\u003e,\n        \u003ca href=\"http://www.pylonsproject.org/projects/pylons-framework/about\"\u003ePylons\u003c/a\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003ca href=\"mustermann-contrib/README.md#-mustermann-rails\"\u003e\u003ctt\u003erails\u003c/tt\u003e\u003c/a\u003e\u003c/th\u003e\n      \u003ctd\u003e\u003ctt\u003e/:slug(.:ext)\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ca href=\"http://rubyonrails.org/\"\u003eRuby on Rails\u003c/a\u003e,\n        \u003ca href=\"https://github.com/rails/journey\"\u003eJourney\u003c/a\u003e,\n        \u003ca href=\"https://github.com/joshbuddy/http_router\"\u003eHTTP Router\u003c/a\u003e,\n        \u003ca href=\"http://hanamirb.org\"\u003eHanami\u003c/a\u003e,\n        \u003ca href=\"http://scalatra.org/\"\u003eScalatra\u003c/a\u003e (if \u003ca href=\"http://scalatra.org/2.3/guides/http/routes.html#toc_248\"\u003econfigured\u003c/a\u003e),\n        \u003ca href=\"https://github.com/alisnic/nyny\"\u003eNYNY\u003c/a\u003e\u003c/td\u003e\n      \u003ctd\u003e\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003ca href=\"mustermann/README.md#-regexp-pattern\"\u003e\u003ctt\u003eregexp\u003c/tt\u003e\u003c/a\u003e\u003c/th\u003e\n      \u003ctd\u003e\u003ctt\u003e/(?\u0026lt;slug\u0026gt;[^\\/]+)\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ca href=\"https://github.com/kkos/oniguruma\"\u003eOniguruma\u003c/a\u003e,\n        \u003ca href=\"https://github.com/k-takata/Onigmo\"\u003eOnigmo\u003ca\u003e,\n        regular expressions\n      \u003c/td\u003e\n      \u003ctd\u003e\n        Created when you pass a regexp to \u003ctt\u003eMustermann.new\u003c/tt\u003e.\u003cbr\u003e\n        Does not support expanding or generating templates.\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003ca href=\"mustermann-contrib/README.md#-mustermann-shell\"\u003e\u003ctt\u003eshell\u003c/tt\u003e\u003c/a\u003e\u003c/th\u003e\n      \u003ctd\u003e\u003ctt\u003e/*.{png,jpg}\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003eUnix Shell (bash, zsh)\u003c/td\u003e\n      \u003ctd\u003eDoes not support expanding or generating templates.\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003ca href=\"mustermann-contrib/README.md#-mustermann-simple\"\u003e\u003ctt\u003esimple\u003c/tt\u003e\u003c/a\u003e\u003c/th\u003e\n      \u003ctd\u003e\u003ctt\u003e/:slug.:ext\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ca href=\"http://www.sinatrarb.com/\"\u003eSinatra\u003c/a\u003e (1.x),\n        \u003ca href=\"http://scalatra.org/\"\u003eScalatra\u003c/a\u003e,\n        \u003ca href=\"http://perldancer.org/\"\u003eDancer\u003c/a\u003e,\n        \u003ca href=\"http://twitter.github.io/finatra/\"\u003eFinatra\u003c/a\u003e,\n        \u003ca href=\"http://sparkjava.com/\"\u003eSpark\u003c/a\u003e,\n        \u003ca href=\"https://github.com/rc1/RCRouter\"\u003eRCRouter\u003c/a\u003e,\n        \u003ca href=\"https://github.com/kissjs/kick.js\"\u003ekick.js\u003c/a\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        Implementation is a direct copy from Sinatra 1.3.\u003cbr\u003e\n        It is the predecessor of \u003ctt\u003esinatra\u003c/tt\u003e.\n        Does not support expanding or generating templates.\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003ca href=\"mustermann/README.md#-sinatra-pattern\"\u003e\u003ctt\u003esinatra\u003c/tt\u003e\u003c/a\u003e\u003c/th\u003e\n      \u003ctd\u003e\u003ctt\u003e/:slug(.:ext)?\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ca href=\"http://www.sinatrarb.com/\"\u003eSinatra\u003c/a\u003e (2.x),\n        \u003ca href=\"http://padrinorb.com/\"\u003ePadrino\u003c/a\u003e (\u003e= 0.13.0),\n        \u003ca href=\"https://github.com/namusyaka/pendragon\"\u003ePendragon\u003c/a\u003e,\n        \u003ca href=\"https://github.com/kenichi/angelo\"\u003eAngelo\u003c/a\u003e\n      \u003c/td\u003e\n      \u003ctd\u003e\n        \u003cu\u003eThis is the default\u003c/u\u003e and the only type \"invented here\".\u003cbr\u003e\n        It is a superset of \u003ctt\u003esimple\u003c/tt\u003e and has a common subset with\n        \u003ctt\u003etemplate\u003c/tt\u003e (and others).\n      \u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003ca href=\"mustermann-contrib/README.md#-mustermann-uri-template\"\u003e\u003ctt\u003euri-template\u003c/tt\u003e\u003c/a\u003e\u003c/th\u003e\n      \u003ctd\u003e\u003ctt\u003e/{+pre}/{page}{?q}\u003c/tt\u003e\u003c/td\u003e\n      \u003ctd\u003e\n        \u003ca href=\"https://tools.ietf.org/html/rfc6570\"\u003eRFC 6570\u003c/a\u003e,\n        \u003ca href=\"http://jsonapi.org/\"\u003eJSON API\u003c/a\u003e,\n        \u003ca href=\"http://tools.ietf.org/html/draft-nottingham-json-home-02\"\u003eJSON Home Documents\u003c/a\u003e\n        and \u003ca href=\"https://code.google.com/p/uri-templates/wiki/Implementations\"\u003emany more\u003c/a\u003e\n      \u003c/td\u003e\n      \u003ctd\u003eStandardized URI templates, can be \u003ca href=\"mustermann/README.md#-generating-templates\"\u003egenerated\u003c/a\u003e from most other types.\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\nAny software using Mustermann is obviously compatible with at least one of the above.\n\n## Requirements\n\nRuby 2.6+ compatible Ruby implementation.\n\nJRuby support is unknown, see more in [issue #72](https://github.com/sinatra/mustermann/issues/72).\n\n## Release History\n\nMustermann follows [Semantic Versioning 2.0](http://semver.org/). Anything documented in the README or via YARD and not declared private is part of the public API.\n\n### Stable Releases\n\n* **Mustermann 3.0.3** (2024-09-03)\n    * Fix performance issue for `Mustermann::AST::Translator#escape` [#142](https://github.com/sinatra/mustermann/pull/142) [@hsbt](https://github.com/hsbt), [@ericproulx](https://github.com/ericproulx)\n\n* **Mustermann 3.0.2** (2024-08-09)\n    * Ruby 3.4+ compatibility: \"Use rfc2396 parser instead of URI::DEFAULT_PARSER\" [#139](https://github.com/sinatra/mustermann/pull/139) [@hsbt](https://github.com/hsbt)\n\n* **Mustermann 3.0.1** (2024-07-31)\n    * Ruby 3.4+ compatibility: \"Use URI::RFC2396_Parser#regex explicitly\" [#138](https://github.com/sinatra/mustermann/pull/138) [@hsbt](https://github.com/hsbt)\n\n* **Mustermann 3.0.0** (2022-07-24)\n    * Drop support for old Rubies \u003c 2.6.\n\n* **Mustermann 2.0.2** (2022-07-22)\n    * Further improve Ruby 3 compatibility. [#134](https://github.com/sinatra/mustermann/pull/134). [@magni-](https://github.com/magni-) \n\n* **Mustermann 2.0.1** (2022-07-19)\n    * Properly fix Ruby 3 compatability issue, reverts [#126](https://github.com/sinatra/mustermann/pull/126).  Resolved by [#130](https://github.com/sinatra/mustermann/pull/130) [@eregon](https://github.com/eregon), [@tconst](https://github.com/tconst), [@dentarg](https://github.com/dentarg)\n\n* **Mustermann 2.0.0** (2022-07-18)\n    * Improve Ruby 3 compatibility. Removed built-in Sinatra 1 support, and moved to new mustermann-sinatra-extension gem. Fixes [#114](https://github.com/sinatra/mustermann/issues/114) [@epergo](https://github.com/epergo)\n\n* **Mustermann 1.1.2** (2022-07-16)\n    * Add compatibility with --enable=frozen-string-literal param. Fixes [#110](https://github.com/sinatra/mustermann/issues/110) [@michal-granec](https://github.com/michal-granec)\n\n* **Mustermann 1.1.1** (2020-01-04)\n    * Make sure that `require`ing ruby2_keywords when needed. Fixes [#102](https://github.com/sinatra/mustermann/issues/103) [@Annih](https://github.com/Annih)\n\n* **Mustermann 1.1.0** (2019-12-30)\n    * Proper handling of `Mustermann::ExpandError`. Fixes [#88](https://github.com/sinatra/mustermann/issues/88) [@namusyaka](https://github.com/namusyaka)\n    * Support Ruby 3 keyword arguments. [@mame](https://github.com/mame)\n      * At the same time, we dropped a support that accepts options followed by mappings on `Mustermann::Mapper`. [Reference commit](https://github.com/sinatra/mustermann/pull/97/commits/4e134f5b46d8e5886b0f1590f5ff3f6ea4d2e81a)\n    * Improve documentation and development. [@horaciob](https://github.com/horaciob), [@epistrephein](https://github.com/epistrephein), [@jbampton](https://github.com/jbampton), [@jkowens](https://github.com/jkowens), [@junaruga](https://github.com/junaruga)\n\n* **Mustermann 1.0.3** (2018-08-17)\n    * Handle `with_look_ahead` on SafeRenderer. Fixes [sinatra/sinatra#1409](https://github.com/sinatra/sinatra/issues/1409) [@namusyaka](https://github.com/namusyaka)\n    * Fix `EqualityMap#fetch` to be compatible with the fallback `Hash#fetch`. Fixes [#89](https://github.com/sinatra/mustermann/issues/89) [@eregon](https://github.com/eregon)\n    * Improve code base and documentation. [@sonots](https://github.com/sonots), [@iguchi1124](https://github.com/iguchi1124)\n\n* **Mustermann 1.0.2** (2018-02-17)\n    * Look ahead same patterns as its own when concatenation. Fixes [sinatra/sinatra#1361](https://github.com/sinatra/sinatra/issues/1361) [@namusyaka](https://github.com/namusyaka)\n    * Improve development support and documentation. [@EdwardBetts](https://github.com/EdwardBetts), [@284km](https://github.com/284km), [@yb66](https://github.com/yb66) and [@garybernhardt](https://github.com/garybernhardt)\n\n* **Mustermann 1.0.1** (2017-08-26)\n    #### Docs\n    * Updating readme to list Ruby 2.2 as minimum [commit](https://github.com/sinatra/mustermann/commit/7c65d9637ed81c194e3d05f0ccf3cfe76f0cf53e) (@cassidycodes)\n    * Fix rendering of HTML table [commit](https://github.com/sinatra/mustermann/commit/119a61f0e589cb9e917d8c901800a202bb66ff3b) (@stevenwilkin)\n    * Update summary and description in gemspec file. [commit](https://github.com/sinatra/mustermann/commit/04de221a809527c2be8c3f08c40a4fcd53f2bd53) (@junaruga)\n    #### Fixes\n    * avoid infinite loop by removing comments when receiving extended regexp [commit](https://github.com/sinatra/mustermann/commit/fa20301167e1b22882415f1181c5e4e2d76b6ac6) (@namusyaka)\n    * avoid unintended conflict of namespace [commit](https://github.com/sinatra/mustermann/commit/d3c9531d372522d693fa5f768f13dbaa1d881d88) (@namusyaka)\n    * use Regexp#source instead of Regexp#inspect [commit](https://github.com/sinatra/mustermann/pull/73/commits/e9213748bda1773b1ad9838ef57a296f92c471e7) (@namusyaka)\n\n* **Mustermann 1.0.0** (2017-03-05)\n    * First stable release.\n    * Includes `mustermann`, and `mustermann-contrib` gems\n    * Sinatra patterns: Allow | outside of parens.\n    * Add concatenation support (`Mustermann::Pattern#+`).\n    * `Mustermann::Sinatra#|` may now generate a Sinatra pattern instead of a real composite.\n    * Add syntax highlighting support for composite patterns.\n    * Remove routers (they were out of scope for the main gem).\n    * Rails patterns: Add Rails 5.0 compatibility mode, make it default.\n    * Moved `tool` gem `EqualityMap` to `Mustermann::EqualityMap` in core\n    * Improve documentation.\n\n### Development Releases\n\n* **Mustermann 0.4.0** (2014-11-26)\n    * More Infos:\n      [RubyGems.org](https://rubygems.org/gems/mustermann/versions/0.4.0),\n      [RubyDoc.info](http://www.rubydoc.info/gems/mustermann/0.4.0/frames),\n      [GitHub.com](https://github.com/rkh/mustermann/tree/v0.4.0)\n    * Split into multiple gems.\n    * Add `Pattern#to_proc`.\n    * Add `Pattern#|`, `Pattern#\u0026` and `Pattern#^`.\n    * Add `Pattern#peek`, `Pattern#peek_size`, `Pattern#peek_match` and `Pattern#peek_params`.\n    * Add `Mustermann::StringScanner`.\n    * Add `Pattern#to_templates`.\n    * Add `|` syntax to `sinatra` templates.\n    * Add template style placeholders to `sinatra` templates.\n    * Add `cake`, `express`, `flask` and `pyramid` patterns.\n    * Allow passing in additional value behavior directly to `Pattern#expand`.\n    * Fix expanding of multiple splats.\n    * Add expanding to `identity` patterns.\n    * Add `mustermann-fileutils`.\n    * Make expander accept hashes with string keys.\n    * Allow named splats to be named splat.\n    * Support multiple Rails versions.\n    * Type option can be set to nil to get the default type.\n    * Add `mustermann-visualizer`.\n* **Mustermann 0.3.1** (2014-09-12)\n    * More Infos:\n      [RubyGems.org](https://rubygems.org/gems/mustermann/versions/0.3.1),\n      [RubyDoc.info](http://www.rubydoc.info/gems/mustermann/0.3.1/frames),\n      [GitHub.com](https://github.com/rkh/mustermann/tree/v0.3.1)\n    * Speed up pattern generation and matching (thanks [Daniel Mendler](https://github.com/minad))\n    * Small change so `Mustermann === Mustermann.new('...')` returns `true`.\n* **Mustermann 0.3.0** (2014-08-18)\n    * More Infos:\n      [RubyGems.org](https://rubygems.org/gems/mustermann/versions/0.3.0),\n      [RubyDoc.info](http://www.rubydoc.info/gems/mustermann/0.3.0/frames),\n      [GitHub.com](https://github.com/rkh/mustermann/tree/v0.3.0)\n    * Add `regexp` pattern.\n    * Add named splats to Sinatra patterns.\n    * Add `Mustermann::Mapper`.\n    * Improve duck typing support.\n    * Improve documentation.\n* **Mustermann 0.2.0** (2013-08-24)\n    * More Infos:\n      [RubyGems.org](https://rubygems.org/gems/mustermann/versions/0.2.0),\n      [RubyDoc.info](http://www.rubydoc.info/gems/mustermann/0.2.0/frames),\n      [GitHub.com](https://github.com/rkh/mustermann/tree/v0.2.0)\n    * Add first class expander objects.\n    * Add params casting for expander.\n    * Add simple router and rack router.\n    * Add weak equality map to significantly improve performance.\n    * Fix Ruby warnings.\n    * Improve documentation.\n    * Refactor pattern validation, AST transformations.\n    * Increase test coverage (from 100%+ to 100%++).\n    * Improve JRuby compatibility.\n    * Work around bug in 2.0.0-p0.\n* **Mustermann 0.1.0** (2013-05-12)\n    * More Infos:\n      [RubyGems.org](https://rubygems.org/gems/mustermann/versions/0.1.0),\n      [RubyDoc.info](http://www.rubydoc.info/gems/mustermann/0.1.0/frames),\n      [GitHub.com](https://github.com/rkh/mustermann/tree/v0.1.0)\n    * Add `Pattern#expand` for generating strings from patterns.\n    * Add better internal API for working with the AST.\n    * Improved documentation.\n    * Avoids parsing the path twice when used as Sinatra extension.\n    * Better exceptions for unknown pattern types.\n    * Better handling of edge cases around extend.\n    * More specs to ensure API stability.\n    * Largely rework internals of Sinatra, Rails and Template patterns.\n* **Mustermann 0.0.1** (2013-04-27)\n    * More Infos:\n      [RubyGems.org](https://rubygems.org/gems/mustermann/versions/0.0.1),\n      [RubyDoc.info](http://www.rubydoc.info/gems/mustermann/0.0.1/frames),\n      [GitHub.com](https://github.com/rkh/mustermann/tree/v0.0.1)\n    * Initial Release.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsinatra%2Fmustermann","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsinatra%2Fmustermann","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsinatra%2Fmustermann/lists"}