tarvit-helpers 0.0.10 → 0.0.11
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 +4 -4
- data/VERSION +1 -1
- data/lib/tarvit-helpers/modules/hash_presenter.rb +63 -26
- data/spec/modules/hash_presenter_spec.rb +130 -18
- data/tarvit-helpers.gemspec +2 -2
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5f2117e675264e10c3128bff56b480e423672048
|
4
|
+
data.tar.gz: cd965580ba89f6982bb98f6c12a3ef97cd217e1a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 66f741c836965bf736ae7eada042a3f554574d1fb1ee4eef693261cb903af73b6d688e6081bd7c40dfe55520af370533a499605c7f5691248d21bfdb52799340
|
7
|
+
data.tar.gz: ba134f8d4ae9e358c32dfac59db198548540aaffeb46428df06df9777ebabf925808f37f7c72544c91f9d9e715ad0221b3e97de6e6480ed2f1f9cb0d0da45cba
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.11
|
@@ -1,44 +1,81 @@
|
|
1
1
|
module TarvitHelpers
|
2
|
-
|
3
|
-
require 'active_support/core_ext/string'
|
2
|
+
module HashPresenter
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
@hash = prepare_keys(hash)
|
4
|
+
def self.present(hash, option = :cached )
|
5
|
+
raise ArgumentError.new("#{ hash.class } is not a Hash") unless hash.is_a?(Hash)
|
6
|
+
factory[option].new(hash)
|
9
7
|
end
|
10
8
|
|
11
|
-
def
|
12
|
-
|
13
|
-
super
|
9
|
+
def self.factory
|
10
|
+
{ cached: CachedHashPresenter, observable: ObservableHashPresenter }
|
14
11
|
end
|
15
12
|
|
16
|
-
|
13
|
+
class SimpleHashPresenter
|
14
|
+
require 'active_support/core_ext/string'
|
17
15
|
|
18
|
-
|
19
|
-
res = @hash[method_name]
|
20
|
-
transform_value(res)
|
21
|
-
end
|
16
|
+
attr_reader :hash
|
22
17
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
18
|
+
def initialize(hash)
|
19
|
+
@hash = prepare_keys(hash)
|
20
|
+
end
|
21
|
+
|
22
|
+
def method_missing(m, *args)
|
23
|
+
return value(m) if accessor_method?(m)
|
24
|
+
super
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
|
29
|
+
def value(method_name)
|
30
|
+
res = self.hash[method_name]
|
31
|
+
transform_value(res)
|
32
|
+
end
|
33
|
+
|
34
|
+
def transform_value(x)
|
35
|
+
return x.map{|x| transform_value(x) } if x.is_a?(Array)
|
36
|
+
x.is_a?(Hash) ? self.class.new(x) : x
|
37
|
+
end
|
38
|
+
|
39
|
+
def accessor_method?(method_name)
|
40
|
+
self.hash.keys.include?(method_name)
|
41
|
+
end
|
42
|
+
|
43
|
+
def key_to_method(key)
|
44
|
+
key.to_s.gsub(/\s+/, ?_).underscore.to_sym
|
45
|
+
end
|
46
|
+
|
47
|
+
def prepare_keys(hash)
|
48
|
+
res = hash.map do |k ,v|
|
49
|
+
[ key_to_method(k), v ]
|
50
|
+
end
|
51
|
+
Hash[res]
|
52
|
+
end
|
27
53
|
|
28
|
-
def accessor_method?(method_name)
|
29
|
-
@hash.keys.include?(method_name)
|
30
54
|
end
|
31
55
|
|
32
|
-
|
33
|
-
|
56
|
+
class CachedHashPresenter < SimpleHashPresenter
|
57
|
+
|
58
|
+
def initialize(hash)
|
59
|
+
super
|
60
|
+
@cache = {}
|
61
|
+
end
|
62
|
+
|
63
|
+
def value(method_name)
|
64
|
+
@cache[method_name] ||= super
|
65
|
+
end
|
66
|
+
|
34
67
|
end
|
35
68
|
|
36
|
-
|
37
|
-
|
38
|
-
|
69
|
+
class ObservableHashPresenter < SimpleHashPresenter
|
70
|
+
def initialize(hash)
|
71
|
+
@hash = hash
|
72
|
+
end
|
73
|
+
|
74
|
+
def hash
|
75
|
+
prepare_keys(@hash)
|
39
76
|
end
|
40
|
-
Hash[res]
|
41
77
|
end
|
42
78
|
|
43
79
|
end
|
44
80
|
end
|
81
|
+
|
@@ -1,32 +1,144 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
+
module BaseHashPresenterTest
|
4
|
+
|
5
|
+
def test_presenter(hash_presenter)
|
6
|
+
|
7
|
+
it 'should present a flat hash' do
|
8
|
+
hp = hash_presenter.new(a: 1, b: 2, 'c' => [ 3 ] )
|
9
|
+
expect(hp.a).to eq(1)
|
10
|
+
expect(hp.b).to eq(2)
|
11
|
+
expect(hp.c).to eq([ 3 ])
|
12
|
+
expect(->{ hp.d }).to raise_error(NoMethodError)
|
13
|
+
end
|
14
|
+
|
15
|
+
it 'should transform complex keys' do
|
16
|
+
hp = hash_presenter.new('A very big key' => :value)
|
17
|
+
expect(hp.a_very_big_key).to eq(:value)
|
18
|
+
end
|
19
|
+
|
20
|
+
it 'should present nested hashes' do
|
21
|
+
hp = hash_presenter.new(a: { b: 1, c: { d: 2 } })
|
22
|
+
expect(hp.a).to be_a(hash_presenter)
|
23
|
+
expect(hp.a.b).to eq(1)
|
24
|
+
expect(hp.a.c.d).to eq(2)
|
25
|
+
end
|
26
|
+
|
27
|
+
it 'should present arrays with hashes' do
|
28
|
+
hp = hash_presenter.new(a: [ { b: 1 }, { c: 2 }, 3 ])
|
29
|
+
expect(hp.a[0].b).to eq(1)
|
30
|
+
expect(hp.a[1].c).to eq(2)
|
31
|
+
expect(hp.a[2]).to eq(3)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe HashPresenter::SimpleHashPresenter do
|
37
|
+
|
38
|
+
extend BaseHashPresenterTest
|
39
|
+
test_presenter(HashPresenter::SimpleHashPresenter)
|
40
|
+
|
41
|
+
context 'Special Behavior' do
|
42
|
+
|
43
|
+
it 'should not depend on an attribute object' do
|
44
|
+
original = { a: 2 }
|
45
|
+
hp = HashPresenter::SimpleHashPresenter.new(original)
|
46
|
+
|
47
|
+
expect(hp.a).to eq(2)
|
48
|
+
|
49
|
+
original[:a] = 3
|
50
|
+
|
51
|
+
expect(hp.a).to eq(2)
|
52
|
+
end
|
53
|
+
|
54
|
+
it 'should regenerate method result for a nested hash' do
|
55
|
+
hp = HashPresenter::SimpleHashPresenter.new(a: { b: 1 })
|
56
|
+
expect(hp.a.object_id).to_not eq(hp.a.object_id)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
describe HashPresenter::CachedHashPresenter do
|
62
|
+
|
63
|
+
extend BaseHashPresenterTest
|
64
|
+
test_presenter(HashPresenter::CachedHashPresenter)
|
65
|
+
|
66
|
+
context 'Special Behavior' do
|
67
|
+
|
68
|
+
it 'should not depend on an attribute object' do
|
69
|
+
original = { a: 2 }
|
70
|
+
hp = HashPresenter::CachedHashPresenter.new(original)
|
71
|
+
|
72
|
+
expect(hp.a).to eq(2)
|
73
|
+
|
74
|
+
original[:a] = 3
|
75
|
+
|
76
|
+
expect(hp.a).to eq(2)
|
77
|
+
end
|
78
|
+
|
79
|
+
it 'should not calculate result for a nested hash twice' do
|
80
|
+
hp = HashPresenter::CachedHashPresenter.new(a: { b: 1 })
|
81
|
+
expect(hp.a.object_id).to eq(hp.a.object_id)
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
|
87
|
+
describe HashPresenter::ObservableHashPresenter do
|
88
|
+
|
89
|
+
extend BaseHashPresenterTest
|
90
|
+
test_presenter(HashPresenter::ObservableHashPresenter)
|
91
|
+
|
92
|
+
context 'Special Behavior' do
|
93
|
+
|
94
|
+
it 'should observe an attribute object' do
|
95
|
+
original = { a: 2 }
|
96
|
+
hp = HashPresenter::ObservableHashPresenter.new(original)
|
97
|
+
|
98
|
+
expect(hp.a).to eq(2)
|
99
|
+
|
100
|
+
original[:a] = 3
|
101
|
+
|
102
|
+
expect(hp.a).to eq(3)
|
103
|
+
|
104
|
+
original[:a] = { b: 1 }
|
105
|
+
|
106
|
+
expect(hp.a.b).to eq(1)
|
107
|
+
|
108
|
+
original[:c] = 4
|
109
|
+
|
110
|
+
expect(hp.c).to eq(4)
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'should regenerate method result for a nested hash' do
|
114
|
+
hp = HashPresenter::ObservableHashPresenter.new(a: { b: 1 })
|
115
|
+
expect(hp.a.object_id).to_not eq(hp.a.object_id)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
3
120
|
describe HashPresenter do
|
4
121
|
|
5
|
-
it 'should present
|
6
|
-
hp = HashPresenter.
|
122
|
+
it 'should present hashes' do
|
123
|
+
hp = HashPresenter.present({ a: 1 })
|
7
124
|
expect(hp.a).to eq(1)
|
8
|
-
expect(hp.b).to eq(2)
|
9
|
-
expect(hp.c).to eq([ 3 ])
|
10
|
-
expect(->{ hp.d }).to raise_error(NoMethodError)
|
11
125
|
end
|
12
126
|
|
13
|
-
it 'should
|
14
|
-
|
15
|
-
|
127
|
+
it 'should not accept not Hashes' do
|
128
|
+
expect(->{
|
129
|
+
HashPresenter.present('Hash').to raise_error(ArgumentError)
|
130
|
+
})
|
16
131
|
end
|
17
132
|
|
18
|
-
it 'should
|
19
|
-
hp = HashPresenter.
|
20
|
-
expect(hp
|
21
|
-
expect(hp.a.b).to eq(1)
|
22
|
-
expect(hp.a.c.d).to eq(2)
|
133
|
+
it 'should get an observable presenter' do
|
134
|
+
hp = HashPresenter.present({ }, :observable)
|
135
|
+
expect(hp).to be_a(HashPresenter::ObservableHashPresenter)
|
23
136
|
end
|
24
137
|
|
25
|
-
it 'should
|
26
|
-
hp = HashPresenter.
|
27
|
-
expect(hp
|
28
|
-
expect(hp.a[1].c).to eq(2)
|
29
|
-
expect(hp.a[2]).to eq(3)
|
138
|
+
it 'should get a cached presenter' do
|
139
|
+
hp = HashPresenter.present({ }, :cached)
|
140
|
+
expect(hp).to be_a(HashPresenter::CachedHashPresenter)
|
30
141
|
end
|
31
142
|
|
143
|
+
|
32
144
|
end
|
data/tarvit-helpers.gemspec
CHANGED
@@ -2,11 +2,11 @@
|
|
2
2
|
# DO NOT EDIT THIS FILE DIRECTLY
|
3
3
|
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
|
-
# stub: tarvit-helpers 0.0.
|
5
|
+
# stub: tarvit-helpers 0.0.11 ruby lib
|
6
6
|
|
7
7
|
Gem::Specification.new do |s|
|
8
8
|
s.name = "tarvit-helpers"
|
9
|
-
s.version = "0.0.
|
9
|
+
s.version = "0.0.11"
|
10
10
|
|
11
11
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
12
12
|
s.require_paths = ["lib"]
|