expo 0.0.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 (2) hide show
  1. data/lib/expo.rb +94 -0
  2. metadata +45 -0
data/lib/expo.rb ADDED
@@ -0,0 +1,94 @@
1
+ require 'pry'
2
+
3
+ class Expo
4
+ def initialize(presenter=nil, &block)
5
+ @presenter = presenter
6
+ @block = block
7
+ @message_map = {}
8
+ @subs = {}
9
+ @summons = {}
10
+ @collections = {}
11
+ end
12
+
13
+ def expo(object, context={})
14
+ if object.nil?
15
+ return nil
16
+ end
17
+ @object = object
18
+ @context = context
19
+ if !@block
20
+ return {}
21
+ end
22
+ block_return = self.instance_exec object, context, &@block
23
+ exposition = {}
24
+ @message_map.each do |k,v|
25
+ receiver = (@presenter || object)
26
+ exposition[v] = receiver.send(k)
27
+ end
28
+ exposition.merge!(@summons)
29
+ exposition.merge!(@subs)
30
+ exposition.merge!(@collections)
31
+ if block_return
32
+ exposition.merge(block_return)
33
+ else
34
+ exposition
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def sub_expo(object, sub_expo_passed, key)
41
+ sub = sub_expo_passed.expo(object, @context)
42
+ @subs[key] = sub if sub
43
+ nil
44
+ end
45
+
46
+ def collection(key, collection, item_expo)
47
+ collection_exposition = []
48
+ collection.each.with_index do |item, index|
49
+ collection_exposition << item_expo.expo(item, @context.merge({
50
+ "#{key}_index".to_sym => index
51
+ }))
52
+ end
53
+ @collections[key] = collection_exposition
54
+ nil
55
+ end
56
+
57
+ def summon(*asides)
58
+ @summons = hasherize(asides) {|aside| @context[aside]}
59
+ nil
60
+ end
61
+
62
+ def aside(*messages)
63
+ receiver = (@presenter || @object)
64
+ last = messages.pop
65
+ if last.is_a?(Hash)
66
+ last.each do |k,v|
67
+ @context[v] = receiver.send(k)
68
+ end
69
+ elsif last
70
+ @context[last] = receiver.send(last)
71
+ end
72
+ if messages.any?
73
+ @context.merge!(hasherize(messages) {|msg| receiver.send(msg) })
74
+ end
75
+ nil
76
+ end
77
+
78
+ def expose(*messages)
79
+ last = messages.pop
80
+ if last.is_a?(Hash)
81
+ @message_map.merge!(last)
82
+ elsif last
83
+ @message_map[last] = last
84
+ end
85
+ if messages.any?
86
+ @message_map.merge!(hasherize(messages) {|msg| msg })
87
+ end
88
+ nil
89
+ end
90
+
91
+ def hasherize(array, &block)
92
+ Hash[*array.map{|e| [e, block.call(e)] }.flatten]
93
+ end
94
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: expo
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Serguei Filimonov
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-04-26 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description: Constructs a presentation of object tree sub-graphs... or something.
15
+ email: serguei.filimonov@gmail.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/expo.rb
21
+ homepage: https://github.com/sergueif/expo
22
+ licenses: []
23
+ post_install_message:
24
+ rdoc_options: []
25
+ require_paths:
26
+ - lib
27
+ required_ruby_version: !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - ! '>='
31
+ - !ruby/object:Gem::Version
32
+ version: '0'
33
+ required_rubygems_version: !ruby/object:Gem::Requirement
34
+ none: false
35
+ requirements:
36
+ - - ! '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 1.8.25
42
+ signing_key:
43
+ specification_version: 3
44
+ summary: Expo of object presentations
45
+ test_files: []