dotted_hash 0.8

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 442525c1060bd5bbfcbd29eab42eacd400bcd21a
4
+ data.tar.gz: 64330ffcb55a2db31f48dad429ecc329bd086a74
5
+ SHA512:
6
+ metadata.gz: eb8fdb956dcbfc3b5687e50250554a037ea9228803e4068bb20d174d3704e511eab959aa986f00c4b4fc6937c54bcfa77a777fc96601541e4ba8ec1b1e1dc8a7
7
+ data.tar.gz: 37d877e03ad53c404f82b5d5f7fe0fdb432ad8d7d4da174bb37a86a70a05c567d3a34d7c0d73dc6018906051f4745c2e8c37aa2dad6abf89bd4d61e8a7461b76
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ Gemfile.lock
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in dotted_hash.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Ivan Stana
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/MIT-LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright 2011 Karel Minarik
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,89 @@
1
+ # DottedHash
2
+
3
+ Recursive OpenStruct-like or Hash-like object. Uses ActiveModel.
4
+
5
+ Based on *Tire::Result::Item* with addition of writing attributes.
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ gem 'dotted_hash'
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install dotted_hash
20
+
21
+ ## Usage
22
+
23
+ ### Create
24
+
25
+ > DottedHash.new(id: 'duke', content: "Why I'm so great")
26
+
27
+ > document = DottedHash.new(id: 'duke', content: "Why I'm so great",
28
+ quotes: {
29
+ 'Duke Nukem Forever' => ['Always bet on Duke!', 'Hail to the King, baby!'],
30
+ 'Manhattan Project' => ['Confucius say... DIE!', 'Crouching mutant, hidden pipebomb!'] }
31
+ )
32
+ => <DottedHash id: "duke", content: "Why I'm so great", quotes: <DottedHash Duke Nukem Forever:
33
+ ["Always bet on Duke!", "Hail to the King, baby!"], Manhattan Project: ["Confucius say... DIE!", "Crouching mutant, hidden pipebomb!"]>>
34
+
35
+ ### Read
36
+
37
+ > document.content
38
+ => "Why I'm so great"
39
+
40
+ if key has spaces
41
+
42
+ > document.quotes['Duke Nukem Forever']
43
+ > document.quotes['Duke Nukem Forever']
44
+
45
+ nested
46
+
47
+ > documents.authors.creator.name
48
+
49
+ ### Write
50
+
51
+ > document.name = 'Duke Nukem'
52
+ > document.quotes = ["I've got balls of steel.", 'Who wants some?']
53
+
54
+ recursively (also creates sub-DottedHashes if they don't exist)
55
+
56
+ > document.recursive_assign('authors.creator.name', 'Duke Nukem')
57
+
58
+ ### Delete
59
+
60
+ > document.name = nil
61
+
62
+ ### Get document in nice form
63
+
64
+ > document.to_hash
65
+ > document.to_json
66
+
67
+ ### Deceive class name based on *_type* attribute if using *Rails* (if class exists)
68
+
69
+ > d = DottedHash.new(_type: 'cannon', name: 'BFG')
70
+ > d.class
71
+ => Cannon
72
+
73
+ See source and tests for some more details.
74
+
75
+ ## Contributing
76
+
77
+ 1. Fork it
78
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
79
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
80
+ 4. Push to the branch (`git push origin my-new-feature`)
81
+ 5. Create new Pull Request
82
+
83
+ ## About
84
+
85
+ Original project: [https://github.com/karmi/tire](https://github.com/karmi/tire)
86
+
87
+ Author of modificated version: *Ivan Stana*
88
+
89
+ License: *MIT*
data/Rakefile ADDED
@@ -0,0 +1,20 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ desc 'Run tests'
4
+ task :test do
5
+ puts
6
+ puts '****** Test::Unit'
7
+
8
+ Dir[File.join('test', "*unit.rb")].each do |unit|
9
+ puts unit
10
+ system("ruby #{unit}")
11
+ end
12
+
13
+ puts
14
+ puts '****** RSpec'
15
+
16
+ Dir[File.join('test', "*spec.rb")].each do |unit|
17
+ puts unit
18
+ system("rspec #{unit}")
19
+ end
20
+ end
@@ -0,0 +1,34 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'dotted_hash/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "dotted_hash"
8
+ spec.version = DottedHash::VERSION
9
+ spec.authors = ["Ivan Stana"]
10
+ spec.email = ["stiipa@centrum.sk"]
11
+ spec.description = %q{Recursive OpenStruct-like or Hash-like object. Based on Tire::Result::Item with addition of writing attributes.}
12
+ spec.summary = %q{Recursive OpenStruct-like object.}
13
+ spec.homepage = "http://github.com/istana/dotted_hash"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.extra_rdoc_files = [ "README.md", "MIT-LICENSE" ]
22
+ spec.rdoc_options = [ "--charset=UTF-8" ]
23
+
24
+ spec.add_dependency "activemodel", ">= 3.0"
25
+ spec.add_dependency "activesupport"
26
+
27
+ unless defined?(JRUBY_VERSION)
28
+ spec.add_development_dependency "turn"
29
+ end
30
+
31
+ spec.add_development_dependency "bundler", "~> 1.3"
32
+ spec.add_development_dependency "rake"
33
+ spec.add_development_dependency "rspec", "~> 2.13"
34
+ end
@@ -0,0 +1,131 @@
1
+ # Taken from Tire::Results::Item
2
+ # but modified
3
+ require_relative "dotted_hash/version"
4
+ require 'active_model'
5
+ require 'active_support/core_ext/string/inflections'
6
+ require 'active_support/json'
7
+
8
+ class DottedHash
9
+ extend ActiveModel::Naming
10
+ include ActiveModel::Conversion
11
+ #include ActiveModel::Model
12
+ # Create new instance, recursively converting all Hashes to Item
13
+ # and leaving everything else alone.
14
+ #
15
+ # TODO: track depth
16
+ def initialize(args={})
17
+ raise ArgumentError, "Please pass a Hash-like object" unless args.respond_to?(:each_pair)
18
+ @attributes = {}
19
+ args.each_pair do |key, value|
20
+ assign_value(key, value)
21
+ end
22
+ end
23
+
24
+ def assign_value(key, value)
25
+ if value.is_a?(Array)
26
+ @attributes[key.to_sym] = value.map { |item| @attributes[key.to_sym] = item.is_a?(Hash) ? DottedHash.new(item.to_hash) : item }
27
+ else
28
+ @attributes[key.to_sym] = value.is_a?(Hash) ? DottedHash.new(value.to_hash) : value
29
+ end
30
+ end
31
+ private :assign_value
32
+
33
+ # Delegate method to a key in underlying hash, if present, otherwise return +nil+.
34
+ #
35
+ def method_missing(method_name, *arguments)
36
+ if method_name.to_s[-1] == '=' && arguments.size == 1
37
+ attribute = method_name.to_s.chop
38
+ value = arguments.first
39
+ assign_value(attribute, value)
40
+ else
41
+ @attributes[method_name.to_sym]
42
+ end
43
+ end
44
+
45
+ def respond_to?(method_name, include_private = false)
46
+ # answer to any write method
47
+ if method_name.to_s[-1] == '='
48
+ true
49
+ else
50
+ @attributes.has_key?(method_name.to_sym) || super
51
+ end
52
+ end
53
+
54
+ def recursive_assign(key, value)
55
+ return nil if key.blank?
56
+ keys = key.split('.')
57
+ if keys.size > 1
58
+ key = keys.shift.to_sym
59
+
60
+ if !self.send(key)
61
+ self.send("#{key}=", DottedHash.new)
62
+ end
63
+ sub = self.send(key)
64
+ sub.send(:recursive_assign, keys.join('.'), value)
65
+ elsif keys.size == 1
66
+ self.send("#{keys.shift}=", value)
67
+ end
68
+ end
69
+
70
+ def [](key)
71
+ @attributes[key.to_sym]
72
+ end
73
+
74
+ def id
75
+ @attributes[:_id] || @attributes[:id]
76
+ end
77
+
78
+ def type
79
+ @attributes[:_type] || @attributes[:type]
80
+ end
81
+
82
+ def persisted?
83
+ !!id
84
+ end
85
+
86
+ def errors
87
+ ActiveModel::Errors.new(self)
88
+ end
89
+
90
+ def valid?
91
+ true
92
+ end
93
+
94
+ def to_key
95
+ persisted? ? [id] : nil
96
+ end
97
+
98
+ def to_hash
99
+ @attributes.reduce({}) do |sum, item|
100
+ sum[ item.first ] = item.last.respond_to?(:to_hash) ? item.last.to_hash : item.last
101
+ sum
102
+ end
103
+ end
104
+
105
+ alias_method :to_h, :to_hash
106
+
107
+ def as_json(options=nil)
108
+ hash = to_hash
109
+ hash.respond_to?(:with_indifferent_access) ? hash.with_indifferent_access.as_json(options) : hash.as_json(options)
110
+ end
111
+
112
+ def to_json(options=nil)
113
+ as_json.to_json(options)
114
+ end
115
+ alias_method :to_indexed_json, :to_json
116
+
117
+ # Let's pretend we're someone else in Rails
118
+ #
119
+ def class
120
+ begin
121
+ defined?(::Rails) && @attributes[:_type] ? @attributes[:_type].camelize.constantize : super
122
+ rescue NameError
123
+ super
124
+ end
125
+ end
126
+
127
+ def inspect
128
+ s = []; @attributes.each { |k,v| s << "#{k}: #{v.inspect}" }
129
+ %Q|<DottedHash#{self.class.to_s == 'DottedHash' ? '' : " (#{self.class})"} #{s.join(', ')}>|
130
+ end
131
+ end
@@ -0,0 +1,3 @@
1
+ class DottedHash
2
+ VERSION = "0.8"
3
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'test_helper'
2
+ require 'test/unit'
3
+
4
+ class DottedHashTest < Test::Unit::TestCase
5
+ # ActiveModel compatibility tests
6
+ #
7
+ def setup
8
+ super
9
+ begin; Object.send(:remove_const, :Rails); rescue; end
10
+ @model = DottedHash.new :title => 'Test'
11
+ end
12
+ include ActiveModel::Lint::Tests
13
+ end
@@ -0,0 +1,196 @@
1
+ require_relative 'test_helper'
2
+
3
+
4
+ describe DottedHash do
5
+ before :all do
6
+ begin; Object.send(:remove_const, :Rails); rescue; end
7
+ end
8
+
9
+ context 'Basic' do
10
+ before :each do
11
+ @document = DottedHash.new(title: 'Test', author: { name: 'Kafka' },
12
+ awards: { best_fiction: {year: '1925' } })
13
+ end
14
+
15
+ it "should be initialized with a Hash or Hash like object" do
16
+ expect{ DottedHash.new('FUUUUUUU') }.to raise_error(ArgumentError)
17
+ expect{ DottedHash.new(id: 1) }.not_to raise_error
18
+ DottedHash.new(id: 1).should_be_instance_of :N
19
+ expect(DottedHash.new(id: 1)).to be_instance_of(DottedHash)
20
+
21
+ expect do
22
+ class AlmostHash < Hash; end
23
+ DottedHash.new(AlmostHash.new(id: 1))
24
+ end.not_to raise_error
25
+ end
26
+
27
+ it "should have an 'id' method" do
28
+ a = DottedHash.new(_id: 1)
29
+ b = DottedHash.new(id: 1)
30
+ expect(a.id).to eq(1)
31
+ expect(b.id).to eq(1)
32
+ end
33
+
34
+ it "should have a 'type' method" do
35
+ a = DottedHash.new(_type: 'foo')
36
+ b = DottedHash.new(type: 'foo')
37
+ expect(a.type).to eq('foo')
38
+ expect(b.type).to eq('foo')
39
+ end
40
+
41
+ it "should respond to :to_indexed_json" do
42
+ expect(DottedHash.new).to respond_to(:to_indexed_json)
43
+ end
44
+
45
+ it "should retrieve simple values from underlying hash" do
46
+ expect(@document[:title]).to eq('Test')
47
+ end
48
+
49
+ it "should retrieve hash values from underlying hash" do
50
+ expect(@document[:author][:name]).to eq('Kafka')
51
+ end
52
+
53
+ it "should allow to retrieve value by methods" do
54
+ expect(@document.title).not_to be_nil
55
+ expect(@document.title).to eq('Test')
56
+ end
57
+
58
+ it "should implement respond_to? for proxied methods" do
59
+ expect(@document).to respond_to(:title)
60
+ expect(@document.respond_to?(:title)).to eql(true)
61
+ end
62
+
63
+ it "should return nil for non-existing keys/methods" do
64
+ expect{ @document.whatever }.not_to raise_error
65
+ expect(@document.whatever).to be_nil
66
+ end
67
+
68
+ it "should not care about symbols or strings in keys" do
69
+ @document = DottedHash.new('title' => 'Test')
70
+ expect(@document.title).not_to be_nil
71
+ expect(@document.title).to eq('Test')
72
+ end
73
+
74
+ it "should not care about symbols or strings in composite keys" do
75
+ @document = DottedHash.new(highlight: { 'name.ngrams' => 'abc' })
76
+
77
+ expect(@document.highlight['name.ngrams']).not_to be_nil
78
+ expect(@document.highlight['name.ngrams']).to eq('abc')
79
+ expect(@document.highlight['name.ngrams']).to eql(@document.highlight['name.ngrams'.to_sym])
80
+ end
81
+
82
+ it "should allow to retrieve values from nested hashes" do
83
+ expect(@document.author.name).not_to be_nil
84
+ expect(@document.author.name).to eq('Kafka')
85
+ end
86
+
87
+ it "should wrap arrays" do
88
+ @document = DottedHash.new(stats: [1, 2, 3])
89
+ expect(@document.stats).to eq([1, 2, 3])
90
+ end
91
+
92
+ it "should wrap hashes in arrays" do
93
+ @document = DottedHash.new(comments: [{title: 'one'}, {title: 'two'}])
94
+ expect(@document.comments.size).to eql(2)
95
+ expect(@document.comments.first).to be_instance_of(DottedHash)
96
+ expect(@document.comments.first.title).to eq('one')
97
+ expect(@document.comments.last.title).to eq('two')
98
+ end
99
+
100
+ it "should allow simple writes" do
101
+ @document.geralt = 'of Rivia'
102
+ expect(@document.geralt).to eq('of Rivia')
103
+ end
104
+
105
+ it "should allow writes of arrays" do
106
+ @document.characters = ['Amazon', 'Necromancer', 'Barbarian']
107
+ expect(@document.characters).to eq(['Amazon', 'Necromancer', 'Barbarian'])
108
+ end
109
+
110
+ it "should wrap hashes in arrays by attribute write" do
111
+ @document.classes = [{vanilla: 'Sorceress'}, {expansion: 'Druid'}]
112
+ expect(@document.classes.size).to eql(2)
113
+ expect(@document.classes.first).to be_instance_of(DottedHash)
114
+ expect(@document.classes.first.vanilla).to eq('Sorceress')
115
+ expect(@document.classes.last.expansion).to eq('Druid')
116
+ end
117
+
118
+ it "#recursive_assign" do
119
+ x = @document.recursive_assign(" ", "bar")
120
+ expect(x).to eq(nil)
121
+
122
+ expect{ @document.recursive_assign('authors.creator.name', 'Triss') }.not_to raise_error
123
+ expect(@document.authors).to be_instance_of(DottedHash)
124
+ expect(@document.authors.creator).to be_instance_of(DottedHash)
125
+
126
+ expect{ @document.authors.creator.name }.not_to raise_error
127
+ expect(@document.authors.creator.name).to eq('Triss')
128
+
129
+ expect{ @document.recursive_assign('authors.contributors', ['foo', 'bar']) }.not_to raise_error
130
+
131
+ expect(@document.authors.creator.name).to eq('Triss')
132
+ expect(@document.authors.contributors).to eq(['foo', 'bar'])
133
+ end
134
+
135
+ it "should be an DottedHash instance" do
136
+ expect(@document).to be_instance_of(DottedHash)
137
+ end
138
+
139
+ it "should be convertible to hash" do
140
+ expect(@document.to_hash).to be_instance_of(Hash)
141
+ expect(@document.to_hash[:author]).to be_instance_of(Hash)
142
+ expect(@document.to_hash[:awards][:best_fiction]).to be_instance_of(Hash)
143
+
144
+ expect(@document.to_hash[:author][:name]).to eq('Kafka')
145
+ expect(@document.to_hash[:awards][:best_fiction][:year]).to eq('1925')
146
+ end
147
+
148
+ it "should be convertible to JSON" do
149
+ expect(@document.as_json).to be_instance_of(Hash)
150
+
151
+ expect(@document.as_json(only: :title)['title']).to eq('Test')
152
+ expect(@document.as_json(only: :title)['author']).to be_nil
153
+ end
154
+
155
+ it "should be inspectable" do
156
+ expect(@document.inspect).to match(/<DottedHash .* title|DottedHash .* author/)
157
+ end
158
+
159
+ context "within Rails" do
160
+
161
+ before :each do
162
+ module ::Rails
163
+ end
164
+
165
+ class ::FakeRailsModel
166
+ extend ActiveModel::Naming
167
+ include ActiveModel::Conversion
168
+ def self.find(id, options); new; end
169
+ end
170
+
171
+ @document = DottedHash.new(id: 1, _type: 'fake_rails_model', title: 'Test')
172
+ end
173
+
174
+ it "should be an instance of model, based on _type" do
175
+ expect(@document.class).to eql(FakeRailsModel)
176
+ end
177
+
178
+ it "should be inspectable with masquerade" do
179
+ expect(@document.inspect).to match(/<DottedHash \(FakeRailsModel\)/)
180
+ end
181
+
182
+ it "should return proper singular and plural forms" do
183
+ expect(ActiveModel::Naming.singular(@document)).to eq('fake_rails_model')
184
+ expect(ActiveModel::Naming.plural(@document)).to eq('fake_rails_models')
185
+ end
186
+
187
+ it "should instantiate itself for deep hashes, not a Ruby class corresponding to type" do
188
+ document = DottedHash.new(_type: 'my_model', title: 'Test', author: { name: 'John' })
189
+
190
+ expect(document.class).to eq(DottedHash)
191
+ end
192
+ end
193
+
194
+ end
195
+ end
196
+
@@ -0,0 +1,27 @@
1
+ ENV['DEBUG'] = 'true'
2
+
3
+ require 'rubygems'
4
+ require 'bundler/setup'
5
+
6
+ require 'pathname'
7
+
8
+ JRUBY = defined?(JRUBY_VERSION)
9
+
10
+ if ENV['JSON_LIBRARY']
11
+ puts "Using '#{ENV['JSON_LIBRARY']}' JSON library"
12
+ require ENV['JSON_LIBRARY']
13
+ else
14
+ require 'json'
15
+ end
16
+
17
+ require_relative '../lib/dotted_hash'
18
+
19
+ if Module.const_defined?(:RSpec)
20
+ RSpec.configure do |config|
21
+ config.expect_with :rspec do |c|
22
+ c.syntax = :expect
23
+ end
24
+ end
25
+ end
26
+
27
+
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dotted_hash
3
+ version: !ruby/object:Gem::Version
4
+ version: '0.8'
5
+ platform: ruby
6
+ authors:
7
+ - Ivan Stana
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2013-05-01 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '>='
18
+ - !ruby/object:Gem::Version
19
+ version: '3.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '>='
25
+ - !ruby/object:Gem::Version
26
+ version: '3.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '>='
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: turn
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '>='
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ~>
88
+ - !ruby/object:Gem::Version
89
+ version: '2.13'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ~>
95
+ - !ruby/object:Gem::Version
96
+ version: '2.13'
97
+ description: Recursive OpenStruct-like or Hash-like object. Based on Tire::Result::Item
98
+ with addition of writing attributes.
99
+ email:
100
+ - stiipa@centrum.sk
101
+ executables: []
102
+ extensions: []
103
+ extra_rdoc_files:
104
+ - README.md
105
+ - MIT-LICENSE
106
+ files:
107
+ - .gitignore
108
+ - Gemfile
109
+ - LICENSE.txt
110
+ - MIT-LICENSE
111
+ - README.md
112
+ - Rakefile
113
+ - dotted_hash.gemspec
114
+ - lib/dotted_hash.rb
115
+ - lib/dotted_hash/version.rb
116
+ - test/active_model_lint_unit.rb
117
+ - test/dotted_hash_spec.rb
118
+ - test/test_helper.rb
119
+ homepage: http://github.com/istana/dotted_hash
120
+ licenses:
121
+ - MIT
122
+ metadata: {}
123
+ post_install_message:
124
+ rdoc_options:
125
+ - --charset=UTF-8
126
+ require_paths:
127
+ - lib
128
+ required_ruby_version: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - '>='
131
+ - !ruby/object:Gem::Version
132
+ version: '0'
133
+ required_rubygems_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - '>='
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ requirements: []
139
+ rubyforge_project:
140
+ rubygems_version: 2.0.3
141
+ signing_key:
142
+ specification_version: 4
143
+ summary: Recursive OpenStruct-like object.
144
+ test_files:
145
+ - test/active_model_lint_unit.rb
146
+ - test/dotted_hash_spec.rb
147
+ - test/test_helper.rb