CrazyHashFilter

Build Status

Hash filtering by advanced rules.

Can be used to reduce API data throughput if you are building API responses from hashes.

Installation

Add this line to your application's Gemfile:

gem 'crazy_hash_filter'

Usage

You can use hash filter like this:

  filtered_hash = CrazyHashFilter.process(hash, rules)

Or shorthand versions:

  filtered_hash = hash.crazy_filter(rules)

Filtering in place:

  hash.crazy_filter!(rules)

Sample hash

  @sample = {
    :code => 0,
    :items => [
      { :id => 1,
        :title => 'First item',
        :thumbs => [
          { :code => '50', :url => 'http://some-url/1/50' },
          { :code => '100', :url => 'http://some-url/1/100' },
          { :code => '150', :url => 'http://some-url/1/150' }
        ]
      },
      { :id => 2,
        :title => 'Second item',
        :thumbs => [
          { :code => '50', :url => 'http://some-url/2/50' },
          { :code => '100', :url => 'http://some-url/2/100' },
          { :code => '150', :url => 'http://some-url/2/150' }
        ]
      },
    ]
  }

Simple filtering

  rules  = { :select => [ :code ] }

Result

  result = CrazyHashFilter.process(@sample, rules)

  { :code => 0 }

Filtering with nested rules

  rules = {
    :select => [ :code, :items ],
    :child_rules => {
      :items => { :select => [ :id, :title ] }
    }
  }

Result

  result = CrazyHashFilter.process(@sample, rules)

  { :code=>0,
    :items=> [
      {:id=>1, :title=>"First item"},
      {:id=>2, :title=>"Second item"}
    ]
  }

Filtering with conditions

  rules = {
    :select => [ :code, :items ],
      :child_rules => {
      :items => {
        :select => [ :id, :thumbs ],

        :child_rules => {
          :thumbs => {
            :conditions => {
              :code => '50'
            }
          }
        }
      }
    }
  }

Result

  result = CrazyHashFilter.process(@sample, rules)

  { :code=>0,
    :items=> [
      { :id=>1, :thumbs=> [ { :code=>"50", :url=> "http://some-url/1/50" } ] },
      { :id=>2, :thumbs=> [ { :code=>"50", :url=> "http://some-url/2/50" } ] }
  ]}

Filtering with conditions array

  rules = {
    :select => [ :code, :items ],
      :child_rules => {
      :items => {
        :select => [ :id, :thumbs ],

        :child_rules => {
          :thumbs => {
            :conditions => {
              :code => [ '50', '100' ]
            }
          }
        }
      }
    }
  }

Result

  result = CrazyHashFilter.process(@sample, rules)

  { :code => 0,
    :items=> [
      { :id=>1,
        :thumbs=>[
          { :code => "50", :url => "http://some-url/1/50" },
          { :code => "100", :url => "http://some-url/1/100" }
        ]
      },
      { :id => 2,
        :thumbs => [
          { :code => "50", :url => "http://some-url/2/50" },
          { :code => "100", :url => "http://some-url/2/100" }
        ]
      }
    ]
  }