You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Modware is a library for using middleware (pipeline) patterns in Ruby projects. It features a simple interface and supports "callback" style semantics in the middleware stack, including before, after, and around methods.
Installation
As usual:
gem'modware'# in a Gemfilespec.add_dependency'modware'# in a .gemspec
Usage
Creating a stack
Create a stack using:
stack=Modware::Stack.new(env: klass)
where klass is a Class for the environment instance that will be passed to the layers of the stack. As a shorthand for the common case, you can simply pass an array of keys, e.g.
and Modware will define a class that accepts those keys as keyword arguments, and has accessor methods for each
Defining middleware
Define middleware by creating a module that defines one or more of these middleware methods:
moduleMyMiddleware# define any of these as needed...defbefore(env)# code to be called before the base implementationenddefafter(env)# code to be called after the base implementationenddefaround(env)# setup/wrapper codeyieldenv# continues execution down the stack# cleanup codeenddefimplement(env)# completely replaces the base implementation or any earlier middleware's implement()endend
The module may use instance variables and define other methods as needed (e.g. to abide by Metz' rule #2).
To add the middleware to a stack:
stack.add(MyMiddleware)
Middleware is always added to the end of the stack.
Executing a stack
To execute a stack do:
stack.start(*args){ |env|
# base implementation }
The execution sequence of the stack is as follows:
Call each middleware before(env) method, in the order they were added
Call each middleware around(env) method, in the order they were added. This bottoms out with the last implement(env) method to be added, if any, otherwise the base implementation
Call each middleware after(env) method, in the order they were added
stack.start returns env
Example: wrapping an existing operation
A common idiom is to wrap a modware stack around an existing operation: