hash_gleaner 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +28 -0
- data/README.md +96 -0
- data/Rakefile +7 -0
- data/hash_gleaner.gemspec +19 -0
- data/lib/hash_gleaner.rb +32 -0
- data/lib/hash_gleaner/list.rb +35 -0
- data/lib/hash_gleaner/missing_keys.rb +23 -0
- data/lib/hash_gleaner/value_gleaner.rb +31 -0
- data/spec/hash_gleaner/list_spec.rb +282 -0
- data/spec/hash_gleaner_spec.rb +20 -0
- data/spec/spec_helper.rb +11 -0
- metadata +73 -0
    
        checksums.yaml
    ADDED
    
    | @@ -0,0 +1,7 @@ | |
| 1 | 
            +
            ---
         | 
| 2 | 
            +
            SHA1:
         | 
| 3 | 
            +
              metadata.gz: 793b3cd699bd9aaf6752dbf535fbafebe06d8271
         | 
| 4 | 
            +
              data.tar.gz: b65f1d6ad827696689dee4a8340bb18b59e402c3
         | 
| 5 | 
            +
            SHA512:
         | 
| 6 | 
            +
              metadata.gz: 8f531a2c6f8f5ed0989fd59482cf82f824dacb69805ff72fdab81e56405c18c59e939200ce7866c151340620465ab977727585c5b957f451caf8113f59f7de68
         | 
| 7 | 
            +
              data.tar.gz: 7a1e93023da03433a8488b69a23c99c3f234369656596c067055d2d14209f2eafbfaddf30b8b24c9e9d349898d7a9d12b19976c3b2271952786cec2d95bfd0c7
         | 
    
        data/Gemfile
    ADDED
    
    
    
        data/Gemfile.lock
    ADDED
    
    | @@ -0,0 +1,28 @@ | |
| 1 | 
            +
            PATH
         | 
| 2 | 
            +
              remote: .
         | 
| 3 | 
            +
              specs:
         | 
| 4 | 
            +
                hash_gleaner (0.1.0)
         | 
| 5 | 
            +
             | 
| 6 | 
            +
            GEM
         | 
| 7 | 
            +
              remote: http://rubygems.org/
         | 
| 8 | 
            +
              specs:
         | 
| 9 | 
            +
                diff-lcs (1.2.5)
         | 
| 10 | 
            +
                rspec (3.0.0)
         | 
| 11 | 
            +
                  rspec-core (~> 3.0.0)
         | 
| 12 | 
            +
                  rspec-expectations (~> 3.0.0)
         | 
| 13 | 
            +
                  rspec-mocks (~> 3.0.0)
         | 
| 14 | 
            +
                rspec-core (3.0.2)
         | 
| 15 | 
            +
                  rspec-support (~> 3.0.0)
         | 
| 16 | 
            +
                rspec-expectations (3.0.2)
         | 
| 17 | 
            +
                  diff-lcs (>= 1.2.0, < 2.0)
         | 
| 18 | 
            +
                  rspec-support (~> 3.0.0)
         | 
| 19 | 
            +
                rspec-mocks (3.0.2)
         | 
| 20 | 
            +
                  rspec-support (~> 3.0.0)
         | 
| 21 | 
            +
                rspec-support (3.0.2)
         | 
| 22 | 
            +
             | 
| 23 | 
            +
            PLATFORMS
         | 
| 24 | 
            +
              ruby
         | 
| 25 | 
            +
             | 
| 26 | 
            +
            DEPENDENCIES
         | 
| 27 | 
            +
              hash_gleaner!
         | 
| 28 | 
            +
              rspec
         | 
    
        data/README.md
    ADDED
    
    | @@ -0,0 +1,96 @@ | |
| 1 | 
            +
            # HashGleaner
         | 
| 2 | 
            +
            ## Summary
         | 
| 3 | 
            +
            `HashGleaner` allows you to declare hash structure you want to get like Strong Parameters.
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            ## Example
         | 
| 6 | 
            +
             | 
| 7 | 
            +
            ```ruby
         | 
| 8 | 
            +
            require 'hash_gleaner'
         | 
| 9 | 
            +
             | 
| 10 | 
            +
            h = {
         | 
| 11 | 
            +
              :account => {
         | 
| 12 | 
            +
                :id => 1234,
         | 
| 13 | 
            +
                :email => 'xxx@xxx.xx',
         | 
| 14 | 
            +
                :name => 'John Doe',
         | 
| 15 | 
            +
                :phone => [
         | 
| 16 | 
            +
                  {
         | 
| 17 | 
            +
                    :id => 2345,
         | 
| 18 | 
            +
                    :type => 'mobile',
         | 
| 19 | 
            +
                    :number => 'xxxxxxxxxx',
         | 
| 20 | 
            +
                  },
         | 
| 21 | 
            +
                  {
         | 
| 22 | 
            +
                    :id => 2346,
         | 
| 23 | 
            +
                    :type => 'office',
         | 
| 24 | 
            +
                    :number => 'yyyyyyyyyy',
         | 
| 25 | 
            +
                  },
         | 
| 26 | 
            +
                ],
         | 
| 27 | 
            +
              },
         | 
| 28 | 
            +
            }
         | 
| 29 | 
            +
             | 
| 30 | 
            +
            params = HashGleaner.apply(h) do
         | 
| 31 | 
            +
                       o :account do
         | 
| 32 | 
            +
                         o :name
         | 
| 33 | 
            +
                         o :phone do
         | 
| 34 | 
            +
                           o :type
         | 
| 35 | 
            +
                           o :number
         | 
| 36 | 
            +
                         end
         | 
| 37 | 
            +
                       end
         | 
| 38 | 
            +
                     end
         | 
| 39 | 
            +
            #=> {:account=>{:name=>"John Doe", :phone=>[{:type=>"mobile", :number=>"xxxxxxxxxx"}, {:type=>"office", :number=>"yyyyyyyyyy"}]}}
         | 
| 40 | 
            +
            ```
         | 
| 41 | 
            +
             | 
| 42 | 
            +
            When `Hash` object includes `HashGleaner` module, you can use `glean` method.
         | 
| 43 | 
            +
             | 
| 44 | 
            +
            ```ruby
         | 
| 45 | 
            +
            class << h; include HashGleaner; end
         | 
| 46 | 
            +
             | 
| 47 | 
            +
            params = h.glean do
         | 
| 48 | 
            +
                       o :account do
         | 
| 49 | 
            +
                         o :name
         | 
| 50 | 
            +
                         o :phone do
         | 
| 51 | 
            +
                           o :type
         | 
| 52 | 
            +
                           o :number
         | 
| 53 | 
            +
                         end
         | 
| 54 | 
            +
                       end
         | 
| 55 | 
            +
                     end
         | 
| 56 | 
            +
            ```
         | 
| 57 | 
            +
             | 
| 58 | 
            +
            hash structure can be described as `Proc` object.
         | 
| 59 | 
            +
             | 
| 60 | 
            +
            ```ruby
         | 
| 61 | 
            +
            proc = Proc.new{
         | 
| 62 | 
            +
              o :account do
         | 
| 63 | 
            +
                o :name
         | 
| 64 | 
            +
                o :phone do
         | 
| 65 | 
            +
                  o :type
         | 
| 66 | 
            +
                  o :number
         | 
| 67 | 
            +
                end
         | 
| 68 | 
            +
              end
         | 
| 69 | 
            +
            }
         | 
| 70 | 
            +
             | 
| 71 | 
            +
            params = h.glean(proc)
         | 
| 72 | 
            +
            params = HashGleaner.apply(h, proc)
         | 
| 73 | 
            +
            ```
         | 
| 74 | 
            +
             | 
| 75 | 
            +
            You can describe `required` or `optional` in hash structure.
         | 
| 76 | 
            +
            When the hash object misses any required keys,
         | 
| 77 | 
            +
            `HashGleaner` raises `MissingKeysException`.
         | 
| 78 | 
            +
             | 
| 79 | 
            +
            ```ruby
         | 
| 80 | 
            +
            proc = Proc.new{
         | 
| 81 | 
            +
              (required)
         | 
| 82 | 
            +
              o :account do
         | 
| 83 | 
            +
                o :name
         | 
| 84 | 
            +
                o :phone do
         | 
| 85 | 
            +
                  (required)
         | 
| 86 | 
            +
                  o :number
         | 
| 87 | 
            +
                  o :name
         | 
| 88 | 
            +
                end
         | 
| 89 | 
            +
              end
         | 
| 90 | 
            +
              (optional)
         | 
| 91 | 
            +
              o :admin
         | 
| 92 | 
            +
            }
         | 
| 93 | 
            +
             | 
| 94 | 
            +
            params = h.glean(proc)
         | 
| 95 | 
            +
            #=> HashGleaner::MissingKeyException: Missing required keys [:name]
         | 
| 96 | 
            +
            ```
         | 
    
        data/Rakefile
    ADDED
    
    
| @@ -0,0 +1,19 @@ | |
| 1 | 
            +
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            +
            $:.push File.expand_path("../lib", __FILE__)
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            Gem::Specification.new do |s|
         | 
| 5 | 
            +
              s.name          = "hash_gleaner"
         | 
| 6 | 
            +
              s.authors       = ["hosim"]
         | 
| 7 | 
            +
              s.email         = ["github.hosim@gmail.com"]
         | 
| 8 | 
            +
              s.description   = "HashGleaner allows you to declare hash structure you want to get."
         | 
| 9 | 
            +
              s.summary       = "HashGleaner allows you to declare hash structure you want to get."
         | 
| 10 | 
            +
              s.homepage      = "https://github.com/hosim/hash_gleaner"
         | 
