Module: Roda::RodaPlugins::Base::ClassMethods

Included in:
Roda
Defined in:
lib/roda.rb

Overview

Class methods for the Roda class.

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#appObject (readonly)

The rack application that this class uses.



97
98
99
# File 'lib/roda.rb', line 97

def app
  @app
end

#optsObject (readonly)

The settings/options hash for the current class.



100
101
102
# File 'lib/roda.rb', line 100

def opts
  @opts
end

#route_blockObject (readonly)

The route block that this class uses.



103
104
105
# File 'lib/roda.rb', line 103

def route_block
  @route_block
end

Instance Method Details

#call(env) ⇒ Object

Call the internal rack application with the given environment. This allows the class itself to be used as a rack application. However, for performance, it’s better to use #app to get direct access to the underlying rack app.



109
110
111
# File 'lib/roda.rb', line 109

def call(env)
  app.call(env)
end

#hash_matcher(key, &block) ⇒ Object

Create a match_#key method in the request class using the given block, so that using a hash key in a request match method will call the block. The block should return nil or false to not match, and anything else to match.

class App < Roda
  hash_matcher(:foo) do |v|
    self['foo'] == v
  end

  route do
    r.on :foo=>'bar' do
      # matches when param foo has value bar
    end
  end
end


129
130
131
# File 'lib/roda.rb', line 129

def hash_matcher(key, &block)
  request_module{define_method(:"match_#{key}", &block)}
end

#inherited(subclass) ⇒ Object

When inheriting Roda, copy the shared data into the subclass, and setup the request and response subclasses.



135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/roda.rb', line 135

def inherited(subclass)
  super
  subclass.instance_variable_set(:@middleware, @middleware.dup)
  subclass.instance_variable_set(:@opts, opts.dup)
  subclass.instance_variable_set(:@route_block, @route_block)
  subclass.send(:build_rack_app)
  
  request_class = Class.new(self::RodaRequest)
  request_class.roda_class = subclass
  request_class.match_pattern_cache = thread_safe_cache
  subclass.const_set(:RodaRequest, request_class)

  response_class = Class.new(self::RodaResponse)
  response_class.roda_class = subclass
  subclass.const_set(:RodaResponse, response_class)
end

#plugin(mixin, *args, &block) ⇒ Object

Load a new plugin into the current class. A plugin can be a module which is used directly, or a symbol represented a registered plugin which will be required and then used.

Roda.plugin PluginModule
Roda.plugin :csrf


158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
# File 'lib/roda.rb', line 158

def plugin(mixin, *args, &block)
  if mixin.is_a?(Symbol)
    mixin = RodaPlugins.load_plugin(mixin)
  end

  if mixin.respond_to?(:load_dependencies)
    mixin.load_dependencies(self, *args, &block)
  end

  if defined?(mixin::InstanceMethods)
    include mixin::InstanceMethods
  end
  if defined?(mixin::ClassMethods)
    extend mixin::ClassMethods
  end
  if defined?(mixin::RequestMethods)
    self::RodaRequest.send(:include, mixin::RequestMethods)
  end
  if defined?(mixin::RequestClassMethods)
    self::RodaRequest.extend mixin::RequestClassMethods
  end
  if defined?(mixin::ResponseMethods)
    self::RodaResponse.send(:include, mixin::ResponseMethods)
  end
  if defined?(mixin::ResponseClassMethods)
    self::RodaResponse.extend mixin::ResponseClassMethods
  end
  
  if mixin.respond_to?(:configure)
    mixin.configure(self, *args, &block)
  end
end

#request_module(mod = nil, &block) ⇒ Object

Include the given module in the request class. If a block is provided instead of a module, create a module using the the block. Example:

Roda.request_module SomeModule

Roda.request_module do
  def description
    "#{request_method} #{path_info}"
  end
end

Roda.route do |r|
  r.description
end


206
207
208
# File 'lib/roda.rb', line 206

def request_module(mod = nil, &block)
  module_include(:request, mod, &block)
end

#response_module(mod = nil, &block) ⇒ Object

Include the given module in the response class. If a block is provided instead of a module, create a module using the the block. Example:

Roda.response_module SomeModule

Roda.response_module do
  def error!
    self.status = 500
  end
end

Roda.route do |r|
  response.error!
end


225
226
227
# File 'lib/roda.rb', line 225

def response_module(mod = nil, &block)
  module_include(:response, mod, &block)
end

#route(&block) ⇒ Object

Setup routing tree for the current Roda application, and build the underlying rack application using the stored middleware. Requires a block, which is yielded the request. By convention, the block argument should be named r. Example:

Roda.route do |r|
  r.root do
    "Root"
  end
end

This should only be called once per class, and if called multiple times will overwrite the previous routing.



242
243
244
245
# File 'lib/roda.rb', line 242

def route(&block)
  @route_block = block
  build_rack_app
end

#thread_safe_cacheObject

A new thread safe cache instance. This is a method so it can be easily overridden for alternative implementations.



249
250
251
# File 'lib/roda.rb', line 249

def thread_safe_cache
  RodaCache.new
end

#use(*args, &block) ⇒ Object

Add a middleware to use for the rack application. Must be called before calling #route to have an effect. Example:

Roda.use Rack::Session::Cookie, :secret=>ENV['secret']


257
258
259
260
# File 'lib/roda.rb', line 257

def use(*args, &block)
  @middleware << [args, block]
  build_rack_app
end