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