expo 0.5.2 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (3) hide show
  1. checksums.yaml +14 -6
  2. data/lib/expo2.rb +76 -49
  3. metadata +3 -3
checksums.yaml CHANGED
@@ -1,7 +1,15 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: e2adac9afd2f867a5dcddbb99894e152751ee5dd
4
- data.tar.gz: 2bea473e524ac3731807e9f2a72e81f9c9ca0ee8
5
- SHA512:
6
- metadata.gz: b14918533eaa177485f8b8cca4f4d9970ed8986efcd7c38811c4eb70dbb439f0ae12546a3cc7f76fb91d5d83ba3e6de7bdf095153cfc000319e9889d994f59c5
7
- data.tar.gz: 715722146c1d048d62cc0165a9b82876f6d8e0908365e55e1eba736c1c980dfc06833952b8a1b38bd5cc90c3f7e3db2ae3a62b0c256ae0077f47459314a56a2b
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ Y2YxMTQyZjdiMDc3ZDk2M2U3MmJmZWY0OWQwYjBlNWZiZjI0ZTI3OQ==
5
+ data.tar.gz: !binary |-
6
+ MTc5ZTRkOGRkMTA4N2ZjOGNiMTZlYTY3NjYwYWJhYjhkNTVlMWFjZA==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ ODZhMTA4NzA3MDc0ZTdiMDkyNGRiMzIyZTM1YjM4NzY3MWFkZmViYTAzMGVi
10
+ MjJlZjVmNjJhMzFhN2UyNTFmNjU0YTRhZDg0MTRiZmU3ZDU5ODM5OGE5YmY1
11
+ MzZiYTAwZTczN2ZlYzQzODQ0ZGJkZTMzNTg3YmM3OGE5ZDU4OTk=
12
+ data.tar.gz: !binary |-
13
+ NGNiNzNjMTRiMjZiYjNhYzNlNjliNjNjMzNjZmZjMTk5N2Y4MTQyZjY0YTVh
14
+ MjE3MjliYjljNjNlNmM5YTBhMjc1YTIzYTVlMmM3M2JkZDE1YTE5OGIzYWJk
15
+ NTk0MTIyNjk0NzkyY2ZkNTUzNWYzNTIzNjIzOThiNzI2MTZlNGY=
data/lib/expo2.rb CHANGED
@@ -1,25 +1,21 @@
1
1
  class Expo2
2
2
  def initialize(prototype=nil, &block)
3
3
  @block = block
4
- # @built = false
5
- @prototype = prototype
4
+ @prototype = prototype || NULL_EXPO
5
+ @presenters ||= []
6
+ self.instance_exec &@block if @block
6
7
  end
7
8
 
8
- def prototype_presenters(object)
9
- Array(@prototype && @prototype.go_presenters(object))
9
+ def inspect
10
+ "<Expo2:#{self.object_id}, @prototype=#{@prototype.inspect}, @presenters=#{@presenters.map(&:inspect)}>"
10
11
  end
11
12
 
12
- def go_presenters(object)
13
- self.instance_exec &@block if @block && !@built
14
- # @built = true
15
- @cache ||= (prototype_presenters(object) + presenters)
16
- end
17
13
 
18
14
  def expo(object, context={}, index=nil)
19
15
  return nil if object.nil?
20
- preso = {}
21
- go_presenters(object).each do |pres|
22
- preso.merge!(pres.go(object, context, index))
16
+ preso = @prototype.expo(object, context, index)
17
+ @presenters.each do |pres|
18
+ preso = deep_merge(preso, pres.go(object, context, index))
23
19
  end
24
20
  preso
25
21
  end
@@ -37,21 +33,25 @@ class Expo2
37
33
  end
38
34
  preso
39
35
  end
36
+
37
+ def inspect
38
+ "<Expo2::Pres>"
39
+ end
40
40
  end
41
41
 
42
42
  class Asider < Struct.new(:presenter, :key_map)
43
43
  def go(object, context, index=nil)
44
44
  preso = {}
45
- perspective = if self.presenter
46
- self.presenter.to_proc.call(object)
47
- else
48
- object
49
- end
45
+ perspective = self.presenter.to_proc.call(object)
50
46
  self.key_map.each do |k,v|
51
47
  context[v] = perspective.send(k)
52
48
  end
53
49
  {}
54
50
  end
51
+
52
+ def inspect
53
+ "<Expo2::Asider>"
54
+ end
55
55
  end
56
56
 
57
57
  class Exposer < Struct.new(:key_map)
@@ -62,23 +62,23 @@ class Expo2
62
62
  end
63
63
  preso
64
64
  end
65
+
66
+ def inspect
67
+ "<Expo2::Exposer>"
68
+ end
65
69
  end
66
70
 
67
71
  class Merger < Struct.new(:block)
68
72
  def go(object, context, index=nil)
69
73
  self.block.call(context, index)
70
74
  end
75
+ def inspect
76
+ "<Expo2::Merger>"
77
+ end
71
78
  end
72
79
 
73
- # class RecursiveSubExpo < Struct.new(:presenter, :key, :sub_expo, :block)
74
- # def go(object, context, index=nil, user_expo)
75
- # associated = self.presenter.new(object).send(self.key)
76
- # # sub = Expo2.new(self.sub_expo, &self.block)
77
- # { self.key => sub.expo(associated, context) }
78
- # end
79
- # end
80
80
  class SubExpo < Struct.new(:presenter, :key, :sub_expo, :block)