| 11 | 
            +
              s.executables   = `git ls-files -- bin/*`.split("\n").map {|f| File.basename(f) }
         | 
| 12 | 
            +
              s.files         = `git ls-files`.split("\n")
         | 
| 13 | 
            +
              s.test_files    = `git ls-files -- {test,spec,features}/*`.split("\n")
         | 
| 14 | 
            +
              s.require_paths = ["lib"]
         | 
| 15 | 
            +
              s.version       = "0.1.0"
         | 
| 16 | 
            +
              s.license       = "MIT"
         | 
| 17 | 
            +
             | 
| 18 | 
            +
              s.add_development_dependency 'rspec'
         | 
| 19 | 
            +
            end
         | 
    
        data/lib/hash_gleaner.rb
    ADDED
    
    | @@ -0,0 +1,32 @@ | |
| 1 | 
            +
            # coding: utf-8
         | 
| 2 | 
            +
            require 'hash_gleaner/list'
         | 
| 3 | 
            +
            require 'hash_gleaner/missing_keys'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module HashGleaner
         | 
| 6 | 
            +
              class << self
         | 
| 7 | 
            +
                def included(base)
         | 
| 8 | 
            +
                  base.__send__ :include, InstanceMethods
         | 
| 9 | 
            +
                end
         | 
| 10 | 
            +
             | 
| 11 | 
            +
                def apply(hash, proc=nil, &block)
         | 
| 12 | 
            +
                  missing_keys = MissingKeys.new
         | 
| 13 | 
            +
                  action = (block if block_given?) || (proc if proc.is_a? Proc)
         | 
| 14 | 
            +
                  h = List.new(hash, missing_keys).instance_eval(&action) if action
         | 
| 15 | 
            +
                  raise MissingKeysException.new(missing_keys) if missing_keys.has_keys?
         | 
| 16 | 
            +
                  h
         | 
| 17 | 
            +
                end
         | 
| 18 | 
            +
              end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
              module InstanceMethods
         | 
| 21 | 
            +
                def glean(proc=nil, &block)
         | 
| 22 | 
            +
                  HashGleaner.apply(self, proc, &block)
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              class MissingKeysException < StandardError
         | 
| 27 | 
            +
                def initialize(missing_keys)
         | 
| 28 | 
            +
                  msg = "Missing required keys #{missing_keys.keys.uniq}"
         | 
| 29 | 
            +
                  super(msg)
         | 
| 30 | 
            +
                end
         | 
| 31 | 
            +
              end
         | 
| 32 | 
            +
            end
         | 
| @@ -0,0 +1,35 @@ | |
| 1 | 
            +
            # coding: utf-8
         | 
| 2 | 
            +
            require 'hash_gleaner/value_gleaner'
         | 
| 3 | 
            +
            require 'hash_gleaner/missing_keys'
         | 
| 4 | 
            +
             | 
| 5 | 
            +
            module HashGleaner
         | 
| 6 | 
            +
              class List
         | 
| 7 | 
            +
                def initialize(hash, missing_keys)
         | 
| 8 | 
            +
                  @origin = hash
         | 
| 9 | 
            +
                  @hash = {}
         | 
| 10 | 
            +
                  @mode = :optional
         | 
| 11 | 
            +
                  @missing_keys = missing_keys
         | 
| 12 | 
            +
                  @gleaner = ValueGleaner.new(missing_keys)
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def o(name, *options, &block)
         | 
| 16 | 
            +
                  unless @origin.has_key?(name)
         | 
| 17 | 
            +
                    @missing_keys.add(name) if @mode == :required
         | 
| 18 | 
            +
                    return @hash
         | 
| 19 | 
            +
                  end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                  @hash[name] = @gleaner.glean(@origin[name], block, {})
         | 
| 22 | 
            +
                  @hash
         | 
| 23 | 
            +
                end
         | 
| 24 | 
            +
             | 
| 25 | 
            +
                def required
         | 
| 26 | 
            +
                  @mode = :required
         | 
| 27 | 
            +
                  @hash
         | 
| 28 | 
            +
                end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
                def optional
         | 
| 31 | 
            +
                  @mode = :optional
         | 
| 32 | 
            +
                  @hash
         | 
| 33 | 
            +
                end
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
            end
         | 
| @@ -0,0 +1,23 @@ | |
| 1 | 
            +
            # coding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module HashGleaner
         | 
| 4 | 
            +
              class MissingKeys
         | 
| 5 | 
            +
                def initialize
         | 
| 6 | 
            +
                  @keys = []
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def add(key)
         | 
| 10 | 
            +
                  keys << key
         | 
| 11 | 
            +
                end
         | 
| 12 | 
            +
             | 
| 13 | 
            +
                def has_keys?
         | 
| 14 | 
            +
                  ! keys.empty?
         | 
| 15 | 
            +
                end
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                def clear
         | 
| 18 | 
            +
                  @keys = []
         | 
