expo 0.6.0 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- Y2YxMTQyZjdiMDc3ZDk2M2U3MmJmZWY0OWQwYjBlNWZiZjI0ZTI3OQ==
4
+ YmM1NmEwZGE1YmE3MDFhODFhZDUzZDQ5MGRkYjYwMzU2Njg2NDgxNw==
5
5
  data.tar.gz: !binary |-
6
- MTc5ZTRkOGRkMTA4N2ZjOGNiMTZlYTY3NjYwYWJhYjhkNTVlMWFjZA==
6
+ NTI2YmM5MWUyNTY2Nzg3M2QwMTQ0OWJmZDhmZjdlNmM1YTJiZGRkNg==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- ODZhMTA4NzA3MDc0ZTdiMDkyNGRiMzIyZTM1YjM4NzY3MWFkZmViYTAzMGVi
10
- MjJlZjVmNjJhMzFhN2UyNTFmNjU0YTRhZDg0MTRiZmU3ZDU5ODM5OGE5YmY1
11
- MzZiYTAwZTczN2ZlYzQzODQ0ZGJkZTMzNTg3YmM3OGE5ZDU4OTk=
9
+ NzY1Mjc3OWU3NDQwMjc4ZDhmOGU4MzQyMGI0YTYzYjEwZGU2Y2NiNjdiNWEx
10
+ MjNkNzJiMjE4M2M3NDYzYzI2NDAyM2YxYmQzMDFkNTUwMmU4ZGM1NWM1OTcy
11
+ MTBjNDc5MDY5YzZkZjMwZWQ1MTI3NzgxZDIwMTM3MWQ5MmZmODE=
12
12
  data.tar.gz: !binary |-
13
- NGNiNzNjMTRiMjZiYjNhYzNlNjliNjNjMzNjZmZjMTk5N2Y4MTQyZjY0YTVh
14
- MjE3MjliYjljNjNlNmM5YTBhMjc1YTIzYTVlMmM3M2JkZDE1YTE5OGIzYWJk
15
- NTk0MTIyNjk0NzkyY2ZkNTUzNWYzNTIzNjIzOThiNzI2MTZlNGY=
13
+ ZmUwODgyNzA3YzJlODA3MTQ2NjQwZTBjZjJhZDljZjYzNjZjYWM3MWY3Y2E3
14
+ NjBhZGM2NThhMjE0MzY1NTFhYmZkZjNmMTAwYWVlZGFmOTM1MDUzOGMzNmQ3
15
+ MzRmMTkzMmFlY2U0ZTJhYTlhY2Q2YzA5YTRkM2E3YjViNzFkMmQ=
@@ -0,0 +1,17 @@
1
+ class ArgumentParser
2
+ def new
3
+ @instance ||= super
4
+ end
5
+
6
+ def parse_arguments(args)
7
+ last = args.pop
8
+ array = args
9
+ hash = {}
10
+ if last.is_a?(Hash)
11
+ hash = last
12
+ elsif last
13
+ array << last
14
+ end
15
+ [array, hash]
16
+ end
17
+ end
data/lib/expo.rb CHANGED
@@ -1,4 +1,6 @@
1
1
  require 'expo2'
2
+ require 'hash_helper'
3
+
2
4
  class Expo
3
5
  CALL_ORDER = [:aside, :expose, :sub_expo, :collection]
4
6
  TRIVIAL_PRESENTER = Class.new do
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 || NULL_EXPO
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
- preso = deep_merge(preso, pres.go(object, context, index))
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 parse_arguments(args)
170
- last = args.pop
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
@@ -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,17 @@
1
+ class NullExpo
2
+ def self.new
3
+ @instance ||= super
4
+ end
5
+
6
+ def expo(object, context, index)
7
+ {}
8
+ end
9
+
10
+ def expo_collection(coll, context)
11
+ []
12
+ end
13
+
14
+ def inspect
15
+ "nil"
16
+ end
17
+ end
@@ -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 Exposer < Struct.new(:key_map)
2
+ def go(object, context, index=nil)
3
+ preso = {}
4
+ self.key_map.each do |k,v|
5
+ preso[v] = object.send(k)
6
+ end
7
+ preso
8
+ end
9
+
10
+ def inspect
11
+ "<Expo2::Exposer>"
12
+ end
13
+ end
14
+
@@ -0,0 +1,9 @@
1
+ class InlineExpo < Struct.new(:block)
2
+ def go(object, context, index=nil)
3
+ self.block.call(object, context, index)
4
+ end
5
+
6
+ def inspect
7
+ "<Expo2::InlineExpo>"
8
+ end
9
+ 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,9 @@
1
+ class Merger < Struct.new(:block)
2
+ def go(object, context, index=nil)
3
+ self.block.call(context, index)
4
+ end
5
+ def inspect
6
+ "<Expo2::Merger>"
7
+ end
8
+ end
9
+
@@ -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
+ require 'presenters/sub_expo'
2
+
3
+ class Recurser < SubExpo
4
+ def initialize(presenter, key, recurser)
5
+ super(presenter, key, recurser)
6
+ end
7
+ def inspect
8
+ "<Expo2::Recurser>"
9
+ end
10
+ end
11
+
@@ -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.6.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: {}