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

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" }
        ]
      }
    ]
  }