| 19 | 
            +
                end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
                attr_reader :keys
         | 
| 22 | 
            +
              end
         | 
| 23 | 
            +
            end
         | 
| @@ -0,0 +1,31 @@ | |
| 1 | 
            +
            # coding: utf-8
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module HashGleaner
         | 
| 4 | 
            +
              class ValueGleaner
         | 
| 5 | 
            +
                def initialize(missing_keys)
         | 
| 6 | 
            +
                  @missing_keys = missing_keys
         | 
| 7 | 
            +
                end
         | 
| 8 | 
            +
             | 
| 9 | 
            +
                def value_type(value)
         | 
| 10 | 
            +
                  return :array if value.is_a? Array
         | 
| 11 | 
            +
                  return :hash  if value.is_a? Enumerable
         | 
| 12 | 
            +
                  return :single
         | 
| 13 | 
            +
                end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
                def glean(value, proc, empty_hash=Empty)
         | 
| 16 | 
            +
                  case value_type(value)
         | 
| 17 | 
            +
                  when :single
         | 
| 18 | 
            +
                    value
         | 
| 19 | 
            +
                  when :hash
         | 
| 20 | 
            +
                    proc ? List.new(value, @missing_keys).instance_eval(&proc) : empty_hash
         | 
| 21 | 
            +
                  when :array
         | 
| 22 | 
            +
                    value.each_with_object([]) {|val, a|
         | 
| 23 | 
            +
                      v = glean(val, proc)
         | 
| 24 | 
            +
                      a << v unless v == Empty
         | 
| 25 | 
            +
                    }
         | 
| 26 | 
            +
                  end
         | 
| 27 | 
            +
                end
         | 
| 28 | 
            +
              end
         | 
| 29 | 
            +
             | 
| 30 | 
            +
              class Empty; end
         | 
| 31 | 
            +
            end
         | 
| @@ -0,0 +1,282 @@ | |
| 1 | 
            +
            # -*- encoding: utf-8 -*-
         | 
| 2 | 
            +
            require 'spec_helper'
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe HashGleaner::List do
         | 
| 5 | 
            +
              let(:missing_keys) { HashGleaner::MissingKeys.new }
         | 
| 6 | 
            +
             | 
| 7 | 
            +
              describe '#o' do
         | 
| 8 | 
            +
                context 'when an original Hash has the specified key' do
         | 
| 9 | 
            +
                  let(:original_hash) do
         | 
| 10 | 
            +
                    {
         | 
| 11 | 
            +
                      foo: :zzz,
         | 
| 12 | 
            +
                      baa: [:wibble, :wobble, :wubble],
         | 
| 13 | 
            +
                      baz: {
         | 
| 14 | 
            +
                        spam: :pee,
         | 
| 15 | 
            +
                        ham: :kaa,
         | 
| 16 | 
            +
                        egg: :boo,
         | 
| 17 | 
            +
                      },
         | 
| 18 | 
            +
                      qux: [
         | 
| 19 | 
            +
                        {
         | 
| 20 | 
            +
                          toto: :hoge,
         | 
| 21 | 
            +
                          titi: :fuga,
         | 
| 22 | 
            +
                          tutu: :piyo,
         | 
| 23 | 
            +
                        },
         | 
| 24 | 
            +
                        {
         | 
| 25 | 
            +
                          toto: :bla,
         | 
| 26 | 
            +
                          titi: :bla,
         | 
| 27 | 
            +
                          tutu: :bla,
         | 
| 28 | 
            +
                        },
         | 
| 29 | 
            +
                      ],
         | 
| 30 | 
            +
                      xyzzy: [
         | 
| 31 | 
            +
                        [:a, :b, :c],
         | 
| 32 | 
            +
                        {
         | 
| 33 | 
            +
                          spam: :_,
         | 
| 34 | 
            +
                          ham:  :_,
         | 
| 35 | 
            +
                          egg:  :_,
         | 
| 36 | 
            +
                        },
         | 
| 37 | 
            +
                        {
         | 
| 38 | 
            +
                          hoge: {
         | 
| 39 | 
            +
                            foo: [:wibble],
         | 
| 40 | 
            +
                          },
         | 
| 41 | 
            +
                          fuge: {
         | 
| 42 | 
            +
                            foo: :a,
         | 
| 43 | 
            +
                          },
         | 
| 44 | 
            +
                          piyo: [
         | 
| 45 | 
            +
                            {
         | 
| 46 | 
            +
                              abc: :x,
         | 
| 47 | 
            +
                              def: :y,
         | 
| 48 | 
            +
                              ghi: :z,
         | 
| 49 | 
            +
                            },
         | 
| 50 | 
            +
                          ],
         | 
| 51 | 
            +
                        },
         | 
| 52 | 
            +
                      ],
         | 
| 53 | 
            +
                    }
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
             | 
| 56 | 
            +
                  let(:gleaner) do
         | 
