simple_view 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 (79) hide show
  1. data/Rakefile +2 -0
  2. data/lib/CVS/Entries +3 -0
  3. data/lib/CVS/Repository +1 -0
  4. data/lib/CVS/Root +1 -0
  5. data/lib/core-ext/CVS/Entries +5 -0
  6. data/lib/core-ext/CVS/Repository +1 -0
  7. data/lib/core-ext/CVS/Root +1 -0
  8. data/lib/core-ext/array.rb +14 -0
  9. data/lib/core-ext/jopen.rb +43 -0
  10. data/lib/core-ext/nilclass.rb +31 -0
  11. data/lib/core-ext/string.rb +51 -0
  12. data/lib/simple_view/CVS/Entries +11 -0
  13. data/lib/simple_view/CVS/Repository +1 -0
  14. data/lib/simple_view/CVS/RevisionCache/builder_view.rb#1.1.1.1 +42 -0
  15. data/lib/simple_view/CVS/RevisionCache/erb_view.rb#1.1.1.1 +44 -0
  16. data/lib/simple_view/CVS/RevisionCache/file_content.rb#1.1.1.1 +50 -0
  17. data/lib/simple_view/CVS/RevisionCache/io_view.rb#1.1.1.1 +37 -0
  18. data/lib/simple_view/CVS/RevisionCache/poi_view.rb#1.1.1.1 +116 -0
  19. data/lib/simple_view/CVS/RevisionCache/renderable.rb#1.1.1.1 +114 -0
  20. data/lib/simple_view/CVS/RevisionCache/simple_view.rb#1.1.1.1 +214 -0
  21. data/lib/simple_view/CVS/Root +1 -0
  22. data/lib/simple_view/builder_view.rb +42 -0
  23. data/lib/simple_view/erb_view.rb +44 -0
  24. data/lib/simple_view/file_content.rb +50 -0
  25. data/lib/simple_view/haml_view.rb +36 -0
  26. data/lib/simple_view/io_view.rb +37 -0
  27. data/lib/simple_view/java/CVS/Entries +1 -0
  28. data/lib/simple_view/java/CVS/Repository +1 -0
  29. data/lib/simple_view/java/CVS/Root +1 -0
  30. data/lib/simple_view/java/poi/CVS/Entries +6 -0
  31. data/lib/simple_view/java/poi/CVS/Repository +1 -0
  32. data/lib/simple_view/java/poi/CVS/Root +1 -0
  33. data/lib/simple_view/java/poi/poi-3.6-20091214.jar +0 -0
  34. data/lib/simple_view/java/poi/poi-contrib-3.6-20091214.jar +0 -0
  35. data/lib/simple_view/java/poi/poi-ooxml-3.6-20091214.jar +0 -0
  36. data/lib/simple_view/java/poi/poi-ooxml-schemas-3.6-20091214.jar +0 -0
  37. data/lib/simple_view/java/poi/poi-scratchpad-3.6-20091214.jar +0 -0
  38. data/lib/simple_view/poi_view.rb +116 -0
  39. data/lib/simple_view/renderable.rb +114 -0
  40. data/lib/simple_view/simple_view.rb +214 -0
  41. data/lib/simple_view/smartxls.rb +38 -0
  42. data/lib/simple_view/version.rb +3 -0
  43. data/lib/simple_view.rb +5 -0
  44. data/test/CVS/Entries +6 -0
  45. data/test/CVS/Repository +1 -0
  46. data/test/CVS/RevisionCache/test_view.rb#1.1.1.1 +25 -0
  47. data/test/CVS/RevisionCache/test_view_reuse_erb.rb#1.1.1.1 +21 -0
  48. data/test/CVS/Root +1 -0
  49. data/test/helpers/CVS/Entries +3 -0
  50. data/test/helpers/CVS/Repository +1 -0
  51. data/test/helpers/CVS/RevisionCache/test_helper.rb#1.1.1.1 +7 -0
  52. data/test/helpers/CVS/Root +1 -0
  53. data/test/helpers/etat_corbeilles_prc_helper.rb +13 -0
  54. data/test/helpers/test_helper.rb +7 -0
  55. data/test/jtest_view.rb +17 -0
  56. data/test/test_view.rb +25 -0
  57. data/test/test_view_reuse_erb.rb +21 -0
  58. data/test/test_view_sv_debug.rb +16 -0
  59. data/test/views/CVS/Entries +17 -0
  60. data/test/views/CVS/Repository +1 -0
  61. data/test/views/CVS/RevisionCache/test.erb#1.1.1.1 +2 -0
  62. data/test/views/CVS/Root +1 -0
  63. data/test/views/etat_corbeilles_prc-csv.io.rb +40 -0
  64. data/test/views/etat_corbeilles_prc-xls.poi.rb +97 -0
  65. data/test/views/etat_corbeilles_prc-xls2.smartxl.rb +128 -0
  66. data/test/views/etat_corbeilles_prc.html.erb +108 -0
  67. data/test/views/test-builder.builder.rb +1 -0
  68. data/test/views/test-erb.erb +1 -0
  69. data/test/views/test-model.xls +0 -0
  70. data/test/views/test-model.xlsx +0 -0
  71. data/test/views/test-xls.poi.rb +34 -0
  72. data/test/views/test-xls.smartxl.rb +80 -0
  73. data/test/views/test.builder.rb +1 -0
  74. data/test/views/test.erb +2 -0
  75. data/test/views/test.haml +1 -0
  76. data/test/views/test.io.rb +1 -0
  77. data/test/views/test.poi.rb +7 -0
  78. data/test/views/test_error.erb +1 -0
  79. metadata +177 -0
