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.
- checksums.yaml +14 -6
- data/lib/expo2.rb +76 -49
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
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
|
-
|
5
|
-
@
|
4
|
+
@prototype = prototype || NULL_EXPO
|
5
|
+
@presenters ||= []
|
6
|
+
self.instance_exec &@block if @block
|
6
7
|
end
|
7
8
|
|
8
|
-
def
|
9
|
-
|
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
|
-
|
22
|
-
preso
|
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 =
|
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
|
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
|
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
|
-
|
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(
|
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.
|
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: []
|