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