backupify/data_filter

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# DataFilter

[![Gem Version](https://badge.fury.io/rb/data_filter.svg)](http://badge.fury.io/rb/data_filter)
[![Build Status](https://travis-ci.org/backupify/data_filter.svg)](https://travis-ci.org/backupify/data_filter)
[![Coverage Status](https://coveralls.io/repos/backupify/data_filter/badge.svg?branch=master&service=github)](https://coveralls.io/github/backupify/data_filter?branch=master)
[![Code Climate](https://codeclimate.com/github/backupify/data_filter/badges/gpa.svg)](https://codeclimate.com/github/backupify/data_filter)

an extensible DSL for filtering data sets

## Summary

`DataFilter` is a library for creating filters that are consistent, reusable, and easy to read. A filter is simply something that decides whether or not an element should be removed from a set. For example, we could create a `DataFilter::FilterSet` that is comprised of various filters and then pass an array into the filter set. The filter set will then remove elements that do not pass each of the filters.

## Installation

```
gem install data_filter
```

## Usage

`DataFilter::FilterSet::create` provides a DSL for creating a collection
of filters which can be applied to your data. The DSL is designed to be
controller friendly and will only apply filters if a parameter is specified.
If a filter doesn't do what you need then you can pass any object that responds
to `#call` (e.g. a lambda) to `add_filter`.

```rb
filter_set = DataFilter::FilterSet.create do
  # Fuzzy comparison
  like_filter :name, by: params[:name]

  # Fuzzy comparison with custom normalization
  like_filter :name, by: params[:name], normalize_regex: /[^\w\s^@^.^+^-]/

  # Keyword search
  keyword_filter [:gender], by: params[:gender]

  # Match truthy/falsey values
  truthy_filter :student, match: params[:is_student]

  # Check if within range
  range_filter :age, ceiling: params[:max_age]

  # Check if ranges overlap
  range_filter :start, :end, floor: Date.parse('2015-01-01')

  # Add a custom filter
  add_filter -> (user) { user if user.student || user.age > 25 }
end

data = [
  User.create(name: 'Josh', age: 26, student: false, gender: :male, start: Date.parse('2007-01-01'), end: Date.parse('2013-01-01')),
  User.create(name: 'Lauren', age: 25, student: true, gender: :female, start: Date.parse('2008-01-01'), end: Date.parse('2016-01-01'))
]

# By default data which doesn't match all of the filters will be filtered out
filter_set.call(data)
```

## Changelog

```
* v0.4.0

- Added :normalize_regex option to LikeFilter

* v0.3.1

- Extend DSL with PrefixFilter

* v0.3.0

- Added PrefixFilter

* v0.2.0

- Fix RangeOverlapFilter edge cases
```

## License

The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).