expo 0.5.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- 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: []
|