cuca 0.01
Sign up to get free protection for your applications and to get access to all the features.
- data/application_skeleton/README +21 -0
- data/application_skeleton/app/_controllers/application.rb +7 -0
- data/application_skeleton/app/_layouts/simple.rb +19 -0
- data/application_skeleton/app/_widgets/sourcecode.rb +21 -0
- data/application_skeleton/app/_widgets/test.rb +23 -0
- data/application_skeleton/app/demo.rb +64 -0
- data/application_skeleton/app/index.rb +39 -0
- data/application_skeleton/app/user/__default_username/index.rb +7 -0
- data/application_skeleton/conf/environment.rb +16 -0
- data/application_skeleton/log/access.log +1 -0
- data/application_skeleton/log/error.log +1 -0
- data/application_skeleton/log/messages +1 -0
- data/application_skeleton/public/css/style.css +27 -0
- data/application_skeleton/public/dispatch.cgi +31 -0
- data/application_skeleton/public/dispatch.fcgi +36 -0
- data/application_skeleton/public/img/cuca-seagull.png +0 -0
- data/application_skeleton/scripts/console +5 -0
- data/application_skeleton/scripts/console.rb +5 -0
- data/application_skeleton/scripts/server-lighttpd-fcgi.rb +116 -0
- data/application_skeleton/scripts/server-lighttpd.rb +109 -0
- data/application_skeleton/scripts/server-webrick.rb +26 -0
- data/application_skeleton/scripts/test.rb +8 -0
- data/application_skeleton/tests/widgets/link.rb +22 -0
- data/bin/cuca +43 -0
- data/lib/cuca/app.rb +317 -0
- data/lib/cuca/cgi_emu.rb +67 -0
- data/lib/cuca/cgi_fix.rb +58 -0
- data/lib/cuca/const.rb +3 -0
- data/lib/cuca/controller.rb +240 -0
- data/lib/cuca/generator/markaby.rb +80 -0
- data/lib/cuca/generator/view.rb +121 -0
- data/lib/cuca/layout.rb +62 -0
- data/lib/cuca/mimetypes.rb +89 -0
- data/lib/cuca/session.rb +143 -0
- data/lib/cuca/sessionflash.rb +56 -0
- data/lib/cuca/sessionpage.rb +41 -0
- data/lib/cuca/stdlib/arform.rb +208 -0
- data/lib/cuca/stdlib/arview.rb +16 -0
- data/lib/cuca/stdlib/form.rb +137 -0
- data/lib/cuca/stdlib/formerrors.rb +20 -0
- data/lib/cuca/stdlib/link.rb +37 -0
- data/lib/cuca/stdlib/list.rb +3 -0
- data/lib/cuca/stdlib/listwidget/dblist.rb +122 -0
- data/lib/cuca/stdlib/listwidget/list.rb +189 -0
- data/lib/cuca/stdlib/listwidget/querydef.rb +167 -0
- data/lib/cuca/stdlib/listwidget/staticdatalist.rb +79 -0
- data/lib/cuca/stdlib/slink.rb +30 -0
- data/lib/cuca/test/helpers.rb +42 -0
- data/lib/cuca/urlmap.rb +267 -0
- data/lib/cuca/widget.rb +212 -0
- data/lib/cuca.rb +68 -0
- metadata +141 -0
@@ -0,0 +1,189 @@
|
|
1
|
+
|
2
|
+
require 'cuca/generator/view'
|
3
|
+
require 'cuca/generator/markaby'
|
4
|
+
require 'cuca/stdlib/listwidget/querydef'
|
5
|
+
require 'cuca/stdlib/slink'
|
6
|
+
|
7
|
+
# this is the parent class for dblist and staticdatalist
|
8
|
+
class BaseList < Cuca::Widget
|
9
|
+
include Cuca::Generator::View
|
10
|
+
include Cuca::Generator::Markaby
|
11
|
+
|
12
|
+
attr_reader :data
|
13
|
+
attr_reader :rewrite_hooks
|
14
|
+
|
15
|
+
|
16
|
+
# Add a proc to rewrite content of a field
|
17
|
+
# proc must take two arguments, |row_content, field_content|
|
18
|
+
def add_rewrite_hook(field_id, &proc)
|
19
|
+
@rewrite_hooks||= {}
|
20
|
+
@rewrite_hooks[field_id] = proc
|
21
|
+
end
|
22
|
+
|
23
|
+
def rewrite_field(row, field_id, content)
|
24
|
+
# $stderr.puts "REwrite field(#{row.inspect}, #{field_id.inspect}, #{content.inspect} - hooks #{@rewrite_hooks.inspect}"
|
25
|
+
return content unless @rewrite_hooks[field_id]
|
26
|
+
return @rewrite_hooks[field_id].call(row, content)
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
# Use to initialize
|
31
|
+
#
|
32
|
+
def setup
|
33
|
+
end
|
34
|
+
|
35
|
+
# OVERWRITE
|
36
|
+
# return a list of columns
|
37
|
+
def columns
|
38
|
+
return [{:id=>"one", :display =>'One', :searchable=>false}, {:id=>'two', :display => 'three'}]
|
39
|
+
end
|
40
|
+
|
41
|
+
#OVERWRITE:
|
42
|
+
# fetch data and write:
|
43
|
+
# @data = [['a','b', 12], ...]
|
44
|
+
# @total_rows = 123
|
45
|
+
def query(query_definition)
|
46
|
+
return
|
47
|
+
end
|
48
|
+
|
49
|
+
# TODO: Load from Session
|
50
|
+
def load_query_definition
|
51
|
+
qd = QueryDef.new(@list_name)
|
52
|
+
qd.from_params(params)
|
53
|
+
end
|
54
|
+
|
55
|
+
def output(list_name)
|
56
|
+
@list_name = list_name
|
57
|
+
|
58
|
+
@columns = columns
|
59
|
+
@query_def = load_query_definition
|
60
|
+
query(@query_def)
|
61
|
+
@paginate = paginate_links()
|
62
|
+
@params = params
|
63
|
+
@rewrite_hooks ||= {}
|
64
|
+
|
65
|
+
callback_method = "#{@list_name}_data"
|
66
|
+
|
67
|
+
# $stderr.puts "Callback check: #{controller.nil?.inspect} \n\n -- #{controller.methods.sort.inspect} --\n\n NAME #{controller.class.inspect}"
|
68
|
+
if !controller.nil? && controller.methods.include?(callback_method)
|
69
|
+
controller.send(callback_method, @data)
|
70
|
+
end
|
71
|
+
|
72
|
+
view_p(erb_template)
|
73
|
+
end # def
|
74
|
+
|
75
|
+
private
|
76
|
+
def paginate_links()
|
77
|
+
@rows_per_page = (@query_def.range.last - @query_def.range.first) + 1
|
78
|
+
@total_pages = (@total_rows / @rows_per_page).to_i
|
79
|
+
@total_pages = @total_pages + 1 unless ((@total_rows % @rows_per_page) == 0)
|
80
|
+
|
81
|
+
pl = '' ; i = 0
|
82
|
+
(0..(@total_pages-1)).each do |p|
|
83
|
+
range = i..(i+@rows_per_page-1)
|
84
|
+
if range.include?(@query_def.range.first+1) then
|
85
|
+
pl<< "#{(p+1).to_s} "
|
86
|
+
else
|
87
|
+
pl << "#{SLinkWidget.new(:args=>['',(p+1).to_s,@query_def.to_h('range', range)]).to_s} "
|
88
|
+
end
|
89
|
+
i+=@rows_per_page
|
90
|
+
end
|
91
|
+
|
92
|
+
return pl
|
93
|
+
|
94
|
+
#### The above should be a bit faster that this mab version:
|
95
|
+
# return mabtext do
|
96
|
+
# i = 0
|
97
|
+
# (0..(@total_pages-1)).each do |p|
|
98
|
+
# range = i..(i+@rows_per_page-1)
|
99
|
+
# $stderr.puts "#{range.inspect} include? #{@query_def.range.first+1}"
|
100
|
+
# if range.include?(@query_def.range.first+1) then
|
101
|
+
# text((p+1).to_s + " ")
|
102
|
+
# else
|
103
|
+
# Link('', @query_def.to_h('range', range)) { ((p+1).to_s) }
|
104
|
+
# SLink('',(p+1).to_s, @query_def.to_h('range', range))
|
105
|
+
# text " "
|
106
|
+
# end
|
107
|
+
# i+=@rows_per_page
|
108
|
+
# end
|
109
|
+
# end
|
110
|
+
end
|
111
|
+
|
112
|
+
private
|
113
|
+
def erb_template
|
114
|
+
<<'ENDTEMPLATE'
|
115
|
+
<div class='list'>
|
116
|
+
<%= @paginate %>
|
117
|
+
<table width>
|
118
|
+
<tr>
|
119
|
+
|
120
|
+
<% @columns.each do |c| %>
|
121
|
+
<td class='hl'>
|
122
|
+
<%= (@query_def.order_by == c[:id] || (c[:sortable] == false)) ?
|
123
|
+
c[:display] : SLink('',c[:display],@query_def.to_h('order_by', c[:id]))
|
124
|
+
%>
|
125
|
+
</td>
|
126
|
+
<% end %>
|
127
|
+
|
128
|
+
<form name="<%=@list_name%>_form" method="POST">
|
129
|
+
<tr>
|
130
|
+
<% @columns.each do |c|
|
131
|
+
ftag = "#{@list_name}_filter_#{c[:id]}" %>
|
132
|
+
<td>
|
133
|
+
<% if c[:searchable] != false then %>
|
134
|
+
<input style='float:left;' type="text" name="<%=ftag%>" value="<%=@query_def.filters[c[:id]]%>" >
|
135
|
+
<% end %>
|
136
|
+
<% if (@columns.last[:id] == c[:id]) then %>
|
137
|
+
<input style='float:right;' type="submit" value="ok">
|
138
|
+
<% end %>
|
139
|
+
</td>
|
140
|
+
<% end %>
|
141
|
+
</tr>
|
142
|
+
</form>
|
143
|
+
|
144
|
+
<% @data.each do |row| %>
|
145
|
+
<tr>
|
146
|
+
<% row.each_index do |field_idx| %>
|
147
|
+
<td> <%= rewrite_field(row, @columns[field_idx][:id], row[field_idx]) %> </td>
|
148
|
+
<% end %>
|
149
|
+
</tr>
|
150
|
+
<% end %>
|
151
|
+
</table>
|
152
|
+
</div>
|
153
|
+
ENDTEMPLATE
|
154
|
+
end
|
155
|
+
|
156
|
+
end
|
157
|
+
|
158
|
+
|
159
|
+
# This would be a markaby template for the listwidget. I find it less readable so will not
|
160
|
+
# continue working on it.
|
161
|
+
#
|
162
|
+
#
|
163
|
+
# mab {
|
164
|
+
# div.list do
|
165
|
+
# text @paginate
|
166
|
+
# table do
|
167
|
+
# tr do
|
168
|
+
# @columns.each { |c| td { @query_def.order_by == c[:id] ? text(c[:display]) : Link('', @query_def.to_h('order_by',
|
169
|
+
# end
|
170
|
+
# form(:name=>"#{@list_name}_form", :method=>'POST') do
|
171
|
+
# tr do
|
172
|
+
# @columns.each { |c|
|
173
|
+
# td { @ftag = "#{@list_name}_filter_#{c[:id]}"
|
174
|
+
# input(:type => 'text', :name => @ftag, :value => @query_def.filters[c[:id]])
|
175
|
+
# input(:type=>'submit',:value=>'ok') if (@columns.last[:id] == c[:id])
|
176
|
+
# }
|
177
|
+
# }
|
178
|
+
# end
|
179
|
+
# end
|
180
|
+
# @data.each do |row|
|
181
|
+
# tr do
|
182
|
+
# row.each_index do |field_idx|
|
183
|
+
# td { text rewrite_field(row, @columns[field_idx][:id], row[field_idx]) }
|
184
|
+
# end
|
185
|
+
# end
|
186
|
+
# end # data.each
|
187
|
+
# end # table.do
|
188
|
+
# end # div.list
|
189
|
+
# } #mab
|
@@ -0,0 +1,167 @@
|
|
1
|
+
|
2
|
+
# QueryDef is a settings class that hold the settings for the query for listwidget
|
3
|
+
#
|
4
|
+
# FIXME: Change name or put into namespace
|
5
|
+
class QueryDef
|
6
|
+
ATTRIBS = ['order_by','range', 'filters']
|
7
|
+
ATTRIBS_ENCODE =
|
8
|
+
{
|
9
|
+
'range' =>
|
10
|
+
Proc.new do |e|
|
11
|
+
"#{e.first}-#{e.last}"
|
12
|
+
end,
|
13
|
+
'filters' =>
|
14
|
+
Proc.new do |e|
|
15
|
+
s = '';
|
16
|
+
e.each_pair { |k,v| s << "#{k}:#{v};" };
|
17
|
+
s
|
18
|
+
end
|
19
|
+
}
|
20
|
+
ATTRIBS_DECODE =
|
21
|
+
{
|
22
|
+
'range' =>
|
23
|
+
Proc.new do |e|
|
24
|
+
Range.new(e.split('-')[0].to_i,e.split('-')[1].to_i)
|
25
|
+
end,
|
26
|
+
'filters' =>
|
27
|
+
Proc.new do |e|
|
28
|
+
h = {}
|
29
|
+
e.split(';').each do |p|
|
30
|
+
vals = p.split(':')
|
31
|
+
h[vals[0]] = vals[1] if (vals.size == 2)
|
32
|
+
end
|
33
|
+
h
|
34
|
+
end
|
35
|
+
}
|
36
|
+
ATTRIBS_DEFAULTS = { 'range' => 0..9,
|
37
|
+
'order_by' => '',
|
38
|
+
'filters' => {} }
|
39
|
+
|
40
|
+
# take from CGI class
|
41
|
+
def escape(string)
|
42
|
+
string.gsub(/([^ a-zA-Z0-9_.-]+)/n) do
|
43
|
+
'%' + $1.unpack('H2' * $1.size).join('%').upcase
|
44
|
+
end.tr(' ', '+')
|
45
|
+
end
|
46
|
+
def unescape(string)
|
47
|
+
string.tr('+', ' ').gsub(/((?:%[0-9a-fA-F]{2})+)/n) do
|
48
|
+
[$1.delete('%')].pack('H*')
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def method_missing(m, *params)
|
53
|
+
met = m.id2name
|
54
|
+
|
55
|
+
#getter
|
56
|
+
if (ATTRIBS.include?(met)) then
|
57
|
+
return @data[met] || ATTRIBS_DEFAULT[met].dup
|
58
|
+
end
|
59
|
+
|
60
|
+
#setter
|
61
|
+
raise NoMethodError if met[met.size-1].chr != '='
|
62
|
+
raise NoMethodError if params.size != 1
|
63
|
+
met = met[0..met.size-2] # cut '='
|
64
|
+
if ATTRIBS.include?(met) then
|
65
|
+
@data[met] = params[0]
|
66
|
+
else
|
67
|
+
raise NoMethodError
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# value enc/dec
|
72
|
+
def ev_enc(name)
|
73
|
+
# $stderr.puts "env_enc(#{name}) #{@data.inspect}"
|
74
|
+
if ATTRIBS_ENCODE.has_key?(name) then
|
75
|
+
ATTRIBS_ENCODE[name].call(@data[name] || '')
|
76
|
+
else
|
77
|
+
@data[name]
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def ev_dec(name, value)
|
82
|
+
if ATTRIBS_DECODE.has_key?(name) then
|
83
|
+
# $stderr.puts "ev_dec #{name} #{value}"
|
84
|
+
begin
|
85
|
+
return ATTRIBS_DECODE[name].call(value)
|
86
|
+
rescue
|
87
|
+
# $stderr.puts "Decoding failed: #{name} - #{value}: #{$!}"
|
88
|
+
return ATTRIBS_DEFAULTS[name].dup
|
89
|
+
end
|
90
|
+
else
|
91
|
+
return value
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
# attribute-name enc/dec
|
96
|
+
def at_enc(name)
|
97
|
+
"#{@list_name}_#{name}"
|
98
|
+
end
|
99
|
+
|
100
|
+
def at_dec(name)
|
101
|
+
name[@list_name.size..@name.size-1]
|
102
|
+
end
|
103
|
+
|
104
|
+
# returns an hash with the values and escaped names and attributes
|
105
|
+
# attr and newval with swap a value for this return without changing the actual data
|
106
|
+
def to_h(attr=nil, newval=nil)
|
107
|
+
if attr then
|
108
|
+
@backup = @data.dup
|
109
|
+
@data[attr] = newval
|
110
|
+
end
|
111
|
+
|
112
|
+
u = {}
|
113
|
+
ATTRIBS.each do |a|
|
114
|
+
# $stderr.puts "Encoding: #{a} - #{@data[a]}"
|
115
|
+
u[at_enc(a)] = escape(ev_enc(a) || '')
|
116
|
+
end
|
117
|
+
|
118
|
+
if attr then @data = @backup end
|
119
|
+
|
120
|
+
return u
|
121
|
+
end
|
122
|
+
|
123
|
+
def from_params(params)
|
124
|
+
# $stderr.puts "CGI PARAMS: #{$cgi.params.inspect}"
|
125
|
+
# $stderr.puts "*** From Params\n #{params.inspect}\n"
|
126
|
+
# $stderr.puts "*** DEFAULT ATTR: #{ATTRIBS_DEFAULTS.inspect}\n"
|
127
|
+
ATTRIBS.each do |a|
|
128
|
+
# $stderr.puts "Checking: #{at_enc(a)} = #{params[at_enc(a)][0]}"
|
129
|
+
v = params[at_enc(a)]
|
130
|
+
if v then
|
131
|
+
@data[a] = ev_dec(a,v)
|
132
|
+
else
|
133
|
+
@data[a] = ATTRIBS_DEFAULTS[a].dup
|
134
|
+
end
|
135
|
+
# $stderr.puts "\n*** ENDFROM_PARAMS: #{@data.inspect}"
|
136
|
+
end
|
137
|
+
|
138
|
+
# checking on filters that come by post
|
139
|
+
# $stderr.puts "PARAMS: #{params.inspect}"
|
140
|
+
params.each_pair do |p,v|
|
141
|
+
if p.include?("#{@list_name}_filter_") then
|
142
|
+
@data['filters'] ||= {}
|
143
|
+
fname = p.scan(/\_filter\_(.*)/)[0][0]
|
144
|
+
fdata = v
|
145
|
+
@data['filters'][fname] = fdata
|
146
|
+
# $stderr.puts "Filter update: #{@data['filters'].inspect}"
|
147
|
+
end
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
# $stderr.puts @data.to_yaml
|
152
|
+
return self
|
153
|
+
end
|
154
|
+
|
155
|
+
def initialize(list_name)
|
156
|
+
@list_name = list_name
|
157
|
+
@data = {}
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# qr = QueryDef.new("my_list")
|
162
|
+
# qr.order_by = 'firstname'
|
163
|
+
# qr.range = 100..200
|
164
|
+
#
|
165
|
+
# qr.filters = {'firstname' => 'martin', 'lastname' => 'boese' }
|
166
|
+
# puts qr.to_url
|
167
|
+
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'cuca/stdlib/listwidget/list'
|
2
|
+
|
3
|
+
|
4
|
+
# Displays data from memory
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
#
|
8
|
+
# StaticDataList('list_name',
|
9
|
+
# :columns => [ { :id => 'id', :display=>'ID' },
|
10
|
+
# { :id => 'name', :display=>'Name' } ],
|
11
|
+
# :data => [[ 1, 'Jack'],
|
12
|
+
# [ 2, 'Elvis'],
|
13
|
+
# [ 3, 'Alice']])
|
14
|
+
class StaticDataListWidget < BaseList
|
15
|
+
def setup
|
16
|
+
super
|
17
|
+
end
|
18
|
+
|
19
|
+
def output(list_name = "noname", data_setup = {})
|
20
|
+
@sd_columns = data_setup[:columns] || []
|
21
|
+
@sd_data = data_setup[:data] || []
|
22
|
+
@list_name = list_name
|
23
|
+
setup
|
24
|
+
@sd_columns.freeze
|
25
|
+
@sd_data.freeze
|
26
|
+
super(@list_name)
|
27
|
+
end
|
28
|
+
|
29
|
+
def columns
|
30
|
+
return @sd_columns
|
31
|
+
end
|
32
|
+
|
33
|
+
def filter(data, column_name, value)
|
34
|
+
cidx = col_idx_by_id(column_name)
|
35
|
+
return data if cidx.nil?
|
36
|
+
return data if value.strip.empty?
|
37
|
+
|
38
|
+
new_data = []
|
39
|
+
data.each_index do |didx|
|
40
|
+
if data[didx][cidx].instance_of?(String) then
|
41
|
+
# $stderr.puts "Filter: #{@data[didx][cidx]} on #{value}"
|
42
|
+
new_data << data[didx] if data[didx][cidx].include?(value)
|
43
|
+
# $stderr.puts @new_data.inspect
|
44
|
+
end
|
45
|
+
end
|
46
|
+
# $stderr.puts "Filter done(#{column_name}, #{value}): #{new_data.inspect}"
|
47
|
+
return new_data
|
48
|
+
end
|
49
|
+
|
50
|
+
def apply_filters(query_def)
|
51
|
+
query_def.filters.each_pair do |k,v|
|
52
|
+
@data = filter(@data, k,v)
|
53
|
+
end
|
54
|
+
# $stderr.puts "Done filtering: #{@data.inspect}"
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
|
59
|
+
def query(query_def)
|
60
|
+
cidx = col_idx_by_id(query_def.order_by) || 0
|
61
|
+
|
62
|
+
@data = @sd_data.sort { |a,b| a[cidx] <=> b[cidx] }
|
63
|
+
apply_filters(query_def)
|
64
|
+
@total_rows = @data.size
|
65
|
+
@data = @data[query_def.range]
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
def col_idx_by_id(col)
|
70
|
+
@sd_columns.each_index do |idx|
|
71
|
+
if @sd_columns[idx][:id] == col then
|
72
|
+
return idx
|
73
|
+
end
|
74
|
+
end
|
75
|
+
return nil
|
76
|
+
end
|
77
|
+
|
78
|
+
end
|
79
|
+
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# Simple, fast link - no markaby as block
|
2
|
+
|
3
|
+
class SLinkWidget < Cuca::Widget
|
4
|
+
private
|
5
|
+
def build_href(target, params)
|
6
|
+
r = target
|
7
|
+
|
8
|
+
r=r+"?" unless params.empty?
|
9
|
+
|
10
|
+
params.each_key do |key|
|
11
|
+
r = r + '&' unless r[r.size-1].chr == '?'
|
12
|
+
r = "#{r}#{key}=#{params[key]}"
|
13
|
+
end
|
14
|
+
return r
|
15
|
+
end
|
16
|
+
|
17
|
+
|
18
|
+
public
|
19
|
+
def output(target, text = nil, params = {}, tag_attrib = {})
|
20
|
+
@attribs = tag_attrib
|
21
|
+
@attribs[:href] = build_href(target, params)
|
22
|
+
|
23
|
+
@_content = "<a "
|
24
|
+
@attribs.each_pair do |k,v|
|
25
|
+
@_content << "#{k}='#{v}'"
|
26
|
+
end
|
27
|
+
@_content << ">#{text || target}</a>"
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
|
2
|
+
require 'test/unit'
|
3
|
+
|
4
|
+
module Cuca
|
5
|
+
module Test
|
6
|
+
|
7
|
+
# Some function that should help you testing your widgets and controllers
|
8
|
+
module Helpers
|
9
|
+
|
10
|
+
|
11
|
+
# init the application. call this from the setup method.
|
12
|
+
def init(app_path = '/', params = {})
|
13
|
+
require 'cuca/cgi_emu'
|
14
|
+
@app = Cuca::App.new(CGIEmu.new({'PATH_INFO' => app_path, 'QUERY_PARAMS' => params}))
|
15
|
+
@app.load_support_files
|
16
|
+
end
|
17
|
+
|
18
|
+
# this will create a widget instance with params and block
|
19
|
+
# as passed to this function. Also it will pass current instance
|
20
|
+
# variables to the assigns.
|
21
|
+
def widget(widget_class, *args, &block)
|
22
|
+
a = {}
|
23
|
+
instance_variables.each do |v|
|
24
|
+
a[v.gsub(/\@/,'')] = self.instance_variable_get(v)
|
25
|
+
end
|
26
|
+
return widget_class.new({:assigns => a, :args => args}, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
# same as above but enable the profiler to stdout
|
30
|
+
def widget_p(widget_class, *args, &block)
|
31
|
+
a = {}
|
32
|
+
instance_variables.each do |v|
|
33
|
+
a[v.gsub(/\@/,'')] = self.instance_variable_get(v)
|
34
|
+
end
|
35
|
+
return widget_class.new({:assigns => a, :args => args, :profiler => $stdout}, &block)
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|