| 57 | 
            +
                    described_class.new(original_hash, missing_keys)
         | 
| 58 | 
            +
                  end
         | 
| 59 | 
            +
             | 
| 60 | 
            +
                  context 'and the value is not a Hash nor an Array' do
         | 
| 61 | 
            +
                    subject { gleaner.o :foo }
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                    it "returns a Hash that contains the key and the value" do
         | 
| 64 | 
            +
                      expect(subject).to have_key(:foo)
         | 
| 65 | 
            +
                      expect(subject[:foo]).to be :zzz
         | 
| 66 | 
            +
                    end
         | 
| 67 | 
            +
                  end
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                  context 'and the value is a Hash' do
         | 
| 70 | 
            +
                    context 'and passed no block' do
         | 
| 71 | 
            +
                      subject { gleaner.o :baz }
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                      it "returns a Hash that contains the key and " \
         | 
| 74 | 
            +
                         "a blank Hash as its value" do
         | 
| 75 | 
            +
                        expect(subject).to have_key(:baz)
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                        value = subject[:baz]
         | 
| 78 | 
            +
                        expect(value).to be_an_instance_of(Hash)
         | 
| 79 | 
            +
                        expect(value).to be_empty
         | 
| 80 | 
            +
                      end
         | 
| 81 | 
            +
                    end
         | 
| 82 | 
            +
             | 
| 83 | 
            +
                    context 'and passed a block' do
         | 
| 84 | 
            +
                      subject {
         | 
| 85 | 
            +
                        gleaner.o :baz do
         | 
| 86 | 
            +
                          o :ham
         | 
| 87 | 
            +
                          o :egg
         | 
| 88 | 
            +
                        end
         | 
| 89 | 
            +
                      }
         | 
| 90 | 
            +
             | 
| 91 | 
            +
                      it "returns a Hash that contains the key and " \
         | 
| 92 | 
            +
                         "a hash that has pairs the block defined" do
         | 
| 93 | 
            +
                        expect(subject).to have_key(:baz)
         | 
| 94 | 
            +
             | 
| 95 | 
            +
                        value = subject[:baz]
         | 
| 96 | 
            +
                        expect(value).to be_an_instance_of(Hash)
         | 
| 97 | 
            +
                        expect(value.keys).to match_array([:ham, :egg])
         | 
| 98 | 
            +
                        expect(value[:ham]).to be :kaa
         | 
| 99 | 
            +
                        expect(value[:egg]).to be :boo
         | 
| 100 | 
            +
                      end
         | 
| 101 | 
            +
                    end
         | 
| 102 | 
            +
                  end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                  context 'and the value is an Array of scalas' do
         | 
| 105 | 
            +
                    subject { gleaner.o :baa }
         | 
| 106 | 
            +
             | 
| 107 | 
            +
                    it "returns a Hash that contains the key and the array" do
         | 
| 108 | 
            +
                      expect(subject).to have_key(:baa)
         | 
| 109 | 
            +
             | 
| 110 | 
            +
                      value = subject[:baa]
         | 
| 111 | 
            +
                      expect(value).to be_an_instance_of(Array)
         | 
| 112 | 
            +
                      expect(value.size).to be 3
         | 
| 113 | 
            +
                      expect(value[0]).to be :wibble
         | 
| 114 | 
            +
                      expect(value[1]).to be :wobble
         | 
| 115 | 
            +
                      expect(value[2]).to be :wubble
         | 
| 116 | 
            +
                    end
         | 
| 117 | 
            +
                  end
         | 
| 118 | 
            +
             | 
| 119 | 
            +
                  context 'and the value is an Array of Hashs' do
         | 
| 120 | 
            +
                    context 'and no block is passed' do
         | 
| 121 | 
            +
                      subject { gleaner.o :qux }
         | 
| 122 | 
            +
             | 
| 123 | 
            +
                      it "returns a Hash that contains the key and a blank Array as its value" do
         | 
| 124 | 
            +
                        expect(subject).to have_key(:qux)
         | 
| 125 | 
            +
             | 
| 126 | 
            +
                        value = subject[:qux]
         | 
| 127 | 
            +
                        expect(value).to be_an_instance_of(Array)
         | 
| 128 | 
            +
                        expect(value).to be_empty
         | 
| 129 | 
            +
                      end
         | 
| 130 | 
            +
                    end
         | 
| 131 | 
            +
             | 
| 132 | 
            +
                    context 'and a block is passed' do
         | 
| 133 | 
            +
                      subject {
         | 
| 134 | 
            +
                        gleaner.o :qux do
         | 
| 135 | 
            +
                          o :toto
         | 
| 136 | 
            +
                          o :tutu
         | 
| 137 | 
            +
                        end
         | 
| 138 | 
            +
                      }
         | 
| 139 | 
            +
             | 
| 140 | 
            +
                      it "returns a Hash that contains the key and an Array of Hashs " \
         | 
