Filterable

Build Status Code Climate Coverage Status Inline docs

Filterable allows to map incoming parameters to filter functions. The goal is to provide minimal and easy to use DSL for building filters using pure Elixir. Filterable doesn’t depend on external libraries or frameworks and can be used both in Phoenix and pure Elixir projects. Inspired by has_scope.

Installation

Add filterable to your mix.exs.

{:filterable, "~> 0.1.7"}

Usage

Common usage:

defmodule RepoFilters do
  use Filterable.DSL

  filter name(list, value) do
    list |> Enum.filter(& &1.name == value)
  end

  filter stars(list, value) do
    list |> Enum.filter(& &1.stars >= value)
  end
end

repos = [%{name: "phoenix", stars: 8565}, %{name: "ecto", start: 2349}]

RepoFilters.apply_filters(repos, %{name: "phoenix", stars: 8000})

Phoenix usage:

defmodule MyApp.PostController do
  use MyApp.Web, :controller
  use Filterable.DSL

  @options allow_nil: true
  filter author(query, value, current_user) when is_nil(value) do
    query |> where(author_id: ^current_user.id)
  end
  filter author(query, value, _current_user) do
    query |> where(author_name: ^value)
  end

  def index(conn, params, current_user) do
    posts = Post |> apply_filters(params, share: current_user) |> Repo.all
    render(conn, "index.json-api", data: posts)
  end
end

TODO:

  • [ ] Coverage 100%
  • [ ] Update README
  • [ ] Documentation
  • [ ] Improve tests

Contribution

Feel free to send your PR with proposals, improvements or corrections!