expo 0.6.0 → 0.7.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 +8 -8
- data/lib/argument_parser.rb +17 -0
- data/lib/expo.rb +2 -0
- data/lib/expo2.rb +17 -144
- data/lib/hash_helper.rb +18 -0
- data/lib/null_expo.rb +17 -0
- data/lib/presenters/asider.rb +14 -0
- data/lib/presenters/exposer.rb +14 -0
- data/lib/presenters/inline_expo.rb +9 -0
- data/lib/presenters/merge_expo.rb +14 -0
- data/lib/presenters/merger.rb +9 -0
- data/lib/presenters/pres.rb +14 -0
- data/lib/presenters/recurser.rb +11 -0
- data/lib/presenters/sub_collection.rb +11 -0
- data/lib/presenters/sub_expo.rb +14 -0
- data/lib/presenters.rb +9 -0
- metadata +14 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YmM1NmEwZGE1YmE3MDFhODFhZDUzZDQ5MGRkYjYwMzU2Njg2NDgxNw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NTI2YmM5MWUyNTY2Nzg3M2QwMTQ0OWJmZDhmZjdlNmM1YTJiZGRkNg==
|
7
7
|
!binary "U0hBNTEy":
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NzY1Mjc3OWU3NDQwMjc4ZDhmOGU4MzQyMGI0YTYzYjEwZGU2Y2NiNjdiNWEx
|
10
|
+
MjNkNzJiMjE4M2M3NDYzYzI2NDAyM2YxYmQzMDFkNTUwMmU4ZGM1NWM1OTcy
|
11
|
+
MTBjNDc5MDY5YzZkZjMwZWQ1MTI3NzgxZDIwMTM3MWQ5MmZmODE=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
ZmUwODgyNzA3YzJlODA3MTQ2NjQwZTBjZjJhZDljZjYzNjZjYWM3MWY3Y2E3
|
14
|
+
NjBhZGM2NThhMjE0MzY1NTFhYmZkZjNmMTAwYWVlZGFmOTM1MDUzOGMzNmQ3
|
15
|
+
MzRmMTkzMmFlY2U0ZTJhYTlhY2Q2YzA5YTRkM2E3YjViNzFkMmQ=
|
data/lib/expo.rb
CHANGED
data/lib/expo2.rb
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
+
require 'null_expo'
|
2
|
+
require 'hash_helper'
|
3
|
+
require 'argument_parser'
|
4
|
+
require 'presenters'
|
5
|
+
|
1
6
|
class Expo2
|
2
7
|
def initialize(prototype=nil, &block)
|
3
8
|
@block = block
|
4
|
-
@prototype = prototype ||
|
9
|
+
@prototype = prototype || NullExpo.new
|
5
10
|
@presenters ||= []
|
6
11
|
self.instance_exec &@block if @block
|
7
12
|
end
|
@@ -15,7 +20,8 @@ class Expo2
|
|
15
20
|
return nil if object.nil?
|
16
21
|
preso = @prototype.expo(object, context, index)
|
17
22
|
@presenters.each do |pres|
|
18
|
-
|
23
|
+
#TODO: warn on key collision
|
24
|
+
preso = HashHelper.new.deep_merge(preso, pres.go(object, context, index))
|
19
25
|
end
|
20
26
|
preso
|
21
27
|
end
|
@@ -24,125 +30,23 @@ class Expo2
|
|
24
30
|
objects.extend(Enumerable).map.with_index{|o, i| expo(o, context, i) }
|
25
31
|
end
|
26
32
|
|
27
|
-
class Pres < Struct.new(:presenter, :key_map)
|
28
|
-
def go(object, context, index=nil)
|
29
|
-
preso = {}
|
30
|
-
perspective = self.presenter.to_proc.call(object)
|
31
|
-
self.key_map.each do |k,v|
|
32
|
-
preso[v] = perspective.send(k)
|
33
|
-
end
|
34
|
-
preso
|
35
|
-
end
|
36
|
-
|
37
|
-
def inspect
|
38
|
-
"<Expo2::Pres>"
|
39
|
-
end
|
40
|
-
end
|
41
|
-
|
42
|
-
class Asider < Struct.new(:presenter, :key_map)
|
43
|
-
def go(object, context, index=nil)
|
44
|
-
preso = {}
|
45
|
-
perspective = self.presenter.to_proc.call(object)
|
46
|
-
self.key_map.each do |k,v|
|
47
|
-
context[v] = perspective.send(k)
|
48
|
-
end
|
49
|
-
{}
|
50
|
-
end
|
51
|
-
|
52
|
-
def inspect
|
53
|
-
"<Expo2::Asider>"
|
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
|
-
|
66
|
-
def inspect
|
67
|
-
"<Expo2::Exposer>"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
class Merger < Struct.new(:block)
|
72
|
-
def go(object, context, index=nil)
|
73
|
-
self.block.call(context, index)
|
74
|
-
end
|
75
|
-
def inspect
|
76
|
-
"<Expo2::Merger>"
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
class SubExpo < Struct.new(:presenter, :key, :sub_expo, :block)
|
81
|
-
def go(object, context, index=nil)
|
82
|
-
associated = self.presenter.to_proc.call(object)
|
83
|
-
sub = Expo2.new(self.sub_expo, &self.block)
|
84
|
-
if associated
|
85
|
-
{ self.key => sub.expo(associated, context) }
|
86
|
-
else
|
87
|
-
{}
|
88
|
-
end
|
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
|
102
|
-
end
|
103
|
-
|
104
|
-
class MergeExpo < Struct.new(:presenter, :sub_expo, :block)
|
105
|
-
def go(object, context, index=nil)
|
106
|
-
associated = self.presenter.to_proc.call(object)
|
107
|
-
sub = Expo2.new(self.sub_expo, &self.block)
|
108
|
-
if associated
|
109
|
-
sub.expo(associated, context)
|
110
|
-
else
|
111
|
-
{}
|
112
|
-
end
|
113
|
-
end
|
114
|
-
def inspect
|
115
|
-
"<Expo2::MergeExpo>"
|
116
|
-
end
|
117
|
-
end
|
118
|
-
|
119
|
-
class SubCollection < Struct.new(:associator, :key, :sub_expo, :block)
|
120
|
-
def go(object, context, index=nil)
|
121
|
-
associated = self.associator.to_proc.call(object)
|
122
|
-
sub = Expo2.new(self.sub_expo, &self.block)
|
123
|
-
{ self.key => sub.expo_collection(associated, context) }
|
124
|
-
end
|
125
|
-
def inspect
|
126
|
-
"<Expo2::SubCollection>"
|
127
|
-
end
|
128
|
-
end
|
129
|
-
|
130
33
|
private
|
34
|
+
|
131
35
|
def expose(*keys)
|
132
|
-
array, hash = parse_arguments(keys)
|
133
|
-
key_map = hasherize(array).merge(hash)
|
36
|
+
array, hash = ArgumentParser.new.parse_arguments(keys)
|
37
|
+
key_map = HashHelper.new.hasherize(array).merge(hash)
|
134
38
|
@presenters << Exposer.new(key_map)
|
135
39
|
end
|
136
40
|
|
137
41
|
def aside(presenter, *keys)
|
138
|
-
array, hash = parse_arguments(keys)
|
139
|
-
key_map = hasherize(array).merge(hash)
|
42
|
+
array, hash = ArgumentParser.new.parse_arguments(keys)
|
43
|
+
key_map = HashHelper.new.hasherize(array).merge(hash)
|
140
44
|
@presenters << Asider.new(presenter, key_map)
|
141
45
|
end
|
142
46
|
|
143
47
|
def augment(presenter, *keys)
|
144
|
-
array, hash = parse_arguments(keys)
|
145
|
-
key_map = hasherize(array).merge(hash)
|
48
|
+
array, hash = ArgumentParser.new.parse_arguments(keys)
|
49
|
+
key_map = HashHelper.new.hasherize(array).merge(hash)
|
146
50
|
@presenters << Pres.new(presenter, key_map)
|
147
51
|
end
|
148
52
|
|
@@ -166,39 +70,8 @@ class Expo2
|
|
166
70
|
@presenters << SubCollection.new(associator, key, expo, block)
|
167
71
|
end
|
168
72
|
|
169
|
-
def
|
170
|
-
|
171
|
-
array = args
|
172
|
-
hash = {}
|
173
|
-
if last.is_a?(Hash)
|
174
|
-
hash = last
|
175
|
-
elsif last
|
176
|
-
array << last
|
177
|
-
end
|
178
|
-
[array, hash]
|
179
|
-
end
|
180
|
-
|
181
|
-
def hasherize(array, &block)
|
182
|
-
block ||= ->(e) { e }
|
183
|
-
Hash[*array.map{|e| [e, block.call(e)] }.flatten]
|
73
|
+
def inline(&block)
|
74
|
+
@presenters << InlineExpo.new(block)
|
184
75
|
end
|
185
76
|
|
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
|
204
77
|
end
|
data/lib/hash_helper.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
class HashHelper
|
2
|
+
def self.new
|
3
|
+
@instance ||= super
|
4
|
+
end
|
5
|
+
|
6
|
+
def hasherize(array, &block)
|
7
|
+
block ||= ->(e) { e }
|
8
|
+
Hash[*array.map{|e| [e, block.call(e)] }.flatten]
|
9
|
+
end
|
10
|
+
|
11
|
+
def deep_merge(hash, other_hash)
|
12
|
+
hash.merge(other_hash) do |key, oldval, newval|
|
13
|
+
oldval = oldval.to_hash if oldval.respond_to?(:to_hash)
|
14
|
+
newval = newval.to_hash if newval.respond_to?(:to_hash)
|
15
|
+
oldval.class.to_s == 'Hash' && newval.class.to_s == 'Hash' ? deep_merge(oldval, newval) : newval
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/null_expo.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
class Asider < Struct.new(:presenter, :key_map)
|
2
|
+
def go(object, context, index=nil)
|
3
|
+
preso = {}
|
4
|
+
perspective = self.presenter.to_proc.call(object)
|
5
|
+
self.key_map.each do |k,v|
|
6
|
+
context[v] = perspective.send(k)
|
7
|
+
end
|
8
|
+
{}
|
9
|
+
end
|
10
|
+
|
11
|
+
def inspect
|
12
|
+
"<Expo2::Asider>"
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class MergeExpo < Struct.new(:presenter, :sub_expo, :block)
|
2
|
+
def go(object, context, index=nil)
|
3
|
+
associated = self.presenter.to_proc.call(object)
|
4
|
+
sub = Expo2.new(self.sub_expo, &self.block)
|
5
|
+
if associated
|
6
|
+
sub.expo(associated, context)
|
7
|
+
else
|
8
|
+
{}
|
9
|
+
end
|
10
|
+
end
|
11
|
+
def inspect
|
12
|
+
"<Expo2::MergeExpo>"
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class Pres < Struct.new(:presenter, :key_map)
|
2
|
+
def go(object, context, index=nil)
|
3
|
+
preso = {}
|
4
|
+
perspective = self.presenter.to_proc.call(object)
|
5
|
+
self.key_map.each do |k,v|
|
6
|
+
preso[v] = perspective.send(k)
|
7
|
+
end
|
8
|
+
preso
|
9
|
+
end
|
10
|
+
|
11
|
+
def inspect
|
12
|
+
"<Expo2::Pres>"
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
class SubCollection < Struct.new(:associator, :key, :sub_expo, :block)
|
2
|
+
def go(object, context, index=nil)
|
3
|
+
associated = self.associator.to_proc.call(object)
|
4
|
+
sub = Expo2.new(self.sub_expo, &self.block)
|
5
|
+
{ self.key => sub.expo_collection(associated, context) }
|
6
|
+
end
|
7
|
+
|
8
|
+
def inspect
|
9
|
+
"<Expo2::SubCollection>"
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
class SubExpo < Struct.new(:presenter, :key, :sub_expo, :block)
|
2
|
+
def go(object, context, index=nil)
|
3
|
+
associated = self.presenter.to_proc.call(object)
|
4
|
+
sub = Expo2.new(self.sub_expo, &self.block)
|
5
|
+
if associated
|
6
|
+
{ self.key => sub.expo(associated, context) }
|
7
|
+
else
|
8
|
+
{}
|
9
|
+
end
|
10
|
+
end
|
11
|
+
def inspect
|
12
|
+
"<Expo2::SubExpo>"
|
13
|
+
end
|
14
|
+
end
|
data/lib/presenters.rb
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
require 'presenters/pres'
|
2
|
+
require 'presenters/asider'
|
3
|
+
require 'presenters/exposer'
|
4
|
+
require 'presenters/sub_expo'
|
5
|
+
require 'presenters/merger'
|
6
|
+
require 'presenters/recurser'
|
7
|
+
require 'presenters/merge_expo'
|
8
|
+
require 'presenters/sub_collection'
|
9
|
+
require 'presenters/inline_expo'
|
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.7.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Serguei Filimonov
|
@@ -17,8 +17,21 @@ executables: []
|
|
17
17
|
extensions: []
|
18
18
|
extra_rdoc_files: []
|
19
19
|
files:
|
20
|
+
- lib/argument_parser.rb
|
20
21
|
- lib/expo.rb
|
21
22
|
- lib/expo2.rb
|
23
|
+
- lib/hash_helper.rb
|
24
|
+
- lib/null_expo.rb
|
25
|
+
- lib/presenters/asider.rb
|
26
|
+
- lib/presenters/exposer.rb
|
27
|
+
- lib/presenters/inline_expo.rb
|
28
|
+
- lib/presenters/merge_expo.rb
|
29
|
+
- lib/presenters/merger.rb
|
30
|
+
- lib/presenters/pres.rb
|
31
|
+
- lib/presenters/recurser.rb
|
32
|
+
- lib/presenters/sub_collection.rb
|
33
|
+
- lib/presenters/sub_expo.rb
|
34
|
+
- lib/presenters.rb
|
22
35
|
homepage: https://github.com/sergueif/expo
|
23
36
|
licenses: []
|
24
37
|
metadata: {}
|