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 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