| 141 | 
            +
                         "that has the pairs of a key and a value that is defined the block" do
         | 
| 142 | 
            +
                        expect(subject).to have_key(:qux)
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                        value = subject[:qux]
         | 
| 145 | 
            +
                        expect(value).to be_an_instance_of(Array)
         | 
| 146 | 
            +
                        expect(value[0]).to be_an_instance_of(Hash)
         | 
| 147 | 
            +
                        expect(value[0].keys).to match_array([:toto, :tutu])
         | 
| 148 | 
            +
                        expect(value[0][:toto]).to be :hoge
         | 
| 149 | 
            +
                        expect(value[0][:tutu]).to be :piyo
         | 
| 150 | 
            +
                        expect(value[1]).to be_an_instance_of(Hash)
         | 
| 151 | 
            +
                        expect(value[1].keys).to match_array([:toto, :tutu])
         | 
| 152 | 
            +
                        expect(value[1][:toto]).to be :bla
         | 
| 153 | 
            +
                        expect(value[1][:tutu]).to be :bla
         | 
| 154 | 
            +
                      end
         | 
| 155 | 
            +
                    end
         | 
| 156 | 
            +
                  end
         | 
| 157 | 
            +
             | 
| 158 | 
            +
                  context 'and the value is an Array of mixed types' do
         | 
| 159 | 
            +
                    context 'and no block is passed' do
         | 
| 160 | 
            +
                      subject { gleaner.o :xyzzy }
         | 
| 161 | 
            +
             | 
| 162 | 
            +
                      it "returns a Hash that contains the key and an Array that " \
         | 
| 163 | 
            +
                         "contains values except for Hashs as its value" do
         | 
| 164 | 
            +
                        expect(subject).to have_key(:xyzzy)
         | 
| 165 | 
            +
             | 
| 166 | 
            +
                        value = subject[:xyzzy]
         | 
| 167 | 
            +
                        expect(value).to be_an_instance_of(Array)
         | 
| 168 | 
            +
                        expect(value.size).to be 1
         | 
| 169 | 
            +
                        expect(value.first).to be_an_instance_of(Array)
         | 
| 170 | 
            +
                        expect(value.first.size).to be 3
         | 
| 171 | 
            +
                        expect(value.first[0]).to be :a
         | 
| 172 | 
            +
                        expect(value.first[1]).to be :b
         | 
| 173 | 
            +
                        expect(value.first[2]).to be :c
         | 
| 174 | 
            +
                      end
         | 
| 175 | 
            +
                    end
         | 
| 176 | 
            +
             | 
| 177 | 
            +
                    context 'and a block is passed' do
         | 
| 178 | 
            +
                      subject {
         | 
| 179 | 
            +
                        gleaner.o :xyzzy do
         | 
| 180 | 
            +
                          o :spam
         | 
| 181 | 
            +
                          o :hoge do
         | 
| 182 | 
            +
                            o :foo
         | 
| 183 | 
            +
                          end
         | 
| 184 | 
            +
                          o :fuge
         | 
| 185 | 
            +
                          o :piyo do
         | 
| 186 | 
            +
                            o :def
         | 
| 187 | 
            +
                          end
         | 
| 188 | 
            +
                        end
         | 
| 189 | 
            +
                      }
         | 
| 190 | 
            +
             | 
| 191 | 
            +
                      it "returns a Hash that contains the specified key" do
         | 
| 192 | 
            +
                        expect(subject).to be_an_instance_of(Hash)
         | 
| 193 | 
            +
                        expect(subject).to have_key(:xyzzy)
         | 
| 194 | 
            +
                      end
         | 
| 195 | 
            +
             | 
| 196 | 
            +
                      describe "its value" do
         | 
| 197 | 
            +
                        it "is an Array as the associated value" do
         | 
| 198 | 
            +
                          value = subject[:xyzzy]
         | 
| 199 | 
            +
                          expect(value).to be_an_instance_of(Array)
         | 
| 200 | 
            +
                          expect(value).not_to be_empty
         | 
| 201 | 
            +
                        end
         | 
| 202 | 
            +
             | 
| 203 | 
            +
                        it "has an Array if that is defined in a block" do
         | 
| 204 | 
            +
                          value = subject[:xyzzy].first
         | 
| 205 | 
            +
                          expect(value).to be_an_instance_of(Array)
         | 
| 206 | 
            +
                          expect(value.size).to be 3
         | 
| 207 | 
            +
                          expect(value[0]).to be :a
         | 
| 208 | 
            +
                          expect(value[1]).to be :b
         | 
| 209 | 
            +
                          expect(value[2]).to be :c
         | 
| 210 | 
            +
                        end
         | 
| 211 | 
            +
             | 
| 212 | 
            +
                        it "has a Hash if that is defined in a block" do
         | 
| 213 | 
            +
                          value = subject[:xyzzy][1]
         | 
