recursive_struct 0.0.5 → 0.0.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- N2UxYTExZjRiNjU2YjY2ZmE4ZTA0OTFhMDcyYjIzMGRiMjFhZTRhNQ==
4
+ ZDZjODIwNzIwODg3YjQ1ZmM2OGM4Zjg4M2E5ZDZmZGVjZjdhMjFkMg==
5
5
  data.tar.gz: !binary |-
6
- NjA2M2I0ZDljNjAwM2UwM2MwNWE1NjY5MDIyZmRkZjQ4NDM4OWZjMg==
6
+ OWRmNWUwMWZlMTkyNWZiM2ZiMGI3ODZiMjFhNjQzNjkxNzJmNjMyOQ==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- MTBlNzY4MmVhNDJjMWJiOTQyYjI3ZThjYmUzNjI2ZTBhOTczZTk3M2JlNjkz
10
- MzYzYmUyMjk0ZjhhMmJjY2ZjZjA1MzMyYjczNWY4NmZmYzM1NjM3MjIxYTk0
11
- MDU3NmM3ZDBmMmJiN2E0NWQ0OTI4YjFkZDNhNWNmMTRkODY1ZTc=
9
+ ZGI0NWFkMzc2NWM4NDRmMTkzYjcyZmYzMzRjODZhMjA4MDY1YzEzNzYyYWVk
10
+ YWJmY2IwMmY0MjBhZmI0ODY1N2QyMDFjNDVjMzJiZWZkMTI2MDIxMTI0YmNm
11
+ ZmM1OWQzNTgxNDM1NmExYzFjNzBjODIzM2UwMTc2ZWU2YmExZDY=
12
12
  data.tar.gz: !binary |-
13
- YjY5ZjczNGRkZmQwYjg1ZTlhMDQwYzMxNzI5MzFjYTNmMWY4NDQ1ODQ4MTY2
14
- YTYyNmFjNjAxYTUwMDA1NzcxNzc5ZTNkZTFmYTg2ZmRjMTYzMTMyZDhmNDJj
15
- MTBiMzhhZTRjMTFkYWVhMDlkZDM0NTU0OWZiNTI4Njk2NzQ0NzM=
13
+ MzY5NmE3ZWJhZTFjZDljNDM1MTIwMTQyN2U5NDdiYWIwODJmNmQ2NmQ5ZjVi
14
+ MzU4OWM1MjFiNzQ4MGJlODk5YzRkOTgyYjJmYWEzY2EyYzhlZWVkMDRjMDI0
15
+ NWVjMzc2MWVhOWVjYTA2NTFmNzU5ZGFhYTE5ZDU5N2ZiMjM0MDU=
@@ -1,8 +1,12 @@
1
+ require 'recursive_struct/data'
2
+
1
3
  class RecursiveStruct
4
+ include RecursiveStruct::Data
5
+
2
6
  def initialize(hash = nil)
3
7
  if hash
4
8
  hash.each do |key, value|
5
- add_data(key, process(value))
9
+ set_data(key, value)
6
10
  end
7
11
  end
8
12
  end
@@ -10,8 +14,10 @@ class RecursiveStruct
10
14
  def method_missing(name, *args)
11
15
  key = name.to_s
12
16
 
13
- if key.chomp!('=') && args.length == 1
14
- add_data(key, process(args.first))
17
+ if key.include?('=')
18
+ add_setter(key.chomp('='), *args)
19
+ elsif data.respond_to?(key)
20
+ send_data(key, *args)
15
21
  elsif args.length == 0
16
22
  get_data(key)
17
23
  else
@@ -25,25 +31,11 @@ class RecursiveStruct
25
31
  value.is_a?(Hash) ? self.class.new(value) : value
26
32
  end
27
33
 
28
- def data
29
- @data ||= {}
30
- end
31
-
32
- def add_data(key, value)
33
- key = key.to_sym
34
-
35
- data[key] = value
36
- define_methods(key)
37
- end
38
-
39
- def get_data(key)
40
- data[key.to_sym]
41
- end
42
-
43
- def define_methods(key)
44
- unless respond_to?(key)
45
- define_singleton_method(key) { data[key] }
46
- define_singleton_method("#{key}=") { |value| data[key] = value }
34
+ def add_setter(key, *args)
35
+ if key == '[]' && args.length == 2
36
+ set_data(args.first, args.last)
37
+ elsif args.length == 1
38
+ set_data(key, args.first)
47
39
  end
48
40
  end
49
41
  end
@@ -0,0 +1,35 @@
1
+ class RecursiveStruct
2
+ module Data
3
+ def data
4
+ @data ||= {}
5
+ end
6
+
7
+ def set_data(key, value)
8
+ key = key.to_sym
9
+
10
+ data[key] = process(value)
11
+ define_methods(key)
12
+ end
13
+
14
+ def get_data(key)
15
+ data[key.to_sym]
16
+ end
17
+
18
+ def send_data(key, *args)
19
+ data.send(key, *args)
20
+ end
21
+
22
+ private
23
+
24
+ def process(value)
25
+ value.is_a?(Hash) ? RecursiveStruct.new(value) : value
26
+ end
27
+
28
+ def define_methods(key)
29
+ unless respond_to?(key)
30
+ define_singleton_method(key) { data[key] }
31
+ define_singleton_method("#{key}=") { |value| data[key] = value }
32
+ end
33
+ end
34
+ end
35
+ end
@@ -1,3 +1,3 @@
1
1
  class RecursiveStruct
2
- VERSION = '0.0.5'
2
+ VERSION = '0.0.6'
3
3
  end
@@ -54,6 +54,12 @@ describe RecursiveStruct do
54
54
  it { expect(subject.one).to be true }
55
55
  end
56
56
 
57
+ describe 'hash setter' do
58
+ before { subject[:one] = true }
59
+ it { expect(subject[:one]).to be true }
60
+ it { expect(subject.one).to be true }
61
+ end
62
+
57
63
  describe 'array value' do
58
64
  before { subject.one = [1, 2] }
59
65
  it { expect(subject.one).not_to be_empty }
@@ -72,5 +78,9 @@ describe RecursiveStruct do
72
78
  describe 'invalid method' do
73
79
  it { expect { subject.one(1) }.to raise_error NoMethodError }
74
80
  end
81
+
82
+ describe 'responds to hash methods' do
83
+ it { expect { subject.keys }.not_to raise_error }
84
+ end
75
85
  end
76
86
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: recursive_struct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.0.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Phillip Boksz
@@ -81,6 +81,7 @@ files:
81
81
  - README.md
82
82
  - Rakefile
83
83
  - lib/recursive_struct.rb
84
+ - lib/recursive_struct/data.rb
84
85
  - lib/recursive_struct/version.rb
85
86
  - recursive_struct.gemspec
86
87
  - spec/recursive_struct_spec.rb