expo 0.2.4 → 0.2.5

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 +15 -0
  2. data/lib/expo.rb +46 -22
  3. metadata +4 -6
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ ZWEwMDY2NzQyNTJkYTE5OGE3NzU3OWJmYjM0YmM1YmQ4OGFjZDgwZA==
5
+ data.tar.gz: !binary |-
6
+ YWQ1ZWEyNGMyNGRkNWJiZmViMjc3ZmNmM2JjZDcxOGEyZTM5ZmRiYw==
7
+ !binary "U0hBNTEy":
8
+ metadata.gz: !binary |-
9
+ MDMwM2ZmMWM3N2U0OTExNzYwNTgzZjBmZmIzZGI1NGEyMGQ1MWNjYWM3NjUw
10
+ NmU5MjQzOGZhNmYzMDA2ZTA1YmM4MTBkMGNkNThjNTc5YTI0MGQ3ZWRmMzE3
11
+ YjBhYjI3NzM1ODE2ZjFkMzlmNDgzYzdhNDBkYzQ2ZTc1ODZlNTE=
12
+ data.tar.gz: !binary |-
13
+ OTE2YjU3YmQxNGJhNDA1YjgwNTRjNGY1Y2YyZmFmMTNjYTgyYWFkZDA1Mjc2
14
+ ZDAzMDY4YzU1Y2FiOGU2NjQ2NjZjYWNkMjlmY2Y3M2JmZmJkZmYzZTU4NzMx
15
+ NDc3YTM0NmU1ZDhlMjYzZWRiZmQ5ZTIzYzllYWE1NGQ5NWVmZWQ=
data/lib/expo.rb CHANGED
@@ -1,7 +1,5 @@
1
1
  class Expo
2
2
  CALL_ORDER = [:aside, :expose, :sub_expo, :collection]
3
- CALL_IMMEDIATELY = [:aside, :expose]
4
- CALL_LATER = [:sub_expo, :collection]
5
3
  TRIVIAL_PRESENTER = Class.new do
6
4
  def present(object)
7
5
  object
@@ -15,6 +13,7 @@ class Expo
15
13
  @subs = {}
16
14
  @collections = {}
17
15
  @inner_calls = []
16
+ @id = self.object_id
18
17
  end
19
18
 
20
19
  def expo_collection(objects, context={})
@@ -23,7 +22,15 @@ class Expo
23
22
  end
24
23
  end
25
24
 
25
+ def reset
26
+ @message_map = {}
27
+ @subs = {}
28
+ @collections = {}
29
+ @inner_calls = []
30
+ end
31
+
26
32
  def expo(object, context={})
33
+
27
34
  @object = object
28
35
  @context = context
29
36
  if object.nil?
@@ -37,16 +44,16 @@ class Expo
37
44
  return {}
38
45
  end
39
46
  block_return = self.instance_exec @object, context, &@block
40
- @inner_calls.sort_by{|call| CALL_ORDER.index(call[:method])}.each do |call|
47
+ @inner_calls.each do |call|
41
48
  self.send(call[:method], *call[:args], &call[:block])
42
49
  end
43
50
  exposition = {}
44
51
  @message_map.each do |k,v|
45
- # puts "sending #{k}"
46
52
  exposition[v] = @preso.send(k)
47
53
  end
48
54
  exposition.merge!(@subs)
49
55
  exposition.merge!(@collections)
56
+ self.reset
50
57
  if block_return
51
58
  exposition.merge(block_return)
52
59
  else
@@ -56,25 +63,38 @@ class Expo
56
63
 
57
64
  private
58
65
 
59
- def method_missing(meth, *args, &block)
60
- if CALL_IMMEDIATELY.include? meth
61
- self.send("#{meth}_inner".to_sym, *args, &block)
62
- end
63
- if CALL_LATER.include? meth
64
- @inner_calls << {
65
- method: "#{meth}_inner".to_sym,
66
- args: args,
67
- block: block
68
- }
69
- end
66
+ def sub_expo(object, sub_expo_passed, key)
67
+ @inner_calls << {
68
+ method: :sub_expo_inner,
69
+ args: [object, sub_expo_passed, key],
70
+ block: nil
71
+ }
72
+ nil
73
+ end
70
74
 
75
+ def collection(key, collection, item_expo)
76
+ @inner_calls << {
77
+ method: :collection_inner,
78
+ args: [key, collection, item_expo],
79
+ block: nil
80
+ }
71
81
  nil
72
82
  end
73
83
 
84
+ def set_id(id)
85
+ @id = id
86
+ self
87
+ end
88
+
89
+ def get_id
90
+ @id
91
+ end
92
+
74
93
  def sub_expo_inner(object, sub_expo_passed, key)
75
94
  recurse_expo = sub_expo_passed
76
- if sub_expo_passed == self
77
- recurse_expo = Expo.new(@presenter, &@block)
95
+ sub_id = sub_expo_passed.send(:get_id)
96
+ if sub_id == @id
97
+ recurse_expo = Expo.new(@presenter, &@block).send(:set_id, @id)
78
98
  end
79
99
  sub = recurse_expo.expo(object, @context)
80
100
  @subs[key] = sub if sub
@@ -83,8 +103,13 @@ class Expo
83
103
 
84
104
  def collection_inner(key, collection, item_expo)
85
105
  recurse_expo = item_expo
86
- if item_expo == self
87
- recurse_expo = Expo.new(@presenter, &@block)
106
+ sub_id = item_expo.send(:get_id)
107
+ if sub_id == @id
108
+ recurse_expo = Expo.new(@presenter, &@block).send(:set_id, @id)
109
+ end
110
+ if !collection
111
+ @collections[key] = nil
112
+ return nil
88
113
  end
89
114
  collection_exposition = []
90
115
  collection.each.with_index do |item, index|
@@ -96,7 +121,7 @@ class Expo
96
121
  nil
97
122
  end
98
123
 
99
- def aside_inner(*messages)
124
+ def aside(*messages)
100
125
  receiver = @preso
101
126
  last = messages.pop
102
127
  if last.is_a?(Hash)
@@ -112,7 +137,7 @@ class Expo
112
137
  nil
113
138
  end
114
139
 
115
- def expose_inner(*messages)
140
+ def expose(*messages)
116
141
  last = messages.pop
117
142
  if last.is_a?(Hash)
118
143
  @message_map.merge!(last)
@@ -135,7 +160,6 @@ class Expo
135
160
  end
136
161
 
137
162
  def method_missing(method, *args, &block)
138
- # puts "missing #{method}"
139
163
  @objects.detect{|obj| obj.respond_to? method}.send(
140
164
  method, *args, &block
141
165
  )
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: expo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
5
- prerelease:
4
+ version: 0.2.5
6
5
  platform: ruby
7
6
  authors:
8
7
  - Serguei Filimonov
@@ -20,26 +19,25 @@ files:
20
19
  - lib/expo.rb
21
20
  homepage: https://github.com/sergueif/expo
22
21
  licenses: []
22
+ metadata: {}
23
23
  post_install_message:
24
24
  rdoc_options: []
25
25
  require_paths:
26
26
  - lib
27
27
  required_ruby_version: !ruby/object:Gem::Requirement
28
- none: false
29
28
  requirements:
30
29
  - - ! '>='
31
30
  - !ruby/object:Gem::Version
32
31
  version: '0'
33
32
  required_rubygems_version: !ruby/object:Gem::Requirement
34
- none: false
35
33
  requirements:
36
34
  - - ! '>='
37
35
  - !ruby/object:Gem::Version
38
36
  version: '0'
39
37
  requirements: []
40
38
  rubyforge_project:
41
- rubygems_version: 1.8.24
39
+ rubygems_version: 2.0.3
42
40
  signing_key:
43
- specification_version: 3
41
+ specification_version: 4
44
42
  summary: Expo of object presentations
45
43
  test_files: []