expo 0.4.0 → 0.4.1

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 +4 -4
  2. data/lib/expo2.rb +172 -0
  3. metadata +2 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9c3b0b3b053c1221f670a5e3a5881805b54d5ea0
4
- data.tar.gz: 4dab7b5dfcd4684e86049d095de8d0592b278e40
3
+ metadata.gz: fb79a7b58517e668ab4a676d4f17f655ff6cf77d
4
+ data.tar.gz: 18ac098626ee471d541a2643ce0164570e69c48b
5
5
  SHA512:
6
- metadata.gz: 69dab5afc6bf0c9ef1c338936653c012c5068a4b5623aaa0a6ad51148b95f49113119e8686816944e73b4a78190a26954c577cc600dc388aaa1e4cacc6fcb371
7
- data.tar.gz: d7cbb2f4ea8358dda1bae891c70b49c46177ab546905bfac31d20a79f67a28d829c0f681ff19c96aa7017401679dca5ee7dcbac4fcd12e500319cca120bcaf80
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.0
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: {}