egalite 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.
- data/.gitignore +17 -0
- data/README.md +91 -0
- data/auth/basic.rb +32 -0
- data/blank.rb +53 -0
- data/egalite.rb +742 -0
- data/errorconsole.rb +77 -0
- data/examples/simple/example.rb +39 -0
- data/examples/simple/pages/test.html +15 -0
- data/examples/simple_db/example_db.rb +103 -0
- data/examples/simple_db/pages/edit.html +6 -0
- data/helper.rb +251 -0
- data/keitai/keitai.rb +107 -0
- data/keitai/ketai.rb +11 -0
- data/keitai/rack/ketai/carrier/abstract.rb +131 -0
- data/keitai/rack/ketai/carrier/au.rb +78 -0
- data/keitai/rack/ketai/carrier/docomo.rb +80 -0
- data/keitai/rack/ketai/carrier/emoji/ausjisstrtoemojiid.rb +1391 -0
- data/keitai/rack/ketai/carrier/emoji/docomosjisstrtoemojiid.rb +759 -0
- data/keitai/rack/ketai/carrier/emoji/emojidata.rb +836 -0
- data/keitai/rack/ketai/carrier/emoji/softbankutf8strtoemojiid.rb +1119 -0
- data/keitai/rack/ketai/carrier/emoji/softbankwebcodetoutf8str.rb +499 -0
- data/keitai/rack/ketai/carrier/iphone.rb +8 -0
- data/keitai/rack/ketai/carrier/softbank.rb +82 -0
- data/keitai/rack/ketai/carrier.rb +17 -0
- data/keitai/rack/ketai/middleware.rb +24 -0
- data/m17n.rb +193 -0
- data/rack/auth/abstract/handler.rb +37 -0
- data/rack/auth/abstract/request.rb +37 -0
- data/rack/auth/basic.rb +58 -0
- data/rack/auth/digest/md5.rb +124 -0
- data/rack/auth/digest/nonce.rb +51 -0
- data/rack/auth/digest/params.rb +55 -0
- data/rack/auth/digest/request.rb +40 -0
- data/rack/builder.rb +80 -0
- data/rack/cascade.rb +41 -0
- data/rack/chunked.rb +49 -0
- data/rack/commonlogger.rb +49 -0
- data/rack/conditionalget.rb +47 -0
- data/rack/config.rb +15 -0
- data/rack/content_length.rb +29 -0
- data/rack/content_type.rb +23 -0
- data/rack/deflater.rb +96 -0
- data/rack/directory.rb +157 -0
- data/rack/etag.rb +32 -0
- data/rack/file.rb +92 -0
- data/rack/handler/cgi.rb +62 -0
- data/rack/handler/evented_mongrel.rb +8 -0
- data/rack/handler/fastcgi.rb +89 -0
- data/rack/handler/lsws.rb +63 -0
- data/rack/handler/mongrel.rb +90 -0
- data/rack/handler/scgi.rb +59 -0
- data/rack/handler/swiftiplied_mongrel.rb +8 -0
- data/rack/handler/thin.rb +18 -0
- data/rack/handler/webrick.rb +73 -0
- data/rack/handler.rb +88 -0
- data/rack/head.rb +19 -0
- data/rack/lint.rb +567 -0
- data/rack/lobster.rb +65 -0
- data/rack/lock.rb +16 -0
- data/rack/logger.rb +20 -0
- data/rack/methodoverride.rb +27 -0
- data/rack/mime.rb +208 -0
- data/rack/mock.rb +190 -0
- data/rack/nulllogger.rb +18 -0
- data/rack/recursive.rb +61 -0
- data/rack/reloader.rb +109 -0
- data/rack/request.rb +273 -0
- data/rack/response.rb +150 -0
- data/rack/rewindable_input.rb +103 -0
- data/rack/runtime.rb +27 -0
- data/rack/sendfile.rb +144 -0
- data/rack/server.rb +271 -0
- data/rack/session/abstract/id.rb +140 -0
- data/rack/session/cookie.rb +90 -0
- data/rack/session/memcache.rb +119 -0
- data/rack/session/pool.rb +100 -0
- data/rack/showexceptions.rb +349 -0
- data/rack/showstatus.rb +106 -0
- data/rack/static.rb +38 -0
- data/rack/urlmap.rb +55 -0
- data/rack/utils.rb +662 -0
- data/rack.rb +81 -0
- data/route.rb +231 -0
- data/sendmail.rb +222 -0
- data/sequel_helper.rb +20 -0
- data/session.rb +132 -0
- data/stringify_hash.rb +63 -0
- data/support.rb +35 -0
- data/template.rb +287 -0
- data/test/french.html +13 -0
- data/test/french_msg.html +3 -0
- data/test/m17n.txt +30 -0
- data/test/mobile.html +15 -0
- data/test/setup.rb +8 -0
- data/test/static/test.txt +1 -0
- data/test/template.html +58 -0
- data/test/template_inner.html +1 -0
- data/test/template_innerparam.html +1 -0
- data/test/test_auth.rb +43 -0
- data/test/test_blank.rb +44 -0
- data/test/test_csrf.rb +87 -0
- data/test/test_errorconsole.rb +91 -0
- data/test/test_handler.rb +155 -0
- data/test/test_helper.rb +296 -0
- data/test/test_keitai.rb +107 -0
- data/test/test_m17n.rb +129 -0
- data/test/test_route.rb +192 -0
- data/test/test_sendmail.rb +146 -0
- data/test/test_session.rb +83 -0
- data/test/test_stringify_hash.rb +67 -0
- data/test/test_template.rb +114 -0
- data/test.bat +2 -0
- metadata +240 -0
data/stringify_hash.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# used with http parameters
|
2
|
+
# simpler version of HashWithIndifferentAccess of Ruby on Rails
|
3
|
+
|
4
|
+
module Egalite
|
5
|
+
class StringifyHash < Hash
|
6
|
+
def self.create(values)
|
7
|
+
hash = self.new
|
8
|
+
hash.update(values)
|
9
|
+
hash
|
10
|
+
end
|
11
|
+
def [](k)
|
12
|
+
super(stringify(k))
|
13
|
+
end
|
14
|
+
def []=(k,v)
|
15
|
+
super(stringify(k),v)
|
16
|
+
end
|
17
|
+
def update(hash)
|
18
|
+
newhash = {}
|
19
|
+
hash.each { |k,v|
|
20
|
+
newhash[stringify(k)] = v
|
21
|
+
}
|
22
|
+
super(newhash)
|
23
|
+
end
|
24
|
+
alias_method :merge!, :update
|
25
|
+
|
26
|
+
def key?(key)
|
27
|
+
super(stringify(key))
|
28
|
+
end
|
29
|
+
|
30
|
+
alias_method :include?, :key?
|
31
|
+
alias_method :has_key?, :key?
|
32
|
+
alias_method :member?, :key?
|
33
|
+
|
34
|
+
def fetch(key, *extras)
|
35
|
+
super(stringify(key), *extras)
|
36
|
+
end
|
37
|
+
|
38
|
+
def values_at(*indices)
|
39
|
+
indices.collect {|key| self[key]}
|
40
|
+
end
|
41
|
+
|
42
|
+
def dup
|
43
|
+
StringifyHash.create(self)
|
44
|
+
end
|
45
|
+
|
46
|
+
def merge(hash)
|
47
|
+
dup.update(hash)
|
48
|
+
end
|
49
|
+
|
50
|
+
def delete(key)
|
51
|
+
super(stringify(key))
|
52
|
+
end
|
53
|
+
|
54
|
+
# Convert to a Hash with String keys.
|
55
|
+
def to_hash
|
56
|
+
Hash.new(default).merge(self)
|
57
|
+
end
|
58
|
+
private
|
59
|
+
def stringify(key)
|
60
|
+
key.kind_of?(Symbol) ? key.to_s : key
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
data/support.rb
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# Egalite support methods
|
2
|
+
|
3
|
+
class Hash
|
4
|
+
def <<(b)
|
5
|
+
merge(b.to_hash)
|
6
|
+
end
|
7
|
+
def >>(b)
|
8
|
+
b.to_hash.merge(self)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class NilClass #:nodoc:
|
13
|
+
def size
|
14
|
+
0
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
# <<from ActiveSupport library of Ruby on Rails>>
|
19
|
+
# (MIT License)
|
20
|
+
|
21
|
+
# Tries to send the method only if object responds to it. Return +nil+ otherwise.
|
22
|
+
#
|
23
|
+
# ==== Example :
|
24
|
+
#
|
25
|
+
# # Without try
|
26
|
+
# @person ? @person.name : nil
|
27
|
+
#
|
28
|
+
# With try
|
29
|
+
# @person.try(:name)
|
30
|
+
class Object
|
31
|
+
def try(method)
|
32
|
+
send(method) if respond_to?(method, true)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
data/template.rb
ADDED
@@ -0,0 +1,287 @@
|
|
1
|
+
require 'jcode'
|
2
|
+
|
3
|
+
module Egalite
|
4
|
+
|
5
|
+
class NonEscapeString < String
|
6
|
+
def +(b)
|
7
|
+
NonEscapeString.new(super(HTMLTagBuilder.escape_html(b)))
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
class HTMLTemplate
|
12
|
+
RE_NEST = /<(group|if|unless)\s+name=['"](.+?)['"]>/i
|
13
|
+
RE_ENDNEST = /<\/(group|if|unless)>/i
|
14
|
+
RE_PLACE = /&=([.-_0-9a-zA-Z]+?);/
|
15
|
+
RE_INPUT = /<input\s+(.+?)>/im
|
16
|
+
RE_SELECT = /<select\s+name\s*=\s*['"](.+?)['"](.*?)>\s*<\/select>/im
|
17
|
+
|
18
|
+
RE_A = /<a\s+(.+?)>/im
|
19
|
+
RE_FORM = /<form\s+(.+?)>/im
|
20
|
+
|
21
|
+
RE_INCLUDE = /<include\s+(.+?)\/>/i
|
22
|
+
RE_PARENT = /<parent\s+name=['"](.+?)['"]\s*\/>/i
|
23
|
+
RE_YIELD = /<yield\/>/i
|
24
|
+
|
25
|
+
attr_accessor :controller, :default_escape
|
26
|
+
|
27
|
+
def initialize
|
28
|
+
@default_escape = true
|
29
|
+
@controller = nil
|
30
|
+
end
|
31
|
+
|
32
|
+
private
|
33
|
+
|
34
|
+
def parse_tag_attributes(attrs)
|
35
|
+
a = attrs.split(/(\:?\w+(!:[^=])|\:?\w+=(?:'[^']+'|"[^"]+"|\S+))\s*/)
|
36
|
+
a = a.select { |s| s != "" }
|
37
|
+
hash = {}
|
38
|
+
a.each { |s|
|
39
|
+
b = s.split('=',2)
|
40
|
+
b[0].sub!(/\s$/,'')
|
41
|
+
b[1] = b[1][1..-2] if b[1] and (b[1][0,1] == '"' or b[1][0,1] == "'")
|
42
|
+
hash[b[0]] = b[1] || true
|
43
|
+
}
|
44
|
+
hash
|
45
|
+
end
|
46
|
+
def attr_colon(attrs)
|
47
|
+
colons = {}
|
48
|
+
attrs.each { |k,v| colons[k[1..-1]] = v if k =~ /^\:/ }
|
49
|
+
str = attrs.select { |k,v| k !~ /^\:/ }.map { |k,v| "#{k}='#{v}'" }.join(' ')
|
50
|
+
[colons, str]
|
51
|
+
end
|
52
|
+
|
53
|
+
def dotchain(values, name)
|
54
|
+
dots = name.split('.').select {|s| not s.empty? }
|
55
|
+
|
56
|
+
value = values
|
57
|
+
dots.each { |key|
|
58
|
+
value = if not value.is_a?(Hash) and value.respond_to?(key)
|
59
|
+
value.send(key)
|
60
|
+
elsif value.respond_to?(:[])
|
61
|
+
value[key] || value[key.to_sym]
|
62
|
+
end
|
63
|
+
break unless value
|
64
|
+
}
|
65
|
+
value
|
66
|
+
end
|
67
|
+
|
68
|
+
#
|
69
|
+
# tags
|
70
|
+
#
|
71
|
+
def placeholder(html, params)
|
72
|
+
html.gsub!(RE_PLACE) {
|
73
|
+
key = $1
|
74
|
+
if params[key].is_a?(NonEscapeString) or not @default_escape
|
75
|
+
params[key]
|
76
|
+
else
|
77
|
+
escapeHTML(params[key])
|
78
|
+
end
|
79
|
+
}
|
80
|
+
end
|
81
|
+
def input_tag(html, params)
|
82
|
+
html.gsub!(RE_INPUT) { |s|
|
83
|
+
attrs = parse_tag_attributes($1)
|
84
|
+
next s if attrs['checked'] or attrs['selected']
|
85
|
+
name = attrs['name']
|
86
|
+
next s unless name
|
87
|
+
case attrs['type']
|
88
|
+
when 'text'
|
89
|
+
next s if attrs['value']
|
90
|
+
s.sub!(/\/?>$/," value='"+escapeHTML(params[name])+"'/>") if params[name]
|
91
|
+
when 'hidden'
|
92
|
+
next s if attrs['value']
|
93
|
+
s.sub!(/\/?>$/," value='"+escapeHTML(params[name])+"'/>") if params[name]
|
94
|
+
when 'radio'
|
95
|
+
s.sub!(/\/?>$/," checked/>") if (params[name].to_s == attrs['value'])
|
96
|
+
when 'checkbox'
|
97
|
+
s.sub!(/\/?>$/," checked/>") if params[name]
|
98
|
+
end
|
99
|
+
s
|
100
|
+
}
|
101
|
+
end
|
102
|
+
def a_tag(html, params)
|
103
|
+
html.gsub!(RE_A) { |s|
|
104
|
+
attrs = parse_tag_attributes($1)
|
105
|
+
next s if attrs['href']
|
106
|
+
next s unless @controller
|
107
|
+
|
108
|
+
(colons, noncolons) = attr_colon(attrs)
|
109
|
+
next s if colons.empty?
|
110
|
+
# when :hoge=$foo, expand hash parameter ['foo']
|
111
|
+
colons.each { |k,v|
|
112
|
+
next if v[0,1] != '$'
|
113
|
+
val = params[v[1..-1]]
|
114
|
+
colons[k] = val
|
115
|
+
}
|
116
|
+
colons = StringifyHash.create(colons)
|
117
|
+
link = @controller.url_for(colons)
|
118
|
+
"<a href='#{link}' #{noncolons}>"
|
119
|
+
}
|
120
|
+
end
|
121
|
+
def form_tag(html,params)
|
122
|
+
html.gsub!(RE_FORM) { |s|
|
123
|
+
attrs = parse_tag_attributes($1)
|
124
|
+
next s if attrs['action']
|
125
|
+
next s unless @controller
|
126
|
+
|
127
|
+
(colons, noncolons) = attr_colon(attrs)
|
128
|
+
next s if colons.empty?
|
129
|
+
colons = StringifyHash.create(colons)
|
130
|
+
link = @controller.url_for(colons)
|
131
|
+
"<form action='#{link}' #{noncolons}>"
|
132
|
+
}
|
133
|
+
end
|
134
|
+
def select_tag(html,params)
|
135
|
+
html.gsub!(RE_SELECT) { sel = "<select name='#$1'#$2>"
|
136
|
+
if (params[$1] and params[$1].is_a?(Array))
|
137
|
+
params[$1].each_index() { |key|
|
138
|
+
next if (key == 0)
|
139
|
+
selected = " selected" if params[$1][0] == key
|
140
|
+
value = params[$1][key]
|
141
|
+
sel << "<option value='#{key}'#{selected}>"
|
142
|
+
sel << escapeHTML(value)
|
143
|
+
sel << "</option>" unless @keitai
|
144
|
+
}
|
145
|
+
end
|
146
|
+
sel << "</select>"
|
147
|
+
}
|
148
|
+
end
|
149
|
+
|
150
|
+
#
|
151
|
+
# main routines
|
152
|
+
#
|
153
|
+
|
154
|
+
def nonnestedtags(html, params)
|
155
|
+
placeholder(html,params)
|
156
|
+
input_tag(html,params)
|
157
|
+
a_tag(html,params)
|
158
|
+
form_tag(html,params)
|
159
|
+
select_tag(html,params)
|
160
|
+
|
161
|
+
# parse include tag
|
162
|
+
if block_given?
|
163
|
+
html.gsub!(RE_INCLUDE) {
|
164
|
+
attrs = parse_tag_attributes($1)
|
165
|
+
attrs.each { |k,v| attrs[k[1..-1]] = v if k =~ /^\:/ }
|
166
|
+
yield(attrs)
|
167
|
+
}
|
168
|
+
parent = nil
|
169
|
+
md = RE_PARENT.match(html)
|
170
|
+
parent = md[1] if md
|
171
|
+
html.gsub!(RE_PARENT,"")
|
172
|
+
if parent
|
173
|
+
txt = yield(parent)
|
174
|
+
txt.gsub!(RE_YIELD, html)
|
175
|
+
html = txt
|
176
|
+
end
|
177
|
+
end
|
178
|
+
html
|
179
|
+
end
|
180
|
+
|
181
|
+
def keyexpander(params, parent_params)
|
182
|
+
lambda { |k|
|
183
|
+
if k[0,1] == '.'
|
184
|
+
dotchain(params, k)
|
185
|
+
else
|
186
|
+
if params[k] == nil
|
187
|
+
if params[k.to_sym] == nil
|
188
|
+
parent_params[k]
|
189
|
+
else
|
190
|
+
params[k.to_sym]
|
191
|
+
end
|
192
|
+
else
|
193
|
+
params[k]
|
194
|
+
end
|
195
|
+
end
|
196
|
+
}
|
197
|
+
end
|
198
|
+
|
199
|
+
def string_after_outermost_closetag(html)
|
200
|
+
while md1 = RE_NEST.match(html)
|
201
|
+
break if (RE_ENDNEST.match(md1.pre_match))
|
202
|
+
html = string_after_outermost_closetag(md1.post_match)
|
203
|
+
end
|
204
|
+
RE_ENDNEST.match(html).post_match
|
205
|
+
end
|
206
|
+
|
207
|
+
public
|
208
|
+
|
209
|
+
def escapeHTML(s)
|
210
|
+
s.to_s.gsub(/&/n, '&').gsub(/'/n,''').gsub(/\"/n, '"').gsub(/>/n, '>').gsub(/</n, '<')
|
211
|
+
end
|
212
|
+
|
213
|
+
def handleTemplate(html, orig_values, parent_params={}, &block)
|
214
|
+
params = keyexpander(orig_values, parent_params)
|
215
|
+
|
216
|
+
# parse group tag and recurse inner loop
|
217
|
+
while md1 = RE_NEST.match(html) # beware: complicated....
|
218
|
+
# break if it is innermost loop.
|
219
|
+
break if (RE_ENDNEST.match(md1.pre_match))
|
220
|
+
|
221
|
+
# obtain a length of outermost group tag.
|
222
|
+
post = string_after_outermost_closetag(md1.post_match)
|
223
|
+
|
224
|
+
tag = md1[1]
|
225
|
+
key = md1[2]
|
226
|
+
|
227
|
+
# recursive-call for each element of array
|
228
|
+
innertext = ""
|
229
|
+
case tag.downcase
|
230
|
+
when 'group'
|
231
|
+
groupval = params[key]
|
232
|
+
groupval = [] if (groupval == nil)
|
233
|
+
groupval = [groupval] unless (groupval.is_a?(Array))
|
234
|
+
groupval.each { |v|
|
235
|
+
innertext << handleTemplate(md1.post_match, v, params)
|
236
|
+
}
|
237
|
+
when 'if'
|
238
|
+
unless params[key].blank?
|
239
|
+
innertext << handleTemplate(md1.post_match, orig_values, parent_params)
|
240
|
+
end
|
241
|
+
when 'unless'
|
242
|
+
if params[key].blank?
|
243
|
+
innertext << handleTemplate(md1.post_match, orig_values, parent_params)
|
244
|
+
end
|
245
|
+
else
|
246
|
+
raise
|
247
|
+
end
|
248
|
+
# replace this group tag
|
249
|
+
html[md1.begin(0)..-(post.size+1)] = innertext
|
250
|
+
end
|
251
|
+
# cutoff after end tag, in inner-most loop.
|
252
|
+
md1 = RE_ENDNEST.match(html)
|
253
|
+
html = md1.pre_match if (md1)
|
254
|
+
|
255
|
+
nonnestedtags(html, params, &block)
|
256
|
+
end
|
257
|
+
end
|
258
|
+
|
259
|
+
class CSRFTemplate < HTMLTemplate
|
260
|
+
RE_FORM = /<form\s+([^>]+?)>(?!\s*<input type='hidden' name='csrf')/im
|
261
|
+
|
262
|
+
def form_tag(html,params)
|
263
|
+
html.gsub!(RE_FORM) { |s|
|
264
|
+
formtag = s
|
265
|
+
attrs = parse_tag_attributes($1)
|
266
|
+
csrf = nil
|
267
|
+
if attrs[":nocsrf"]
|
268
|
+
attrs.delete(":nocsrf")
|
269
|
+
elsif attrs["method"] =~ /\APOST\Z/i
|
270
|
+
csrf = params["csrf"]
|
271
|
+
csrf = "<input type='hidden' name='csrf' value='#{escapeHTML(csrf)}'/>"
|
272
|
+
end
|
273
|
+
|
274
|
+
if (not attrs['action']) and @controller
|
275
|
+
(colons, noncolons) = attr_colon(attrs)
|
276
|
+
unless colons.empty?
|
277
|
+
colons = StringifyHash.create(colons)
|
278
|
+
link = @controller.url_for(colons)
|
279
|
+
formtag = "<form action='#{link}' #{noncolons}>"
|
280
|
+
end
|
281
|
+
end
|
282
|
+
"#{formtag}#{csrf}"
|
283
|
+
}
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
end # end module
|
data/test/french.html
ADDED
data/test/m17n.txt
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
{{languages en, fr}}
|
2
|
+
{{system_default en}}
|
3
|
+
{{english_name en, English}}
|
4
|
+
{{native_name en, English}}
|
5
|
+
{{english_name fr, French}}
|
6
|
+
{{native_name fr, Francais}}
|
7
|
+
{{aliases fr, zh-hans,zh-cn,zh-hans-cn}}
|
8
|
+
####
|
9
|
+
html french.html
|
10
|
+
|
11
|
+
Product Name Nom de Produit
|
12
|
+
Price Prix
|
13
|
+
####
|
14
|
+
msg FrenchController#get
|
15
|
+
|
16
|
+
Do you speak English? Parlez vous Francais?
|
17
|
+
####
|
18
|
+
msg FrenchController#dlg
|
19
|
+
|
20
|
+
I am an English man. Je suis un Francais.
|
21
|
+
|
22
|
+
####
|
23
|
+
msg FrenchController#placeholder
|
24
|
+
|
25
|
+
Hoge {0}. {0} Piyo.
|
26
|
+
|
27
|
+
####
|
28
|
+
img french.html
|
29
|
+
|
30
|
+
/hoge/itembtn1.jpg
|
data/test/mobile.html
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
<html>
|
2
|
+
<body>
|
3
|
+
<a :action='get_userid'>hoge</a>
|
4
|
+
|
5
|
+
<a href='http://www.yahoo.com'>yahoo</a>
|
6
|
+
|
7
|
+
<a href='mailto:arai@example.com'>mail</a>
|
8
|
+
|
9
|
+
<a href='tel:03-1234-5678'>tel</a>
|
10
|
+
|
11
|
+
<form :action='bar' method='GET'>
|
12
|
+
hoge
|
13
|
+
</form>
|
14
|
+
</body>
|
15
|
+
</html>
|
data/test/setup.rb
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
piyo
|
data/test/template.html
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
<html>
|
2
|
+
<body>
|
3
|
+
value:&=val;<br/>
|
4
|
+
|
5
|
+
<group name='array'>
|
6
|
+
group1-1: &=val;
|
7
|
+
<if name='true'>
|
8
|
+
<unless name='false'>
|
9
|
+
<group name='array2'>
|
10
|
+
group2: &=val;
|
11
|
+
</group>
|
12
|
+
</unless>
|
13
|
+
</if>
|
14
|
+
<group name='array3'>
|
15
|
+
group3-1: &=val;
|
16
|
+
<group name='array4'>
|
17
|
+
group4: &=val;
|
18
|
+
</group>
|
19
|
+
group3-2: &=val;
|
20
|
+
</group>
|
21
|
+
group1-2: &=val;
|
22
|
+
</group>
|
23
|
+
|
24
|
+
<if name='true'>
|
25
|
+
iftrue
|
26
|
+
</if>
|
27
|
+
<if name='false'>
|
28
|
+
iffalse
|
29
|
+
</if>
|
30
|
+
<unless name='true'>
|
31
|
+
unlesstrue
|
32
|
+
</unless>
|
33
|
+
<unless name='false'>
|
34
|
+
unlessfalse
|
35
|
+
</unless>
|
36
|
+
|
37
|
+
<if name='true'>
|
38
|
+
<unless name='false'>
|
39
|
+
<if name='true'>
|
40
|
+
nestedif
|
41
|
+
</if>
|
42
|
+
</unless>
|
43
|
+
</if>
|
44
|
+
|
45
|
+
<a :controller='foo' :action='bar' :id='1' :hoge='piyo'>link</a>
|
46
|
+
|
47
|
+
<form :controller='foo' :action='bar' :id='1' :hoge='piyo' method='post'>
|
48
|
+
<input type='text' name='text'/>
|
49
|
+
</form>
|
50
|
+
|
51
|
+
<include action='inner' />
|
52
|
+
|
53
|
+
<include :action='innerparam' :id='9' :usagi='hiyoko' />
|
54
|
+
|
55
|
+
<include :action='innerdelegate' />
|
56
|
+
|
57
|
+
</body>
|
58
|
+
</html>
|
@@ -0,0 +1 @@
|
|
1
|
+
&=innervalue;
|
@@ -0,0 +1 @@
|
|
1
|
+
&=innervalue;
|
data/test/test_auth.rb
ADDED
@@ -0,0 +1,43 @@
|
|
1
|
+
$LOAD_PATH << File.dirname(__FILE__)
|
2
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '..')
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'test/unit'
|
6
|
+
require 'egalite'
|
7
|
+
require 'auth/basic'
|
8
|
+
|
9
|
+
require 'rack/test'
|
10
|
+
|
11
|
+
require 'setup'
|
12
|
+
|
13
|
+
class AuthtestController < Egalite::Controller
|
14
|
+
def before_filter
|
15
|
+
Egalite::Auth::Basic.authorize(req, 'authtest') { |username,password|
|
16
|
+
username == 'testing' and password == '1234'
|
17
|
+
}
|
18
|
+
end
|
19
|
+
def test
|
20
|
+
'okay'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class T_Auth < Test::Unit::TestCase
|
25
|
+
include Rack::Test::Methods
|
26
|
+
|
27
|
+
def app
|
28
|
+
Egalite::Handler.new
|
29
|
+
end
|
30
|
+
def test_auth_failure
|
31
|
+
get "/authtest/test"
|
32
|
+
assert_equal last_response.status, 401
|
33
|
+
assert_equal last_response.headers['WWW-Authenticate'], 'Basic realm="authtest"'
|
34
|
+
basic_authorize('testing','9999')
|
35
|
+
get "/authtest/test"
|
36
|
+
assert_equal last_response.status, 401
|
37
|
+
assert_equal last_response.headers['WWW-Authenticate'], 'Basic realm="authtest"'
|
38
|
+
basic_authorize('testing','1234')
|
39
|
+
get "/authtest/test"
|
40
|
+
assert last_response.ok?
|
41
|
+
assert_equal last_response.body,'okay'
|
42
|
+
end
|
43
|
+
end
|
data/test/test_blank.rb
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '..')
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'blank'
|
5
|
+
|
6
|
+
class Empty
|
7
|
+
def empty?
|
8
|
+
true
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class T_Blank < Test::Unit::TestCase
|
13
|
+
def test_nil
|
14
|
+
assert nil.blank?
|
15
|
+
end
|
16
|
+
def test_false
|
17
|
+
assert false.blank?
|
18
|
+
end
|
19
|
+
def test_true
|
20
|
+
assert(true.blank? == false)
|
21
|
+
end
|
22
|
+
def test_array
|
23
|
+
assert [].blank?
|
24
|
+
assert([1,2,3].blank? == false)
|
25
|
+
end
|
26
|
+
def test_hash
|
27
|
+
assert({}.blank?)
|
28
|
+
assert({:foo => 1}.blank? == false)
|
29
|
+
end
|
30
|
+
def test_empty
|
31
|
+
assert Empty.new.blank?
|
32
|
+
end
|
33
|
+
def test_string
|
34
|
+
assert "".blank?
|
35
|
+
assert " \t\n".blank?
|
36
|
+
assert("hoge".blank? == false)
|
37
|
+
end
|
38
|
+
def test_numeric
|
39
|
+
assert(123.blank? == false)
|
40
|
+
end
|
41
|
+
def test_object
|
42
|
+
assert(:foo.blank? == false)
|
43
|
+
end
|
44
|
+
end
|
data/test/test_csrf.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
$LOAD_PATH << File.join(File.dirname(__FILE__), '..')
|
2
|
+
|
3
|
+
require 'rubygems'
|
4
|
+
require 'test/unit'
|
5
|
+
require 'egalite'
|
6
|
+
|
7
|
+
require 'rack/test'
|
8
|
+
|
9
|
+
require 'setup'
|
10
|
+
|
11
|
+
class CsrftemplateController < Egalite::CSRFController
|
12
|
+
def get
|
13
|
+
@template_file = 'template.html'
|
14
|
+
session.create(:user_id => 1)
|
15
|
+
{
|
16
|
+
:val => 'piyo',
|
17
|
+
:true => true,
|
18
|
+
:false => false,
|
19
|
+
:array => [
|
20
|
+
{:val => 1,
|
21
|
+
:true => true,
|
22
|
+
:array2 => [{:val => 2}],
|
23
|
+
:array3 => [{:val => 3, :array4 => [{:val => 41},{:val => 42}]
|
24
|
+
}]
|
25
|
+
},
|
26
|
+
{:val => 12}
|
27
|
+
]
|
28
|
+
}
|
29
|
+
end
|
30
|
+
def inner
|
31
|
+
@template_file = 'template_inner.html'
|
32
|
+
{ :innervalue => 'mogura' }
|
33
|
+
end
|
34
|
+
def innerparam(id)
|
35
|
+
@template_file = 'template_innerparam.html'
|
36
|
+
{ :innervalue => "inner:#{id}_#{params[:usagi]}" }
|
37
|
+
end
|
38
|
+
def innerdelegate
|
39
|
+
delegate :action => :innerparam, :id => 5, :usagi => :kirin
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class T_CSRFTemplate < Test::Unit::TestCase
|
44
|
+
include Rack::Test::Methods
|
45
|
+
|
46
|
+
def app
|
47
|
+
db = Sequel.sqlite
|
48
|
+
Egalite::SessionSequel.create_table(db)
|
49
|
+
db.alter_table :sessions do
|
50
|
+
add_column :user_id, :integer
|
51
|
+
end
|
52
|
+
Egalite::Handler.new(
|
53
|
+
:db => db,
|
54
|
+
:session_handler => Egalite::SessionSequel,
|
55
|
+
:template_path => File.dirname(__FILE__),
|
56
|
+
:template_engine => Egalite::CSRFTemplate
|
57
|
+
)
|
58
|
+
end
|
59
|
+
def test_template
|
60
|
+
get "/csrftemplate"
|
61
|
+
assert last_response.ok?
|
62
|
+
assert last_response.body =~ /value:piyo/
|
63
|
+
assert last_response.body =~ /nestedif/
|
64
|
+
assert last_response.body =~ /iftrue/
|
65
|
+
assert last_response.body !~ /iffalse/
|
66
|
+
assert last_response.body !~ /unlesstrue/
|
67
|
+
assert last_response.body =~ /unlessfalse/
|
68
|
+
assert last_response.body =~ %r|<a\s+href='/foo/bar/1\?hoge=piyo'\s*>|
|
69
|
+
assert last_response.body =~ %r|<form action='/foo/bar/1\?hoge=piyo'\s+method='post'\s*><input type='hidden' name='csrf' value='[0-9]+_[0-9a-f]+'/>|
|
70
|
+
assert last_response.body =~ /mogura/
|
71
|
+
assert last_response.body =~ /inner:9_hiyoko/
|
72
|
+
assert last_response.body =~ /inner:5_kirin/
|
73
|
+
end
|
74
|
+
def test_grouptag
|
75
|
+
get "/csrftemplate"
|
76
|
+
assert last_response.body =~ /group1-1: 1/
|
77
|
+
assert last_response.body =~ /group1-2: 1/
|
78
|
+
assert last_response.body =~ /group1-1: 12/
|
79
|
+
assert last_response.body =~ /group1-2: 12/
|
80
|
+
assert last_response.body =~ /group2: 2/
|
81
|
+
assert last_response.body =~ /group3-1: 3/
|
82
|
+
assert last_response.body =~ /group3-2: 3/
|
83
|
+
assert last_response.body =~ /group4: 41/
|
84
|
+
assert last_response.body =~ /group4: 42/
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|