@@ -0,0 +1,214 @@
1
+ require 'monitor'
2
+ require 'delegate'
3
+ require 'core-ext/string'
4
+ require 'core-ext/nilclass'
5
+
6
+
7
+ module SimpleView
8
+
9
+ autoload :FileContent, File.join(File.dirname(__FILE__), 'file_content')
10
+ autoload :Renderable, File.join(File.dirname(__FILE__), 'renderable')
11
+
12
+ autoload :SimpleViewERB, File.join(File.dirname(__FILE__), 'erb_view')
13
+ autoload :SimpleViewIO, File.join(File.dirname(__FILE__), 'io_view')
14
+ autoload :SimpleViewBuilder, File.join(File.dirname(__FILE__), 'builder_view')
15
+ autoload :SimpleViewPOI, File.join(File.dirname(__FILE__), 'poi_view')
16
+
17
+ $SV_DEBUG = ENV['SV_DEBUG']
18
+
19
+ class Base
20
+
21
+
22
+ class << self
23
+ attr_accessor :directory_views, :directory_helpers
24
+ end
25
+
26
+ def directory_views
27
+ Base.directory_views
28
+ end
29
+
30
+ def directory_helpers
31
+ Base.directory_helpers
32
+ end
33
+
34
+ end
35
+
36
+ class TemplateViewNotFound < Exception; end
37
+
38
+ class SimpleViewBase < Base
39
+
40
+ attr_accessor :template, :file_template
41
+
42
+ def initialize(template, file_template = nil)
43
+ self.template = template
44
+ self.file_template = file_template
45
+ end
46
+
47
+ def template_name(ext = self.template_extension)
48
+ "#{template}#{ext}"
49
+ end
50
+
51
+ def lookup_file_template(ext = self.template_extension)
52
+ unless @file_template
53
+ tpl = self.template_name(ext)
54
+ list = Dir.glob(File.join(self.directory_views, tpl))
55
+ raise TemplateViewNotFound.new("Impossible de trouver le template #{tpl} dans le repertoire #{self.directory_views}") unless list.size == 1
56
+ @file_template = list.first
57
+ end
58
+ @file_template
59
+ end
60
+
61
+ def clean_template_name_for_helper
62
+ template[/(\w+)(\W*)/,1]
63
+ end
64
+
65
+ def lookup_file_helper
66
+ if !self.instance_variable_defined?(:@file_helper) && self.directory_helpers
67
+ helper_file_name = "#{self.clean_template_name_for_helper}_helper.rb"
68
+ puts "SimpleViewBase > helper_file_name= #{helper_file_name}" if $DEBUG
69
+ fhlpr = File.join(self.directory_helpers, helper_file_name)
70
+ puts "SimpleViewBase > fhlpr= #{fhlpr}" if $DEBUG
71
+ if File.exist?(fhlpr)
72
+ @file_helper = FileContent.file(fhlpr)
73
+ end
74
+ end
75
+ @file_helper
76
+ end
77
+
78
+ def template_content
79
+ FileContent.file(self.lookup_file_template).content
80
+ end
81
+
82
+ def has_helper?
83
+ hf = self.lookup_file_helper
84
+ return nil unless hf
85
+ true
86
+ end
87
+
88
+ def helper_module_name
89
+ hname = self.clean_template_name_for_helper # exemple: template = 'etat_corbeilles_prc.html' => hname = 'etat_corbeilles_prc'
90
+ "#{hname}_helper".camelcase(true).to_sym
91
+ end
92
+
93
+ def template_extension
94
+ if self.class.respond_to?(:extension)
95
+ return self.class.extension
96
+ end
97
+ ".rb"
98
+ end
99
+
100
+
101
+ def set_helper(rendable_object)
102
+ if has_helper?
103
+ helper = nil
104
+ helper_name = self.helper_module_name
105
+ begin
106
+ if @file_helper.changed? || !Object::const_defined?(helper_name)
107
+ load @file_helper.file(true)
108
+ else
109
+
110
+ end
111
+ helper = Object::const_get(helper_name)
112
+ rescue NameError => ex
113
+ # puts "set_helper: #{ex.message}", ex.backtrace
114
+ require(@file_helper.file)
115
+ retry
116
+ end
117
+ puts "set_helper #{helper} for: #{rendable_object}" if $DEBUG
118
+ rendable_object.extend helper
119
+ end
120
+ end
121
+
122
+
123
+ def render(rendable_object, options = {})
124
+ target = options[:target]
125
+ if String === target && (options[:type] != :string)
126
+ FileUtils.mkdir_p(File.dirname(target)) if options[:mkdirs]
127
+ open(target, options[:open]||'w') do |o|
128
+ options[:target] = o
129
+ begin
130
+ return do_rendering(rendable_object, options)
131
+ ensure
132
+ options[:target] = target
133
+ end
134
+ end
135
+ else
136
+ return do_rendering(rendable_object, options)
137
+ end
138
+ rescue => ex
139
+ puts ex.message, ex.backtrace.collect{|st| "\t#{st}"}
140
+ if $SV_DEBUG
141
+ puts "[SV_DEBUG = #$SV_DEBUG]: Retry ? [y|n]"
142
+ response = $stdin.gets.strip
143
+ retry if response =~ /Y|y/
144
+ end
145
+ raise ex
146
+ end
147
+
148
+ def render_with_helper(rendable_object)
149
+ set_helper(rendable_object)
150
+ yield if block_given?
151
+ end
152
+
153
+
154
+ class << self
155
+
156
+ def template_extensions
157
+ @template_extensions ||= {}
158
+ end
159
+
160
+ def register(subclass)
161
+ ext = subclass.extension
162
+ SimpleViewBase.template_extensions[ext] = subclass
163
+ end
164
+
165
+ def lookup_file_template(template)
166
+ tpl = "#{template}#{self.extension}"
167
+ file = File.join(Base.directory_views, tpl)
168
+ puts "lookup_file_template : #{tpl} => #{file}" if $DEBUG
169
+ raise TemplateViewNotFound.new("Impossible de trouver le template #{tpl} dans le repertoire #{Base.directory_views} (#{file})") unless File.exist?(file)
170
+ file
171
+ end
172
+
173
+ def views
174
+ @views ||= {}
175
+ end
176
+
177
+ def view(template)
178
+ self.views[template] ||= self.basic_view(template)
179
+ end
180
+
181
+ def find_view(template)
182
+ SimpleViewBase.template_extensions.each do |ext, renderer|
183
+ begin
184
+ return renderer.view(template)
185
+ rescue TemplateViewNotFound
186
+ end
187
+ end
188
+ raise TemplateViewNotFound.new("Impossible de trouver le template #{template} dans le repertoire #{Base.directory_views}")
189
+ end
190
+
191
+ protected
192
+ def basic_view(template)
193
+ file = lookup_file_template(template)
194
+ self.new(template, file)
195
+ end
196
+
197
+ end
198
+
199
+ end
200
+
201
+
202
+ class SimpleLayout < SimpleViewBase
203
+
204
+ def do_rendering(rendable_object, options)
205
+
206
+ end
207
+
208
+ end
209
+
210
+ # Loading default
211
+ SimpleViewERB.name
212
+ SimpleViewIO.name
213
+
214
+ end
@@ -0,0 +1 @@
1
+ :pserver:gie\barukh@esvwas51.si.fr:/repositories/aag
@@ -0,0 +1,42 @@
1
+ require 'builder'
2
+
3
+ module SimpleView
4
+
5
+ class SimpleViewBuilder < SimpleViewBase
6
+
7
+ EXTENTION = ".builder.rb".freeze unless defined?(EXTENTION)
8
+
9
+ def self.extension
10
+ EXTENTION
11
+ end
12
+
13
+ SimpleViewBase.register(self)
14
+
15
+ def do_rendering(rendable_object, options)
16
+ options = {:indent => 2}.merge(options)
17
+ filename = options.delete(:filename) || '<BUILDER>'
18
+ line = options.delete(:line) || 1
19
+ xml = ::Builder::XmlMarkup.new(options)
20
+ rendable_object.put_locals_objects((options.delete(:builder_name) || :xml).to_sym => xml)
21
+ render_with_helper(rendable_object) do
22
+ eval self.template_content, rendable_object.get_binding, filename, line
23
+ end
24
+ xml.target!
25
+ end
26
+
27
+ end
28
+
29
+
30
+ module Renderable
31
+
32
+ module InstanceMethods
33
+
34
+ def render_builder(template, options = {})
35
+ render_with SimpleViewBuilder, template, options
36
+ end
37
+
38
+ end
39
+
40
+ end
41
+
42
+ end
@@ -0,0 +1,44 @@
1
+ require 'erb'
2
+
3
+
4
+ module SimpleView
5
+
6
+ class SimpleViewERB < SimpleViewBase
7
+ EXTENTION = ".erb".freeze unless defined?(EXTENTION)
8
+
9
+ def self.extension
10
+ EXTENTION
11
+ end
12
+
13
+ SimpleViewBase.register(self)
14
+
15
+ def erb
16
+ unless @erb
17
+ @erb = ERB.new(self.template_content, 0, '<%%>')
18
+ @erb.filename = self.file_template
19
+ end
20
+ @erb
21
+ end
22
+
23
+ def do_rendering(rendable_object, options)
24
+ render_with_helper(rendable_object) do
25
+ res = erb.result(rendable_object.get_binding)
26
+ options[:target] << res if options[:target]
27
+ res
28
+ end
29
+ end
30
+ end
31
+
32
+ module Renderable
33
+
34
+ module InstanceMethods
35
+
36
+ def render_erb(template, options = {})
37
+ render_with SimpleViewERB, template, options
38
+ end
39
+
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,50 @@
1
+ module SimpleView
2
+ class FileContent
3
+
4
+ NO_READ = :no_read
5
+
6
+ attr_accessor :file, :last_modification
7
+
8
+ def initialize(file)
9
+ self.file = file
10
+ self.last_modification = File.mtime(self.file)
11
+ end
12
+
13
+ def content
14
+ if changed? || @content == NO_READ
15
+ @content = File.read(self.file)
16
+ self.last_modification = File.mtime(self.file)
17
+ end
18
+ @content
19
+ end
20
+
21
+ def changed?
22
+ @content.nil? || (File.mtime(self.file) > self.last_modification)
23
+ end
24
+
25
+ def file(set_content_no_read = false)
26
+ if set_content_no_read
27
+ @content = NO_READ
28
+ end
29
+ @file
30
+ end
31
+
32
+ class << self
33
+
34
+ def files
35
+ @files ||= {}
36
+ end
37
+
38
+ def file(file)
39
+ return nil unless file
40
+ self.files[file] ||= self.new(file)
41
+ end
42
+
43
+ def changed?(file)
44
+ self.file(file).changed?
45
+ end
46
+
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,36 @@
1
+ require 'haml'
2
+
3
+ module SimpleView
4
+
5
+ class SimpleViewHAML < SimpleViewBase
6
+ EXTENTION = ".haml".freeze unless defined?(EXTENTION)
7
+
8
+ def self.extension
9
+ EXTENTION
10
+ end
11
+
12
+ SimpleViewBase.register(self)
13
+
14
+ def do_rendering(rendable_object, options)
15
+ haml = Haml::Engine.new(self.template_content)
16
+ render_with_helper(rendable_object) do
17
+ res = haml.render(rendable_object.get_binding)
18
+ (options[:target] || self.out) << res
19
+ res
20
+ end
21
+ end
22
+ end
23
+
24
+ module Renderable
25
+
26
+ module InstanceMethods
27
+
28
+ def render_haml(template, options = {})
29
+ render_with SimpleViewHAML, template, options
30
+ end
31
+
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,37 @@
1
+ module SimpleView
2
+
3
+ class SimpleViewIO < SimpleViewBase
4
+ EXTENTION = ".io.rb".freeze unless defined?(EXTENTION)
5
+
6
+ def self.extension
7
+ EXTENTION
8
+ end
9
+
10
+ SimpleViewBase.register(self)
11
+
12
+ def do_rendering(rendable_object, options)
13
+ options = {:target => $stdout}.merge(options)
14
+ filename = options.delete(:filename) || '<IO>'
15
+ line = options.delete(:line) || 1
16
+ io = options[:target]
17
+ rendable_object.put_locals_objects((options.delete(:io_name) || :io).to_sym => io)
18
+ render_with_helper(rendable_object) do
19
+ eval self.template_content, rendable_object.get_binding, filename, line
20
+ end
21
+ end
22
+
23
+ end
24
+
25
+ module Renderable
26
+
27
+ module InstanceMethods
28
+
29
+ def render_io(template, options = {})
30
+ render_with SimpleViewIO, template, options
31
+ end
32
+
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1 @@
1
+ D/poi////
@@ -0,0 +1 @@
1
+ simple_view/lib/simple_view/java
@@ -0,0 +1 @@
1
+ :pserver:gie\barukh@esvwas51.si.fr:/repositories/aag
@@ -0,0 +1,6 @@
1
+ D
2
+ /poi-3.6-20091214.jar/1.1.1.1/Tue Dec 07 12:02:42 2010/-kb/
3
+ /poi-contrib-3.6-20091214.jar/1.1.1.1/Tue Dec 07 12:02:42 2010/-kb/
4
+ /poi-ooxml-3.6-20091214.jar/1.1.1.1/Tue Dec 07 12:02:42 2010/-kb/
5
+ /poi-ooxml-schemas-3.6-20091214.jar/1.1.1.1/Tue Dec 07 12:02:42 2010/-kb/
6
+ /poi-scratchpad-3.6-20091214.jar/1.1.1.1/Tue Dec 07 12:02:42 2010/-kb/
@@ -0,0 +1 @@
1
+ simple_view/lib/simple_view/java/poi
@@ -0,0 +1 @@
1
+ :pserver:gie\barukh@esvwas51.si.fr:/repositories/aag
@@ -0,0 +1,116 @@
1
+ require 'java'
2
+ Dir["#{File.dirname(__FILE__)}/java/poi/*.jar"].each {|jar| require jar}
3
+
4
+ import org.apache.poi.poifs.filesystem.POIFSFileSystem
5
+ import org.apache.poi.hssf.usermodel.HSSFWorkbook
6
+ import org.apache.poi.hssf.usermodel.HSSFChart
7
+ import java.io.FileInputStream
8
+ import java.io.FileOutputStream
9
+
10
+ # D�clarer des s�ries Excel dynamique :
11
+ # 1. D�finir les variables
12
+ # Poids=DECALER(data!$K$1;0;0;NBVAL(data!$K:$K)-1;1)
13
+ # Signatures=DECALER(data!$B$1;0;0;NBVAL(data!$B:$B)-1;1)
14
+ # NbDossiers=DECALER(data!$J$1;0;0;NBVAL(data!$J:$J)-1;1)
15
+
16
+ # NbDossiersD=DECALER(data!$L$1;0;0;NBVAL(data!$L:$L)-1;1)
17
+ # NbDossiersE=DECALER(data!$M$1;0;0;NBVAL(data!$M:$M)-1;1)
18
+ # NbDossiersF=DECALER(data!$N$1;0;0;NBVAL(data!$N:$N)-1;1)
19
+ # NbDossiersH=DECALER(data!$O$1;0;0;NBVAL(data!$O:$O)-1;1)
20
+ # NbDossiersI=DECALER(data!$P$1;0;0;NBVAL(data!$P:$P)-1;1)
21
+ # NbDossiersP=DECALER(data!$Q$1;0;0;NBVAL(data!$Q:$Q)-1;1)
22
+ # NbDossiersR=DECALER(data!$R$1;0;0;NBVAL(data!$R:$R)-1;1)
23
+ # NbDossiersX=DECALER(data!$S$1;0;0;NBVAL(data!$S:$S)-1;1)
24
+
25
+ # 2. Dans les graphes
26
+ # S�rie: =data!Poids
27
+
28
+ module SimpleView
29
+
30
+ class SimpleViewPOI < SimpleViewBase
31
+
32
+ EXTENTION = ".poi.rb".freeze unless defined?(EXTENTION)
33
+
34
+ def self.extension
35
+ EXTENTION
36
+ end
37
+
38
+ SimpleViewBase.register(self)
39
+
40
+ def render(rendable_object, options = {})
41
+ do_rendering(rendable_object, options)
42
+ end
43
+
44
+ def do_rendering(rendable_object, options)
45
+ filename = options.delete(:filename) || '<POI.XLS>'
46
+ line = options.delete(:line) || 1
47
+ model_file = options.delete(:model)
48
+
49
+ xls = model_file ? HSSFWorkbook.new(file(model_file)) : HSSFWorkbook.new
50
+
51
+ rendable_object.put_locals_objects((options.delete(:builder_name) || :xls).to_sym => xls)
52
+ render_with_helper(rendable_object) do
53
+ rendable_object.extend(Helper)
54
+ eval self.template_content, rendable_object.get_binding, filename, line
55
+ end
56
+ if options.key?(:target)
57
+ output = file(options[:target], 'w')
58
+ begin
59
+ xls.write(output)
60
+ ensure
61
+ output.close
62
+ end
63
+ end
64
+ end
65
+
66
+ def file(filename, mode = 'r')
67
+ if mode == 'r'
68
+ POIFSFileSystem.new(FileInputStream.new(filename))
69
+ else
70
+ FileOutputStream.new(filename)
71
+ end
72
+ end
73
+
74
+ module Helper
75
+ def set_cell_value(row, col_index, value)
76
+ cell = row.create_cell(col_index)
77
+ cell.set_cell_value(value)
78
+ cell
79
+ end
80
+
81
+ def get_charts(sheet)
82
+ HSSFChart.get_sheet_charts(sheet)
83
+ end
84
+
85
+ def row_at(sheet, index_line)
86
+ row = sheet.get_row(index_line)
87
+ unless row
88
+ row = sheet.create_row(index_line)
89
+ end
90
+ row
91
+ end
92
+
93
+ def cell_at(row, index_col)
94
+ cell = row.get_cell(index_col)
95
+ unless cell
96
+ cell = row.create_cell(index_col)
97
+ end
98
+ cell
99
+ end
100
+
101
+ end
102
+ end
103
+
104
+ module Renderable
105
+
106
+ module InstanceMethods
107
+
108
+ def render_poi(template, options = {})
109
+ render_with SimpleViewPOI, template, options
110
+ end
111
+
112
+ end
113
+
114
+ end
115
+
116
+ end
@@ -0,0 +1,114 @@
1
+ #
2
+ # class Toto
3
+ # include Renderable
4
+ #
5
+ # attr_accessor :affectations
6
+ #
7
+ # end
8
+ #
9
+ # toto = Toto.new
10
+ # toto.affectations = [1,2,3,4]
11
+ # out = StringIO.new
12
+ #
13
+ # toto.render_erb('test', :titi => [:a, :b, :c])
14
+ #
15
+ # Le fichier 'views/test.erb'
16
+ # ---------------------------
17
+ # affectations = <%= affectations.inspect %>
18
+ # titi = <%= titi.inspect %>
19
+ #
20
+ # toto.render_builder('test', :titi => [:a, :b, :c])
21
+ #
22
+ # Le fichier 'views/test.builder.rb'
23
+ # ----------------------------------
24
+ # xml.instruct!
25
+ # affectation.each {|aff| xml.tag!(aff)}
26
+ # titi.each {|t| xml.tag!(t)}
27
+ #
28
+ #
29
+ module SimpleView
30
+ module Renderable
31
+
32
+ def self.included(mod)
33
+ if Class === mod
34
+ mod.send(:include, InstanceMethods)
35
+ mod.send(:extend, ClassMethods)
36
+ elsif Module === mod
37
+ mod.send(:extend, InstanceMethods)
38
+ end
39
+ end
40
+
41
+ module ClassMethods
42
+
43
+ end
44
+
45
+ module InstanceMethods
46
+
47
+ def _locals_objects
48
+ @_locals_objects ||= {}
49
+ end
50
+
51
+ def put_locals_objects(locals)
52
+ self._locals_objects.merge!(locals)
53
+ locals.each_pair do |name, obj|
54
+ self.instance_eval <<-RUBY
55
+ def #{name}; self._locals_objects[:#{name}]; end
56
+ RUBY
57
+ end
58
+ end
59
+
60
+ def get_binding
61
+ binding
62
+ end
63
+
64
+ def render(template, options = {})
65
+ self.safe_rendering do |object|
66
+ object.put_locals_objects(options[:locals] || {})
67
+ view = SimpleViewBase.find_view(template)
68
+ view.render(object, options)
69
+ end
70
+ end
71
+
72
+ def render_with(renderer, template, options = {})
73
+ self.safe_rendering do |object|
74
+ object.put_locals_objects(options[:locals] || {})
75
+ view = renderer.view(template)
76
+ view.render(object, options)
77
+ end
78
+ end
79
+
80
+ protected
81
+ def safe_rendering #:nodoc:
82
+ shot = RenderingObject === self ? BasicObjectRenderable.new : RenderingObject.new(self)
83
+ yield(shot) if block_given?
84
+ end
85
+
86
+ end
87
+
88
+ end
89
+
90
+ class BasicObjectRenderable
91
+ include ::SimpleView::Renderable
92
+ end
93
+
94
+ class RenderingObject < SimpleDelegator #:nodoc:
95
+ include ::SimpleView::Renderable
96
+
97
+ def initialize(n)
98
+ super
99
+ # puts "RenderingObject for: #{n.inspect}"
100
+ end
101
+
102
+ def to_s
103
+ "RenderingObject(#{__getobj__}){:locals => #{_locals_objects.inspect}}"
104
+ end
105
+
106
+ end
107
+
108
+ # def self.render(template, options = {})
109
+ # BasicObjectRenderable.new.render(template, options)
110
+ # end
111
+
112
+
113
+ include Renderable
114
+ end