| 214 | 
            +
                          expect(value).to be_an_instance_of(Hash)
         | 
| 215 | 
            +
                          expect(value.keys).to match_array([:spam])
         | 
| 216 | 
            +
                          expect(value[:spam]).to be :_
         | 
| 217 | 
            +
             | 
| 218 | 
            +
                          value = subject[:xyzzy][2]
         | 
| 219 | 
            +
                          expect(value).to be_an_instance_of(Hash)
         | 
| 220 | 
            +
                          expect(value.keys).to match_array([:hoge, :fuge, :piyo])
         | 
| 221 | 
            +
                          expect(value[:hoge]).to be_an_instance_of(Hash)
         | 
| 222 | 
            +
                          expect(value[:hoge].keys).to match_array([:foo])
         | 
| 223 | 
            +
                          expect(value[:hoge][:foo]).to be_an_instance_of(Array)
         | 
| 224 | 
            +
                          expect(value[:hoge][:foo]).to eq [:wibble]
         | 
| 225 | 
            +
             | 
| 226 | 
            +
                          expect(value[:fuge]).to be_an_instance_of(Hash)
         | 
| 227 | 
            +
                          expect(value[:fuge]).to be_empty
         | 
| 228 | 
            +
             | 
| 229 | 
            +
                          expect(value[:piyo]).to be_an_instance_of(Array)
         | 
| 230 | 
            +
                          expect(value[:piyo].size).to be 1
         | 
| 231 | 
            +
                          expect(value[:piyo].first).to be_an_instance_of(Hash)
         | 
| 232 | 
            +
                          expect(value[:piyo].first.keys).to match_array([:def])
         | 
| 233 | 
            +
                        end
         | 
| 234 | 
            +
                      end
         | 
| 235 | 
            +
                    end
         | 
| 236 | 
            +
                  end
         | 
| 237 | 
            +
                end
         | 
| 238 | 
            +
             | 
| 239 | 
            +
                context 'when an original Hash does not have the specified key' do
         | 
| 240 | 
            +
                  let(:original_hash) do
         | 
| 241 | 
            +
                    {
         | 
| 242 | 
            +
                      pee: :foo,
         | 
| 243 | 
            +
                      kaa: :baa,
         | 
| 244 | 
            +
                      boo: :baz,
         | 
| 245 | 
            +
                    }
         | 
| 246 | 
            +
                  end
         | 
| 247 | 
            +
             | 
| 248 | 
            +
                  let(:gleaner) do
         | 
| 249 | 
            +
                    described_class.new(original_hash, missing_keys)
         | 
| 250 | 
            +
                  end
         | 
| 251 | 
            +
             | 
| 252 | 
            +
                  context 'and it is in default mode' do
         | 
| 253 | 
            +
                    subject { gleaner.o :foo }
         | 
| 254 | 
            +
             | 
| 255 | 
            +
                    it "returns a blank Hash" do
         | 
| 256 | 
            +
                      expect(subject).to be_an_instance_of(Hash)
         | 
| 257 | 
            +
                      expect(subject).to be_empty
         | 
| 258 | 
            +
                    end
         | 
| 259 | 
            +
                  end
         | 
| 260 | 
            +
             | 
| 261 | 
            +
                  context 'and it is in required mode' do
         | 
| 262 | 
            +
                    before { gleaner.required }
         | 
| 263 | 
            +
             | 
| 264 | 
            +
                    it "adds MissingKeys" do
         | 
| 265 | 
            +
                      expect(missing_keys.keys).to be_empty
         | 
| 266 | 
            +
                      gleaner.o :foo
         | 
| 267 | 
            +
                      expect(missing_keys.keys).to match_array([:foo])
         | 
| 268 | 
            +
                    end
         | 
| 269 | 
            +
                  end
         | 
| 270 | 
            +
             | 
| 271 | 
            +
                  context 'and it is in optional mode' do
         | 
| 272 | 
            +
                    before { gleaner.optional }
         | 
| 273 | 
            +
                    subject { gleaner.o :foo }
         | 
| 274 | 
            +
             | 
| 275 | 
            +
                    it "returns a blank Hash" do
         | 
| 276 | 
            +
                      expect(subject).to be_an_instance_of(Hash)
         | 
| 277 | 
            +
                      expect(subject).to be_empty
         | 
| 278 | 
            +
                    end
         | 
| 279 | 
            +
                  end
         | 
| 280 | 
            +
                end
         | 
| 281 | 
            +
              end
         | 
| 282 | 
            +
            end
         | 
| @@ -0,0 +1,20 @@ | |
| 1 | 
            +
            # -*- coding: utf-8 -*-
         | 
| 2 | 
            +
            require "spec_helper"
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            describe HashGleaner do
         | 
| 5 | 
            +
              describe ".included" do
         | 
