module Roda::RodaPlugins::ClassMatchers

  1. lib/roda/plugins/class_matchers.rb

The class_matchers plugin allows you do define custom regexps and conversion procs to use for specific classes. For example, if you have multiple routes similar to:

r.on /(\d\d\d\d)-(\d\d)-(\d\d)/ do |y, m, d|
  date = Date.new(y.to_i, m.to_i, d.to_i)
  # ...
end

You can register a Date class matcher for that regexp:

class_matcher(Date, /(\d\d\d\d)-(\d\d)-(\d\d)/) do |y, m, d|
  Date.new(y.to_i, m.to_i, d.to_i)
end

And then use the Date class as a matcher, and it will yield a Date object:

r.on Date do |date|
  # ...
end

This is useful to DRY up code if you are using the same type of pattern and type conversion in multiple places in your application. You can have the block return an array to yield multiple captures.

If you have a segment match the passed regexp, but decide during block processing that you do not want to treat it as a match, you can have the block return nil or false. This is useful if you want to make sure you are using valid data:

class_matcher(Date, /(\d\d\d\d)-(\d\d)-(\d\d)/) do |y, m, d|
  y = y.to_i
  m = m.to_i
  d = d.to_i
  Date.new(y, m, d) if Date.valid_date?(y, m, d)
end

The second argument to class_matcher can be a class already registered as a class matcher. This can DRY up code that wants a conversion performed by an existing class matcher:

class_matcher Employee, Integer do |id|
  Employee[id]
end

With the above example, the Integer matcher performs the conversion to integer, so id is yielded as an integer. The block then looks up the employee with that id. If there is no employee with that id, then the Employee matcher will not match.

If using the symbol_matchers plugin, you can provide a recognized symbol matcher as the second argument to class_matcher, and it will work in a similar manner:

symbol_matcher(:employee_id, /E-(\d{6})/) do |employee_id|
  employee_id.to_i
end
class_matcher Employee, :employee_id do |id|
  Employee[id]
end

Blocks passed to the class_matchers plugin are evaluated in route block context.

This plugin does not work with the params_capturing plugin, as it does not offer the ability to associate block arguments with named keys.

Methods

Public Class

  1. configure
  2. load_dependencies

Public Class methods

configure(app)
[show source]
   # File lib/roda/plugins/class_matchers.rb
77 def self.configure(app)
78   app.opts[:class_matchers] ||= {
79     Integer=>[/(\d{1,100})/, /\A\/(\d{1,100})(?=\/|\z)/, :_convert_class_Integer].freeze,
80     String=>[/([^\/]+)/, nil, nil].freeze
81   }
82 end
load_dependencies(app)
[show source]
   # File lib/roda/plugins/class_matchers.rb
73 def self.load_dependencies(app)
74   app.plugin :_symbol_class_matchers
75 end