expo 0.5.2 → 0.6.0

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.
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: []