| 6 | 
            +
                let(:clazz) {
         | 
| 7 | 
            +
                  clazz = Class.new(Hash)
         | 
| 8 | 
            +
                  clazz.__send__ :include, HashGleaner
         | 
| 9 | 
            +
                  clazz
         | 
| 10 | 
            +
                }
         | 
| 11 | 
            +
             | 
| 12 | 
            +
                let(:instance) {
         | 
| 13 | 
            +
                  clazz.new
         | 
| 14 | 
            +
                }
         | 
| 15 | 
            +
             | 
| 16 | 
            +
                it "responds to glean method" do
         | 
| 17 | 
            +
                  expect(instance).to respond_to(:glean)
         | 
| 18 | 
            +
                end
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
            end
         | 
    
        data/spec/spec_helper.rb
    ADDED
    
    
    
        metadata
    ADDED
    
    | @@ -0,0 +1,73 @@ | |
| 1 | 
            +
            --- !ruby/object:Gem::Specification
         | 
| 2 | 
            +
            name: hash_gleaner
         | 
| 3 | 
            +
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            +
              version: 0.1.0
         | 
| 5 | 
            +
            platform: ruby
         | 
| 6 | 
            +
            authors:
         | 
| 7 | 
            +
            - hosim
         | 
| 8 | 
            +
            autorequire: 
         | 
| 9 | 
            +
            bindir: bin
         | 
| 10 | 
            +
            cert_chain: []
         | 
| 11 | 
            +
            date: 2014-06-28 00:00:00.000000000 Z
         | 
| 12 | 
            +
            dependencies:
         | 
| 13 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              name: rspec
         | 
| 15 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 16 | 
            +
                requirements:
         | 
| 17 | 
            +
                - - '>='
         | 
| 18 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            +
                    version: '0'
         | 
| 20 | 
            +
              type: :development
         | 
| 21 | 
            +
              prerelease: false
         | 
| 22 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 23 | 
            +
                requirements:
         | 
| 24 | 
            +
                - - '>='
         | 
| 25 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 26 | 
            +
                    version: '0'
         | 
| 27 | 
            +
            description: HashGleaner allows you to declare hash structure you want to get.
         | 
| 28 | 
            +
            email:
         | 
| 29 | 
            +
            - github.hosim@gmail.com
         | 
| 30 | 
            +
            executables: []
         | 
| 31 | 
            +
            extensions: []
         | 
| 32 | 
            +
            extra_rdoc_files: []
         | 
| 33 | 
            +
            files:
         | 
| 34 | 
            +
            - Gemfile
         | 
| 35 | 
            +
            - Gemfile.lock
         | 
| 36 | 
            +
            - README.md
         | 
| 37 | 
            +
            - Rakefile
         | 
| 38 | 
            +
            - hash_gleaner.gemspec
         | 
| 39 | 
            +
            - lib/hash_gleaner.rb
         | 
| 40 | 
            +
            - lib/hash_gleaner/list.rb
         | 
| 41 | 
            +
            - lib/hash_gleaner/missing_keys.rb
         | 
| 42 | 
            +
            - lib/hash_gleaner/value_gleaner.rb
         | 
| 43 | 
            +
            - spec/hash_gleaner/list_spec.rb
         | 
| 44 | 
            +
            - spec/hash_gleaner_spec.rb
         | 
| 45 | 
            +
            - spec/spec_helper.rb
         | 
| 46 | 
            +
            homepage: https://github.com/hosim/hash_gleaner
         | 
| 47 | 
            +
            licenses:
         | 
| 48 | 
            +
            - MIT
         | 
| 49 | 
            +
            metadata: {}
         | 
| 50 | 
            +
            post_install_message: 
         | 
| 51 | 
            +
            rdoc_options: []
         | 
| 52 | 
            +
            require_paths:
         | 
| 53 | 
            +
            - lib
         | 
| 54 | 
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 55 | 
            +
              requirements:
         | 
| 56 | 
            +
              - - '>='
         | 
| 57 | 
            +
                - !ruby/object:Gem::Version
         | 
| 58 | 
            +
                  version: '0'
         | 
| 59 | 
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 60 | 
            +
              requirements:
         | 
| 61 | 
            +
              - - '>='
         | 
| 62 | 
            +
                - !ruby/object:Gem::Version
         | 
| 63 | 
            +
                  version: '0'
         | 
| 64 | 
            +
            requirements: []
         | 
| 65 | 
            +
            rubyforge_project: 
         | 
| 66 | 
            +
            rubygems_version: 2.0.14
         | 
| 67 | 
            +
            signing_key: 
         | 
| 68 | 
            +
            specification_version: 4
         | 
| 69 | 
            +
            summary: HashGleaner allows you to declare hash structure you want to get.
         | 
| 70 | 
            +
            test_files:
         | 
| 71 | 
            +
            - spec/hash_gleaner/list_spec.rb
         | 
| 72 | 
            +
            - spec/hash_gleaner_spec.rb
         | 
| 73 | 
            +
            - spec/spec_helper.rb
         |