81
- def go(object, context, index=nil, user_expo)
81
+ def go(object, context, index=nil)
82
82
  associated = self.presenter.to_proc.call(object)
83
83
  sub = Expo2.new(self.sub_expo, &self.block)
84
84
  if associated
@@ -87,10 +87,22 @@ class Expo2
87
87
  {}
88
88
  end
89
89
  end
90
+ def inspect
91
+ "<Expo2::SubExpo>"
92
+ end
93
+ end
94
+
95
+ class Recurser < SubExpo
96
+ def initialize(presenter, key, recurser)
97
+ super(presenter, key, recurser)
98
+ end
99
+ def inspect
100
+ "<Expo2::Recurser>"
101
+ end
90
102
  end
91
103
 
92
104
  class MergeExpo < Struct.new(:presenter, :sub_expo, :block)
93
- def go(object, context, index=nil, user_expo)
105
+ def go(object, context, index=nil)
94
106
  associated = self.presenter.to_proc.call(object)
95
107
  sub = Expo2.new(self.sub_expo, &self.block)
96
108
  if associated
@@ -99,6 +111,9 @@ class Expo2
99
111
  {}
100
112
  end
101
113
  end
114
+ def inspect
115
+ "<Expo2::MergeExpo>"
116
+ end
102
117
  end
103
118
 
104
119
  class SubCollection < Struct.new(:associator, :key, :sub_expo, :block)
@@ -107,57 +122,50 @@ class Expo2
107
122
  sub = Expo2.new(self.sub_expo, &self.block)
108
123
  { self.key => sub.expo_collection(associated, context) }
109
124
  end
125
+ def inspect
126
+ "<Expo2::SubCollection>"
127
+ end
110
128
  end
111
129
 
112
- def presenters
113
- @presenters ||= []
114
- end
115
-
130
+ private
116
131
  def expose(*keys)
117
132
  array, hash = parse_arguments(keys)
118
133
  key_map = hasherize(array).merge(hash)
119
- presenters << Exposer.new(key_map)
120
- end
121
-
122
- def aside(*keys)
123
- array, hash = parse_arguments(keys)
124
- key_map = hasherize(array).merge(hash)
125
- presenters << Asider.new(nil, key_map)
134
+ @presenters << Exposer.new(key_map)
126
135
  end
127
136
 
128
- def aside(*keys)
129
- pres = nil
130
- !keys.first.is_a?(Symbol) && (
131
- pres = keys.shift
132
- )
137
+ def aside(presenter, *keys)
133
138
  array, hash = parse_arguments(keys)
134
139
  key_map = hasherize(array).merge(hash)
135
- presenters << Asider.new(pres, key_map)
140
+ @presenters << Asider.new(presenter, key_map)
136
141
  end
137
142
 
138
143
  def augment(presenter, *keys)
139
144
  array, hash = parse_arguments(keys)
140
145
  key_map = hasherize(array).merge(hash)
141
- presenters << Pres.new(presenter, key_map)
146
+ @presenters << Pres.new(presenter, key_map)
142
147
  end
143
148
 
144
149
  def merge(&block)
145
- presenters << Merger.new(block)
150
+ @presenters << Merger.new(block)
146
151
  end
147
152
 
148
153
  def merge_expo(pres, sub_expo=nil, &block)
149
- presenters << MergeExpo.new(pres, sub_expo, block)
154
+ @presenters << MergeExpo.new(pres, sub_expo, block)
150
155
  end
151
156
 
152
157
  def sub_expo(pres, key, sub_expo=nil, &block)
153
- presenters << SubExpo.new(pres, key, sub_expo, block)
158
+ @presenters << SubExpo.new(pres, key, sub_expo, block)
159
+ end
160
+
161
+ def recurse(pres, key)
162
+ @presenters << Recurser.new(pres, key, self)
154
163
  end
155
164
 
156
165
  def collection(associator, key, expo=nil, &block)
157
- presenters << SubCollection.new(associator, key, expo, block)
166
+ @presenters << SubCollection.new(associator, key, expo, block)
158
167
  end
159
168
 
160
- private
161
169
  def parse_arguments(args)
162
170
  last = args.pop
163
171
  array = args
@@ -174,4 +182,23 @@ class Expo2
174
182
  block ||= ->(e) { e }
175
183
  Hash[*array.map{|e| [e, block.call(e)] }.flatten]
176
184
  end
185
+
186
+ def deep_merge(hash, other_hash)
187
+ hash.merge(other_hash) do |key, oldval, newval|
188
+ oldval = oldval.to_hash if oldval.respond_to?(:to_hash)
189
+ newval = newval.to_hash if newval.respond_to?(:to_hash)
190
+ oldval.class.to_s == 'Hash' && newval.class.to_s == 'Hash' ? deep_merge(oldval, newval) : newval
191
+ end
192
+ end
193
+
194
+ class NullExpo
195
+ def expo(object, context, index)
196
+ {}
197
+ end
198
+
199
+ def inspect
200
+ "nil"
201
+ end
202
+ end
203
+ NULL_EXPO = NullExpo.new
177
204
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: expo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Serguei Filimonov
@@ -28,12 +28,12 @@ require_paths:
28
28
  - lib
29
29
  required_ruby_version: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '>='
31
+ - - ! '>='
32
32
  - !ruby/object:Gem::Version
33
33
  version: '0'
34
34
  required_rubygems_version: !ruby/object:Gem::Requirement
35
35
  requirements:
36
- - - '>='
36
+ - - ! '>='
37
37
  - !ruby/object:Gem::Version
38
38
  version: '0'
39
39
  requirements: []