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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d2ae2711d1927e5ac373cf2f6ad90638eab51bea
4
- data.tar.gz: be9c6d35dbd718b459fbea7112293781c0803d84
3
+ metadata.gz: 6d836a36108e62c6be0182892a89bfdcf7f2128c
4
+ data.tar.gz: 9799fa2516d6992ec795169d25ab2f693b51fe5c
5
5
  SHA512:
6
- metadata.gz: e1fe20699baaefc2d2b06f13d6d0dc8e5c2ef327cbfb916b4a5d155404d891186a252c85bbb5f0f26e882f168488663306075b0a8b3f6a4e12afd3c7e3358d98
7
- data.tar.gz: 09b8aa7ff3c72f231650fdf61dc5a0cde3b58f5e3dd4bc083a372faf0126a2a2c6e391db23a10e163e460b83713a5b0169af6caac6a56865759f408675736da4
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.14
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 = prepare_keys(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 accessor_method?(m)
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
- transform_value(res)
32
+ _transform_value(method_name, res)
32
33
  end
33
34
 
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
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 accessor_method?(method_name)
40
+ def _accessor_method?(method_name)
40
41
  self._hash.keys.include?(method_name)
41
42
  end
42
43
 
43
- def key_to_method(key)
44
+ def _key_to_method(key)
44
45
  key.to_s.gsub(/\s+/, ?_).underscore.to_sym
45
46
  end
46
47
 
47
- def prepare_keys(hash)
48
+ def _prepare_keys(hash)
48
49
  res = hash.map do |k ,v|
49
- [ key_to_method(k), v ]
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
- prepare_keys(@_hash)
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
@@ -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.14 ruby lib
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.14"
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-23"
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.14
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-23 00:00:00.000000000 Z
11
+ date: 2015-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport