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.
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: {}