expo 0.4.0 → 0.4.1
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 +4 -4
- data/lib/expo2.rb +172 -0
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fb79a7b58517e668ab4a676d4f17f655ff6cf77d
|
4
|
+
data.tar.gz: 18ac098626ee471d541a2643ce0164570e69c48b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f8f1196dcd95cb00e0456290646229af43d9c231e02a096784171c12d5e1c622790e181a424d03718016a99c5dd09639429ce6e36ae7c9419bbdfee37a7c978e
|
7
|
+
data.tar.gz: 1c75bc2f0ef6afd81dc4d1061d5c5604b3f0e9eb4d53a23c23bb34f38de974a9165e9ad4ef424780e5389283ac27374c2cefc802b24529fb24f88d82ebfd4b6f
|
data/lib/expo2.rb
ADDED
@@ -0,0 +1,172 @@
|
|
1
|
+
class Expo2
|
2
|
+
def initialize(prototype=nil, &block)
|
3
|
+
@block = block
|
4
|
+
# @built = false
|
5
|
+
@prototype = prototype
|
6
|
+
end
|
7
|
+
|
8
|
+
def prototype_presenters
|
9
|
+
Array(@prototype && @prototype.go_presenters)
|
10
|
+
end
|
11
|
+
|
12
|
+
def go_presenters
|
13
|
+
self.instance_exec &@block if @block && !@built
|
14
|
+
# @built = true
|
15
|
+
@cache ||= (prototype_presenters + presenters)
|
16
|
+
end
|
17
|
+
|
18
|
+
def expo(object, context={}, index=nil)
|
19
|
+
return nil if object.nil?
|
20
|
+
preso = {}
|
21
|
+
go_presenters.each do |pres|
|
22
|
+
preso.merge!(pres.go(object, context, index))
|
23
|
+
end
|
24
|
+
preso
|
25
|
+
end
|
26
|
+
|
27
|
+
def expo_collection(objects, context={})
|
28
|
+
objects.extend(Enumerable).map.with_index{|o, i| expo(o, context, i) }
|
29
|
+
end
|
30
|
+
|
31
|
+
class Pres < Struct.new(:presenter, :key_map)
|
32
|
+
def go(object, context, index=nil)
|
33
|
+
preso = {}
|
34
|
+
perspective = self.presenter.to_proc.call(object)
|
35
|
+
self.key_map.each do |k,v|
|
36
|
+
preso[v] = perspective.send(k)
|
37
|
+
end
|
38
|
+
preso
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
class Asider < Struct.new(:presenter, :key_map)
|
43
|
+
def go(object, context, index=nil)
|
44
|
+
preso = {}
|
45
|
+
perspective = if self.presenter
|
46
|
+
self.presenter.new(object)
|
47
|
+
else
|
48
|
+
object
|
49
|
+
end
|
50
|
+
self.key_map.each do |k,v|
|
51
|
+
context[v] = perspective.send(k)
|
52
|
+
end
|
53
|
+
{}
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
class Exposer < Struct.new(:key_map)
|
58
|
+
def go(object, context, index=nil)
|
59
|
+
preso = {}
|
60
|
+
self.key_map.each do |k,v|
|
61
|
+
preso[v] = object.send(k)
|
62
|
+
end
|
63
|
+
preso
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class Merger < Struct.new(:block)
|
68
|
+
def go(object, context, index=nil)
|
69
|
+
self.block.call(context, index)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
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
|
+
class SubExpo < Struct.new(:presenter, :key, :sub_expo, :block)
|
81
|
+
def go(object, context, index=nil, user_expo)
|
82
|
+
assoc = self.presenter
|
83
|
+
associated = if assoc.respond_to?(:new)
|
84
|
+
assoc.new(object)
|
85
|
+
else
|
86
|
+
assoc.call(object)
|
87
|
+
end
|
88
|
+
sub = Expo2.new(self.sub_expo, &self.block)
|
89
|
+
if associated
|
90
|
+
{ self.key => sub.expo(associated, context) }
|
91
|
+
else
|
92
|
+
{}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
#presenters << SubCollection.new(associator, key, sub_expo, block)
|
98
|
+
class SubCollection < Struct.new(:associator, :key, :sub_expo, :block)
|
99
|
+
def go(object, context, index=nil)
|
100
|
+
assoc = self.associator
|
101
|
+
associated = if assoc.respond_to?(:new)
|
102
|
+
assoc.new(object)
|
103
|
+
else
|
104
|
+
assoc.call(object)
|
105
|
+
end
|
106
|
+
sub = Expo2.new(self.sub_expo, &self.block)
|
107
|
+
{ self.key => sub.expo_collection(associated, context) }
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
def presenters
|
112
|
+
@presenters ||= []
|
113
|
+
end
|
114
|
+
|
115
|
+
def expose(*keys)
|
116
|
+
array, hash = parse_arguments(keys)
|
117
|
+
key_map = hasherize(array).merge(hash)
|
118
|
+
presenters << Exposer.new(key_map)
|
119
|
+
end
|
120
|
+
|
121
|
+
def aside(*keys)
|
122
|
+
array, hash = parse_arguments(keys)
|
123
|
+
key_map = hasherize(array).merge(hash)
|
124
|
+
presenters << Asider.new(nil, key_map)
|
125
|
+
end
|
126
|
+
|
127
|
+
def aside(*keys)
|
128
|
+
pres = nil
|
129
|
+
!keys.first.is_a?(Symbol) && (
|
130
|
+
pres = keys.shift
|
131
|
+
)
|
132
|
+
array, hash = parse_arguments(keys)
|
133
|
+
key_map = hasherize(array).merge(hash)
|
134
|
+
presenters << Asider.new(pres, key_map)
|
135
|
+
end
|
136
|
+
|
137
|
+
def augment(presenter, *keys)
|
138
|
+
array, hash = parse_arguments(keys)
|
139
|
+
key_map = hasherize(array).merge(hash)
|
140
|
+
presenters << Pres.new(presenter, key_map)
|
141
|
+
end
|
142
|
+
|
143
|
+
def merge(&block)
|
144
|
+
presenters << Merger.new(block)
|
145
|
+
end
|
146
|
+
|
147
|
+
def sub_expo(pres, key, sub_expo, &block)
|
148
|
+
presenters << SubExpo.new(pres, key, sub_expo, block)
|
149
|
+
end
|
150
|
+
|
151
|
+
def collection(associator, key, expo, &block)
|
152
|
+
presenters << SubCollection.new(associator, key, expo, block)
|
153
|
+
end
|
154
|
+
|
155
|
+
private
|
156
|
+
def parse_arguments(args)
|
157
|
+
last = args.pop
|
158
|
+
array = args
|
159
|
+
hash = {}
|
160
|
+
if last.is_a?(Hash)
|
161
|
+
hash = last
|
162
|
+
elsif last
|
163
|
+
array << last
|
164
|
+
end
|
165
|
+
[array, hash]
|
166
|
+
end
|
167
|
+
|
168
|
+
def hasherize(array, &block)
|
169
|
+
block ||= ->(e) { e }
|
170
|
+
Hash[*array.map{|e| [e, block.call(e)] }.flatten]
|
171
|
+
end
|
172
|
+
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.
|
4
|
+
version: 0.4.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Serguei Filimonov
|
@@ -17,6 +17,7 @@ extensions: []
|
|
17
17
|
extra_rdoc_files: []
|
18
18
|
files:
|
19
19
|
- lib/expo.rb
|
20
|
+
- lib/expo2.rb
|
20
21
|
homepage: https://github.com/sergueif/expo
|
21
22
|
licenses: []
|
22
23
|
metadata: {}
|