tarvit-helpers 0.0.14 → 0.0.15
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/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
|