Sha256: 6ffb48a756e7e5363fb9b74ee1af5a3adc3c7d1b7d29dba4e97d173268ce30de
Contents?: true
Size: 1.63 KB
Versions: 1
Compression:
Stored size: 1.63 KB
Contents
require_relative 'reducer/reduction' require_relative 'reducer/middleware' module Rack # Use request params to apply filters to a dataset module Reducer # Filter a dataset # @param params [Hash] Rack-compatible URL params # @param dataset [Object] A dataset, e.g. one of your App's models # @param filters [Array<Proc>] An array of lambdas with keyword arguments # @example Call Rack::Reducer as a function in a Sinatra app # ArtistReducer = { # dataset: Artist, # filters: [ # lambda { |name:| where(name: name) }, # lambda { |genre:| where(genre: genre) }, # ] # } # get '/artists' do # @artists = Rack::Reducer.call(params, ArtistReducer) # end def self.call(params, dataset:, filters:) Reduction.new( params: params, filters: filters, dataset: dataset ).reduce end # Mount Rack::Reducer as middleware def self.new(app, options = {}) Middleware.new(app, options) end # Extend Rack::Reducer to get +reduce+ and +reduces+ as class-methods # @example Make an "Artists" model reducible # class Artist < SomeORM::Model # extend Rack::Reducer # reduces self.all, filters: [ # lambda { |name:| where(name: name) }, # lambda { |genre:| where(genre: genre) }, # ] # end # # Artist.reduce(params) def reduces(dataset, filters:) define_singleton_method :reduce do |params| Reduction.new( params: params, filters: filters, dataset: dataset, ).reduce end end end end
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
rack-reducer-1.0.1 | lib/rack/reducer.rb |