Module: Rack::Reducer

Defined in:
lib/rack/reducer.rb,
lib/rack/reducer/parser.rb,
lib/rack/reducer/version.rb,
lib/rack/reducer/reduction.rb,
lib/rack/reducer/middleware.rb,
lib/rack/reducer/refinements.rb

Overview

Use request params to apply filters to a dataset

Defined Under Namespace

Classes: Middleware

Constant Summary collapse

VERSION =
'1.0.1'.freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.call(params, dataset:, filters:) ⇒ Object

Filter a dataset

Examples:

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


22
23
24
25
26
27
28
# File 'lib/rack/reducer.rb', line 22

def self.call(params, dataset:, filters:)
  Reduction.new(
    params: params,
    filters: filters,
    dataset: dataset
  ).reduce
end

.new(app, options = {}) ⇒ Object

Mount Rack::Reducer as middleware



31
32
33
# File 'lib/rack/reducer.rb', line 31

def self.new(app, options = {})
  Middleware.new(app, options)
end

Instance Method Details

#reduces(dataset, filters:) ⇒ Object

Extend Rack::Reducer to get reduce and reduces as class-methods

Examples:

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)


46
47
48
49
50
51
52
53
54
# File 'lib/rack/reducer.rb', line 46

def reduces(dataset, filters:)
  define_singleton_method :reduce do |params|
    Reduction.new(
      params: params,
      filters: filters,
      dataset: dataset,
    ).reduce
  end
end