tarvit-helpers 0.0.14 → 0.0.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +31 -0
- data/VERSION +1 -1
- data/lib/tarvit-helpers/modules/hash_presenter.rb +72 -16
- data/spec/modules/hash_presenter_spec.rb +64 -1
- data/tarvit-helpers.gemspec +3 -3
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d836a36108e62c6be0182892a89bfdcf7f2128c
|
4
|
+
data.tar.gz: 9799fa2516d6992ec795169d25ab2f693b51fe5c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: eb868bc1f943df68cea8450e836e617afb312ceaa93a8cae1e094c1a0ab105be2748f9d6dacff00b800533de2fa56cf45de16ed7319764a56c6eaf7bf9197e64
|
7
|
+
data.tar.gz: ddefd9f2bb10f67cb41293b91334a420e72507f6ac4271a8ec2c9be3cb4f2e5dc4f0cd9596ef4b2e4184dfd386fe066c3455e453a32b1ee59d2159c7fdbbce5b
|
data/README.md
CHANGED
@@ -71,6 +71,37 @@ observer.a
|
|
71
71
|
original[:a] = 3
|
72
72
|
observer.a
|
73
73
|
=> 3
|
74
|
+
|
75
|
+
|
76
|
+
@hash = {
|
77
|
+
user: {
|
78
|
+
date: '11/11/2015',
|
79
|
+
age: '11',
|
80
|
+
address: [
|
81
|
+
'USA', 'NY', 'Ba Street'
|
82
|
+
],
|
83
|
+
posts: [
|
84
|
+
{ id: '1', title: 'some title' },
|
85
|
+
{ id: '2', title: 'the other title' },
|
86
|
+
],
|
87
|
+
}
|
88
|
+
}
|
89
|
+
presenter = HashPresenter::CustomHashPresenter.new(@hash) do |rules|
|
90
|
+
rules.when([ :user, :date ]) do |value|
|
91
|
+
Date.parse(value)
|
92
|
+
end
|
93
|
+
|
94
|
+
rules.when([ :user, :age ]){|age| age.to_i }
|
95
|
+
rules.when([ :user, :posts, :title ]){|title| title.capitalize }
|
96
|
+
end
|
97
|
+
|
98
|
+
presenter.user.date.class
|
99
|
+
=> Date
|
100
|
+
presenter.user.age
|
101
|
+
=> 11
|
102
|
+
presenter.user.posts[0].title
|
103
|
+
=> "Some title"
|
104
|
+
|
74
105
|
```
|
75
106
|
|
76
107
|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.15
|
@@ -13,14 +13,15 @@ module TarvitHelpers
|
|
13
13
|
class SimpleHashPresenter
|
14
14
|
require 'active_support/core_ext/string'
|
15
15
|
|
16
|
-
attr_reader :_hash
|
16
|
+
attr_reader :_hash, :_levels
|
17
17
|
|
18
|
-
def initialize(hash)
|
19
|
-
@_hash =
|
18
|
+
def initialize(hash, levels=[])
|
19
|
+
@_hash = _prepare_keys(hash)
|
20
|
+
@_levels = levels
|
20
21
|
end
|
21
22
|
|
22
23
|
def method_missing(m, *args)
|
23
|
-
return value(m) if
|
24
|
+
return value(m) if _accessor_method?(m)
|
24
25
|
super
|
25
26
|
end
|
26
27
|
|
@@ -28,34 +29,42 @@ module TarvitHelpers
|
|
28
29
|
|
29
30
|
def value(method_name)
|
30
31
|
res = self._hash[method_name]
|
31
|
-
|
32
|
+
_transform_value(method_name, res)
|
32
33
|
end
|
33
34
|
|
34
|
-
def
|
35
|
-
return
|
36
|
-
|
35
|
+
def _transform_value(method_name, value)
|
36
|
+
return value.map{|key| _transform_value(method_name, key) } if value.is_a?(Array)
|
37
|
+
value.is_a?(Hash) ? _new_level_presenter(value, method_name) : value
|
37
38
|
end
|
38
39
|
|
39
|
-
def
|
40
|
+
def _accessor_method?(method_name)
|
40
41
|
self._hash.keys.include?(method_name)
|
41
42
|
end
|
42
43
|
|
43
|
-
def
|
44
|
+
def _key_to_method(key)
|
44
45
|
key.to_s.gsub(/\s+/, ?_).underscore.to_sym
|
45
46
|
end
|
46
47
|
|
47
|
-
def
|
48
|
+
def _prepare_keys(hash)
|
48
49
|
res = hash.map do |k ,v|
|
49
|
-
[
|
50
|
+
[ _key_to_method(k), v ]
|
50
51
|
end
|
51
52
|
Hash[res]
|
52
53
|
end
|
53
54
|
|
55
|
+
def _path(key)
|
56
|
+
_levels + [ key ]
|
57
|
+
end
|
58
|
+
|
59
|
+
def _new_level_presenter(value, method_name)
|
60
|
+
self.class.new(value, _path(method_name))
|
61
|
+
end
|
62
|
+
|
54
63
|
end
|
55
64
|
|
56
65
|
class CachedHashPresenter < SimpleHashPresenter
|
57
66
|
|
58
|
-
def initialize(hash)
|
67
|
+
def initialize(hash, levels=[])
|
59
68
|
super
|
60
69
|
@cache = {}
|
61
70
|
end
|
@@ -63,19 +72,66 @@ module TarvitHelpers
|
|
63
72
|
def value(method_name)
|
64
73
|
@cache[method_name] ||= super
|
65
74
|
end
|
66
|
-
|
67
75
|
end
|
68
76
|
|
69
77
|
class ObservableHashPresenter < SimpleHashPresenter
|
70
|
-
def initialize(hash)
|
78
|
+
def initialize(hash, levels=[])
|
71
79
|
@_hash = hash
|
80
|
+
@_levels = levels
|
72
81
|
end
|
73
82
|
|
74
83
|
def _hash
|
75
|
-
|
84
|
+
_prepare_keys(@_hash)
|
76
85
|
end
|
77
86
|
end
|
78
87
|
|
88
|
+
class CustomHashPresenter < CachedHashPresenter
|
89
|
+
attr_reader :_rules_holder
|
90
|
+
|
91
|
+
def initialize(hash, levels=[], rules_holder=nil, &rules)
|
92
|
+
super(hash, levels)
|
93
|
+
@_rules_holder = rules_holder || RulesHolder.new
|
94
|
+
rules.call(_rules_holder) if rules
|
95
|
+
end
|
96
|
+
|
97
|
+
def _transform_value(method_name, value)
|
98
|
+
rule = _rules_holder.rule_for(_path(method_name))
|
99
|
+
rule ? rule.value_transformer.call(value) : super
|
100
|
+
end
|
101
|
+
|
102
|
+
def _current_path(method_name)
|
103
|
+
_levels + [ method_name ]
|
104
|
+
end
|
105
|
+
|
106
|
+
protected
|
107
|
+
|
108
|
+
def _new_level_presenter(value, method_name)
|
109
|
+
self.class.new(value, _path(method_name), _rules_holder)
|
110
|
+
end
|
111
|
+
|
112
|
+
class RulesHolder
|
113
|
+
attr_reader :rules
|
114
|
+
|
115
|
+
def initialize
|
116
|
+
@rules = []
|
117
|
+
end
|
118
|
+
|
119
|
+
def when(path, &_transform_value)
|
120
|
+
self.rules << Rule.new(path, _transform_value)
|
121
|
+
end
|
122
|
+
|
123
|
+
def rule_for(path)
|
124
|
+
rules.find{|r| r.path == path }
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
class Rule
|
129
|
+
attr_reader :path, :value_transformer
|
130
|
+
def initialize(path, value_transformer)
|
131
|
+
@path, @value_transformer = path, value_transformer
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
79
135
|
end
|
80
136
|
end
|
81
137
|
|
@@ -118,6 +118,70 @@ describe HashPresenter::ObservableHashPresenter do
|
|
118
118
|
end
|
119
119
|
end
|
120
120
|
|
121
|
+
|
122
|
+
describe HashPresenter::CustomHashPresenter do
|
123
|
+
extend BaseHashPresenterTest
|
124
|
+
test_presenter(HashPresenter::CustomHashPresenter)
|
125
|
+
|
126
|
+
context 'Special Behavior' do
|
127
|
+
before :each do
|
128
|
+
@hash = {
|
129
|
+
user: {
|
130
|
+
date: '11/11/2015',
|
131
|
+
age: '11',
|
132
|
+
address: [
|
133
|
+
'USA', 'NY', 'Ba Street'
|
134
|
+
],
|
135
|
+
posts: [
|
136
|
+
{ id: '1', title: 'some title' },
|
137
|
+
{ id: '2', title: 'the other title' },
|
138
|
+
],
|
139
|
+
}
|
140
|
+
}
|
141
|
+
end
|
142
|
+
|
143
|
+
it 'should customize presenter' do
|
144
|
+
presenter = HashPresenter::CustomHashPresenter.new(@hash) do |rules|
|
145
|
+
rules.when([ :user, :date ]) do |value|
|
146
|
+
Date.parse(value)
|
147
|
+
end
|
148
|
+
|
149
|
+
rules.when([ :user, :age ]){|age| age.to_i }
|
150
|
+
rules.when([ :user, :posts, :title ]){|title| title.capitalize }
|
151
|
+
rules.when([ :user,:address ]){|list| list.join(?/) }
|
152
|
+
end
|
153
|
+
|
154
|
+
expect(presenter.user.date).to eq(Date.new(2015, 11, 11))
|
155
|
+
expect(presenter.user.age).to eq(11)
|
156
|
+
expect(presenter.user.address).to eq('USA/NY/Ba Street')
|
157
|
+
expect(presenter.user.posts[0].title).to eq('Some title')
|
158
|
+
end
|
159
|
+
|
160
|
+
it 'should declare nested presenters' do
|
161
|
+
presenter = HashPresenter::CustomHashPresenter.new(@hash) do |rules|
|
162
|
+
|
163
|
+
rules.when([ :user, :date ]) do |value|
|
164
|
+
Date.parse(value)
|
165
|
+
end
|
166
|
+
|
167
|
+
rules.when([ :user, :posts ])do |posts|
|
168
|
+
posts.map do |post|
|
169
|
+
HashPresenter::CustomHashPresenter.new(post) do |post_rules|
|
170
|
+
post_rules.when([ :title ]){|title| title.upcase }
|
171
|
+
end
|
172
|
+
end
|
173
|
+
end
|
174
|
+
end
|
175
|
+
|
176
|
+
expect(presenter.user.date).to eq(Date.new(2015, 11, 11))
|
177
|
+
expect(presenter.user.posts[0].title).to eq('SOME TITLE')
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
|
182
|
+
end
|
183
|
+
|
184
|
+
|
121
185
|
describe HashPresenter do
|
122
186
|
|
123
187
|
it 'should present hashes' do
|
@@ -141,5 +205,4 @@ describe HashPresenter do
|
|
141
205
|
expect(hp).to be_a(HashPresenter::CachedHashPresenter)
|
142
206
|
end
|
143
207
|
|
144
|
-
|
145
208
|
end
|
data/tarvit-helpers.gemspec
CHANGED
@@ -2,16 +2,16 @@
|
|
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.15 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.15"
|
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"]
|
13
13
|
s.authors = ["Vitaly Tarasenko"]
|
14
|
-
s.date = "2015-10-
|
14
|
+
s.date = "2015-10-26"
|
15
15
|
s.description = " Simple extensions to standard Ruby classes and useful helpers. "
|
16
16
|
s.email = "vetal.tarasenko@gmail.com"
|
17
17
|
s.extra_rdoc_files = [
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tarvit-helpers
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.15
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Vitaly Tarasenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|