raw 0.49.0
Sign up to get free protection for your applications and to get access to all the features.
- data/doc/CONTRIBUTORS +106 -0
- data/doc/LICENSE +32 -0
- data/doc/coding_conventions.txt +11 -0
- data/lib/raw.rb +42 -0
- data/lib/raw/adapter.rb +113 -0
- data/lib/raw/adapter/cgi.rb +41 -0
- data/lib/raw/adapter/fastcgi.rb +48 -0
- data/lib/raw/adapter/mongrel.rb +146 -0
- data/lib/raw/adapter/script.rb +94 -0
- data/lib/raw/adapter/webrick.rb +144 -0
- data/lib/raw/adapter/webrick/vcr.rb +91 -0
- data/lib/raw/cgi.rb +323 -0
- data/lib/raw/cgi/cookie.rb +47 -0
- data/lib/raw/cgi/http.rb +62 -0
- data/lib/raw/compiler.rb +138 -0
- data/lib/raw/compiler/filter/cleanup.rb +21 -0
- data/lib/raw/compiler/filter/elements.rb +166 -0
- data/lib/raw/compiler/filter/elements/element.rb +210 -0
- data/lib/raw/compiler/filter/localization.rb +23 -0
- data/lib/raw/compiler/filter/markup.rb +32 -0
- data/lib/raw/compiler/filter/morph.rb +123 -0
- data/lib/raw/compiler/filter/morph/each.rb +34 -0
- data/lib/raw/compiler/filter/morph/for.rb +11 -0
- data/lib/raw/compiler/filter/morph/if.rb +26 -0
- data/lib/raw/compiler/filter/morph/selected_if.rb +43 -0
- data/lib/raw/compiler/filter/morph/standard.rb +55 -0
- data/lib/raw/compiler/filter/morph/times.rb +27 -0
- data/lib/raw/compiler/filter/script.rb +116 -0
- data/lib/raw/compiler/filter/squeeze.rb +16 -0
- data/lib/raw/compiler/filter/static_include.rb +74 -0
- data/lib/raw/compiler/filter/template.rb +121 -0
- data/lib/raw/compiler/reloader.rb +96 -0
- data/lib/raw/context.rb +154 -0
- data/lib/raw/context/flash.rb +157 -0
- data/lib/raw/context/global.rb +88 -0
- data/lib/raw/context/request.rb +338 -0
- data/lib/raw/context/response.rb +57 -0
- data/lib/raw/context/session.rb +198 -0
- data/lib/raw/context/session/drb.rb +11 -0
- data/lib/raw/context/session/file.rb +15 -0
- data/lib/raw/context/session/memcached.rb +13 -0
- data/lib/raw/context/session/memory.rb +12 -0
- data/lib/raw/context/session/og.rb +15 -0
- data/lib/raw/context/session/pstore.rb +13 -0
- data/lib/raw/control.rb +18 -0
- data/lib/raw/control/attribute.rb +91 -0
- data/lib/raw/control/attribute/checkbox.rb +25 -0
- data/lib/raw/control/attribute/datetime.rb +21 -0
- data/lib/raw/control/attribute/file.rb +20 -0
- data/lib/raw/control/attribute/fixnum.rb +26 -0
- data/lib/raw/control/attribute/float.rb +26 -0
- data/lib/raw/control/attribute/options.rb +38 -0
- data/lib/raw/control/attribute/password.rb +16 -0
- data/lib/raw/control/attribute/text.rb +16 -0
- data/lib/raw/control/attribute/textarea.rb +16 -0
- data/lib/raw/control/none.rb +16 -0
- data/lib/raw/control/relation.rb +59 -0
- data/lib/raw/control/relation/belongs_to.rb +0 -0
- data/lib/raw/control/relation/has_many.rb +97 -0
- data/lib/raw/control/relation/joins_many.rb +0 -0
- data/lib/raw/control/relation/many_to_many.rb +0 -0
- data/lib/raw/control/relation/refers_to.rb +29 -0
- data/lib/raw/controller.rb +37 -0
- data/lib/raw/controller/publishable.rb +160 -0
- data/lib/raw/dispatcher.rb +209 -0
- data/lib/raw/dispatcher/format.rb +108 -0
- data/lib/raw/dispatcher/format/atom.rb +31 -0
- data/lib/raw/dispatcher/format/css.rb +0 -0
- data/lib/raw/dispatcher/format/html.rb +42 -0
- data/lib/raw/dispatcher/format/json.rb +31 -0
- data/lib/raw/dispatcher/format/rss.rb +33 -0
- data/lib/raw/dispatcher/format/xoxo.rb +31 -0
- data/lib/raw/dispatcher/mounter.rb +60 -0
- data/lib/raw/dispatcher/router.rb +111 -0
- data/lib/raw/errors.rb +19 -0
- data/lib/raw/helper.rb +86 -0
- data/lib/raw/helper/benchmark.rb +23 -0
- data/lib/raw/helper/buffer.rb +60 -0
- data/lib/raw/helper/cookie.rb +32 -0
- data/lib/raw/helper/debug.rb +28 -0
- data/lib/raw/helper/default.rb +16 -0
- data/lib/raw/helper/feed.rb +451 -0
- data/lib/raw/helper/form.rb +284 -0
- data/lib/raw/helper/javascript.rb +59 -0
- data/lib/raw/helper/layout.rb +40 -0
- data/lib/raw/helper/navigation.rb +87 -0
- data/lib/raw/helper/pager.rb +305 -0
- data/lib/raw/helper/table.rb +247 -0
- data/lib/raw/helper/xhtml.rb +218 -0
- data/lib/raw/helper/xml.rb +125 -0
- data/lib/raw/mixin/magick.rb +35 -0
- data/lib/raw/mixin/sweeper.rb +71 -0
- data/lib/raw/mixin/thumbnails.rb +1 -0
- data/lib/raw/mixin/webfile.rb +165 -0
- data/lib/raw/render.rb +271 -0
- data/lib/raw/render/builder.rb +26 -0
- data/lib/raw/render/caching.rb +81 -0
- data/lib/raw/render/call.rb +43 -0
- data/lib/raw/render/send_file.rb +46 -0
- data/lib/raw/render/stream.rb +39 -0
- data/lib/raw/scaffold.rb +13 -0
- data/lib/raw/scaffold/controller.rb +25 -0
- data/lib/raw/scaffold/model.rb +157 -0
- data/lib/raw/test.rb +5 -0
- data/lib/raw/test/assertions.rb +169 -0
- data/lib/raw/test/context.rb +55 -0
- data/lib/raw/test/testcase.rb +79 -0
- data/lib/raw/util/attr.rb +128 -0
- data/lib/raw/util/encode_uri.rb +149 -0
- data/lib/raw/util/html_filter.rb +538 -0
- data/lib/raw/util/markup.rb +130 -0
- data/test/glue/tc_webfile.rb +1 -0
- data/test/nitro/CONFIG.rb +3 -0
- data/test/nitro/adapter/raw_post1.bin +9 -0
- data/test/nitro/adapter/tc_webrick.rb +16 -0
- data/test/nitro/cgi/tc_cookie.rb +14 -0
- data/test/nitro/cgi/tc_request.rb +61 -0
- data/test/nitro/compiler/tc_client_morpher.rb +47 -0
- data/test/nitro/compiler/tc_compiler.rb +25 -0
- data/test/nitro/dispatcher/tc_mounter.rb +47 -0
- data/test/nitro/helper/tc_feed.rb +135 -0
- data/test/nitro/helper/tc_navbar.rb +74 -0
- data/test/nitro/helper/tc_pager.rb +35 -0
- data/test/nitro/helper/tc_table.rb +68 -0
- data/test/nitro/helper/tc_xhtml.rb +19 -0
- data/test/nitro/tc_caching.rb +19 -0
- data/test/nitro/tc_cgi.rb +222 -0
- data/test/nitro/tc_context.rb +17 -0
- data/test/nitro/tc_controller.rb +103 -0
- data/test/nitro/tc_controller_aspect.rb +32 -0
- data/test/nitro/tc_controller_params.rb +885 -0
- data/test/nitro/tc_dispatcher.rb +109 -0
- data/test/nitro/tc_element.rb +85 -0
- data/test/nitro/tc_flash.rb +59 -0
- data/test/nitro/tc_helper.rb +47 -0
- data/test/nitro/tc_render.rb +119 -0
- data/test/nitro/tc_router.rb +61 -0
- data/test/nitro/tc_server.rb +35 -0
- data/test/nitro/tc_session.rb +66 -0
- data/test/nitro/tc_template.rb +71 -0
- data/test/nitro/util/tc_encode_url.rb +87 -0
- data/test/nitro/util/tc_markup.rb +31 -0
- data/test/public/blog/another/very_litle/index.xhtml +1 -0
- data/test/public/blog/inc1.xhtml +2 -0
- data/test/public/blog/inc2.xhtml +1 -0
- data/test/public/blog/list.xhtml +9 -0
- data/test/public/dummy_mailer/registration.xhtml +5 -0
- metadata +244 -0
@@ -0,0 +1,16 @@
|
|
1
|
+
module Raw
|
2
|
+
|
3
|
+
# Compress HTML markup.
|
4
|
+
|
5
|
+
class SqueezeFilter
|
6
|
+
|
7
|
+
# Remove new lines. Typically used in live mode before the
|
8
|
+
# TemplateFilter.
|
9
|
+
|
10
|
+
def apply(source)
|
11
|
+
source.gsub(/^(\s*)/m, "").gsub(/\n/, "").gsub(/\t/, " ").squeeze(" ")
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module Raw
|
2
|
+
|
3
|
+
# Performs static includes. Typically you should include this
|
4
|
+
# compiler as the first stage of the compile pipeline.
|
5
|
+
#
|
6
|
+
# This compiler is extremely helpful, typically you would want
|
7
|
+
# to use static includes in many many cases.
|
8
|
+
|
9
|
+
class StaticIncludeFilter
|
10
|
+
|
11
|
+
# Statically include sub-template files.
|
12
|
+
# The target file is included at compile time.
|
13
|
+
# If the given path is relative, the template_root stack of
|
14
|
+
# the controller is traversed. If an absolute path is provided,
|
15
|
+
# templates are searched only in Template.root
|
16
|
+
#
|
17
|
+
# gmosx: must be xformed before the <?r pi.
|
18
|
+
#
|
19
|
+
# === Example
|
20
|
+
# <?include href="root/myfile.sx" ?>
|
21
|
+
|
22
|
+
def apply(text)
|
23
|
+
resolve_include(text)
|
24
|
+
end
|
25
|
+
|
26
|
+
def resolve_include_filename(href)
|
27
|
+
found = false
|
28
|
+
|
29
|
+
if href[0] == ?/
|
30
|
+
# Absolute path, search only in the application template
|
31
|
+
# root.
|
32
|
+
|
33
|
+
href = href[1, 999999] # hack!!
|
34
|
+
template_dir_stack = [ Template.root_dir ]
|
35
|
+
else
|
36
|
+
template_dir_stack = Controller.current.ann(:self, :template_dir_stack)
|
37
|
+
end
|
38
|
+
|
39
|
+
for dir in template_dir_stack
|
40
|
+
if File.exist?(filename = "#{dir}/#{href}")
|
41
|
+
found = true
|
42
|
+
break
|
43
|
+
end
|
44
|
+
|
45
|
+
if File.exist?(filename = "#{dir}/#{href}.inc")
|
46
|
+
found = true
|
47
|
+
break
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
raise "Cannot statically include '#{href}'" unless found
|
52
|
+
|
53
|
+
return filename
|
54
|
+
end
|
55
|
+
|
56
|
+
def resolve_include(text)
|
57
|
+
return text.gsub(/<\?include href=["|'](.*?)["|'](.*)\?>/) do |match|
|
58
|
+
filename = resolve_include_filename($1)
|
59
|
+
|
60
|
+
c = Context.current.application.compiler
|
61
|
+
c.templates = c.templates.push(filename).uniq
|
62
|
+
itext = File.read(filename)
|
63
|
+
|
64
|
+
itext.gsub!(/<\?xml.*\?>/, '')
|
65
|
+
|
66
|
+
# Recursively resolve to handle sub-includes.
|
67
|
+
|
68
|
+
resolve_include(itext)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
@@ -0,0 +1,121 @@
|
|
1
|
+
module Raw
|
2
|
+
|
3
|
+
# Nitro Template.
|
4
|
+
|
5
|
+
class Template
|
6
|
+
|
7
|
+
# The default template dir.
|
8
|
+
|
9
|
+
setting :root_dir, :default => File.expand_path("template"), :doc => "The default template dir"
|
10
|
+
|
11
|
+
# Strip xml comments from templates?
|
12
|
+
|
13
|
+
setting :strip_xml_comments, :default => false, :doc => "Strip xml comments from templates?"
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
# The basic Nitro Template filter.
|
18
|
+
|
19
|
+
class TemplateFilter
|
20
|
+
|
21
|
+
# Set some pretty safe delimiters for templates.
|
22
|
+
|
23
|
+
START_DELIM = "%{"
|
24
|
+
END_DELIM = "}\n"
|
25
|
+
|
26
|
+
# Convert a template to actual Ruby code, ready to be
|
27
|
+
# evaluated.
|
28
|
+
#
|
29
|
+
# [+source+]
|
30
|
+
# The template source as a String.
|
31
|
+
#
|
32
|
+
# [+buffer+]
|
33
|
+
# The variable to act as a buffer where the ruby code
|
34
|
+
# for this template will be generated. Passed as a
|
35
|
+
# String.
|
36
|
+
|
37
|
+
def apply(source, buffer = "@out")
|
38
|
+
source = source.dup
|
39
|
+
|
40
|
+
# Strip the xml header! (interracts with the following gsub!)
|
41
|
+
|
42
|
+
source.gsub!(/<\?xml.*\?>/, "")
|
43
|
+
|
44
|
+
# Transform include instructions <include href="xxx" />
|
45
|
+
# must be transformed before the processing instructions.
|
46
|
+
# Useful to include fragments cached on disk
|
47
|
+
#--
|
48
|
+
# gmosx, FIXME: NOT TESTED! test and add caching.
|
49
|
+
# add load_statically_included fixes.
|
50
|
+
#++
|
51
|
+
|
52
|
+
source.gsub!(/<include\s+href=["'](.*?)["']\s+\/>/, %[<?r File.read("\#{@dispatcher.root}/\\1") ?>])
|
53
|
+
|
54
|
+
# xform render/inject instructions <render href="xxx" />
|
55
|
+
# must be transformed before the processinc instructions.
|
56
|
+
|
57
|
+
source.gsub!(/<(?:render|inject)\s+href=["'](.*?)["']\s+\/>/, %[<?r render "\\1" ?>])
|
58
|
+
|
59
|
+
# Transform the processing instructions, use <?r as a marker.
|
60
|
+
|
61
|
+
source.gsub!(/<\?r\s+(.*?)\s+\?>/m) do |code|
|
62
|
+
"#{END_DELIM}#{$1.squeeze(' ').chomp}\n#{buffer} << #{START_DELIM}"
|
63
|
+
end
|
64
|
+
|
65
|
+
# Transform alternative code tags (very useful in xsl
|
66
|
+
# stylesheets).
|
67
|
+
|
68
|
+
source.gsub!(/<ruby>(.*?)<\/ruby>/m) do |code|
|
69
|
+
"#{END_DELIM}#{$1.squeeze(' ').chomp}\n#{buffer} << #{START_DELIM}"
|
70
|
+
end
|
71
|
+
|
72
|
+
# Also handle erb/asp/jsp style tags. Those tags *cannot*
|
73
|
+
# be used with an xslt stylesheet.
|
74
|
+
#
|
75
|
+
# Example:
|
76
|
+
#
|
77
|
+
# <% 10.times do %>
|
78
|
+
# Hello<br />
|
79
|
+
# <% end %>
|
80
|
+
|
81
|
+
source.gsub!(/<%(.*?)%>/m) do |code|
|
82
|
+
"#{END_DELIM}#{$1.squeeze(' ').chomp}\n#{buffer} << #{START_DELIM}"
|
83
|
+
end
|
84
|
+
|
85
|
+
# Alterative versions of interpolation (very useful in xsl
|
86
|
+
# stylesheets).
|
87
|
+
#
|
88
|
+
# Example:
|
89
|
+
#
|
90
|
+
# Here is #\my_val\
|
91
|
+
|
92
|
+
source.gsub!(/\#\\(.*?)\\/, '#{\1}')
|
93
|
+
|
94
|
+
# Alternative for entities (useful in xsl stylesheets).
|
95
|
+
#
|
96
|
+
# Examples:
|
97
|
+
#
|
98
|
+
# %nbsp;, %rquo;
|
99
|
+
|
100
|
+
source.gsub!(/%(#\d+|\w+);/, '&\1;')
|
101
|
+
|
102
|
+
# Compile time ruby code. This code is evaluated when
|
103
|
+
# compiling the template and the result injected directly
|
104
|
+
# into the result. Usefull for example to prevaluate
|
105
|
+
# localization. Just use the #[] marker instead of #{}.
|
106
|
+
#
|
107
|
+
# Example:
|
108
|
+
#
|
109
|
+
# This script was compiled at #[Time.now]
|
110
|
+
|
111
|
+
source.gsub!(/\#\[(.*?)\]/) do |match|
|
112
|
+
eval($1)
|
113
|
+
end
|
114
|
+
|
115
|
+
return "#{buffer} << #{START_DELIM}#{source}#{END_DELIM}"
|
116
|
+
end
|
117
|
+
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
module Raw
|
2
|
+
|
3
|
+
# Autoreload classes and templates. Mainly useful while
|
4
|
+
# debugging. Should be turned off in production servers to
|
5
|
+
# avoid the severe performance penalty.
|
6
|
+
|
7
|
+
class Reloader
|
8
|
+
|
9
|
+
def initialize(application)
|
10
|
+
@application = application
|
11
|
+
@mtimes = Hash.new(Time.now)
|
12
|
+
end
|
13
|
+
|
14
|
+
# Start the monitor thread. This thread monitors code and
|
15
|
+
# template files.
|
16
|
+
#--
|
17
|
+
# gmosx: the thread accesses the reloader variables through the
|
18
|
+
# closure.
|
19
|
+
#++
|
20
|
+
|
21
|
+
def start(interval)
|
22
|
+
@interval = interval
|
23
|
+
@thread = Thread.new do
|
24
|
+
begin
|
25
|
+
loop do
|
26
|
+
sleep(@interval)
|
27
|
+
|
28
|
+
dirty = false
|
29
|
+
|
30
|
+
# Check code files.
|
31
|
+
|
32
|
+
for feature in $LOADED_FEATURES
|
33
|
+
for path in $LOAD_PATH
|
34
|
+
file = File.join(path, feature)
|
35
|
+
if File.exist?(file) and is_dirty?(file)
|
36
|
+
begin
|
37
|
+
dirty = true
|
38
|
+
load(feature)
|
39
|
+
rescue Exception => ex
|
40
|
+
Logger.info ex.inspect
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
# Check template files.
|
47
|
+
|
48
|
+
for template in @application.compiler.templates
|
49
|
+
if is_dirty? template
|
50
|
+
dirty = true
|
51
|
+
break
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
reload_controllers() if dirty
|
56
|
+
end # loop
|
57
|
+
rescue => ex
|
58
|
+
Logger.info ex
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
# Stop the monitor thread.
|
64
|
+
|
65
|
+
def stop
|
66
|
+
@thread.exit
|
67
|
+
end
|
68
|
+
|
69
|
+
# Is a file modified on disk?
|
70
|
+
|
71
|
+
def is_dirty?(file)
|
72
|
+
if (mtime = File.stat(file).mtime) > @mtimes[file]
|
73
|
+
Logger.debug "File '#{file}' is modified" if $DBG
|
74
|
+
@mtimes[file] = mtime
|
75
|
+
return true
|
76
|
+
else
|
77
|
+
return false
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
# When a template is modified, remove all generated methods
|
82
|
+
# from the controllers.
|
83
|
+
|
84
|
+
def reload_controllers
|
85
|
+
controllers = @application.dispatcher.controllers.values
|
86
|
+
|
87
|
+
for c in controllers
|
88
|
+
for m in c.instance_methods.grep(/(___control$)|(___view$)/)
|
89
|
+
c.send(:remove_method, m) rescue nil
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
data/lib/raw/context.rb
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
require "facets/core/kernel/assign_with"
|
2
|
+
|
3
|
+
require "raw/cgi"
|
4
|
+
require "raw/context/request"
|
5
|
+
require "raw/context/response"
|
6
|
+
require "raw/context/global"
|
7
|
+
require "raw/context/session"
|
8
|
+
|
9
|
+
require "raw/util/attr"
|
10
|
+
|
11
|
+
module Raw
|
12
|
+
|
13
|
+
# Encapsulates an HTTP processing cycle context. Integrates the
|
14
|
+
# HTTP Request and the HTTP Response with Session, Global and
|
15
|
+
# Local variable stores.
|
16
|
+
#
|
17
|
+
# The Context object can be accessed by the context, request or
|
18
|
+
# response aliases. You can use the alias that makes sense
|
19
|
+
# every time. This means inside an action request, response and
|
20
|
+
# context all point to the same object.
|
21
|
+
|
22
|
+
class Context
|
23
|
+
include Request
|
24
|
+
include Response
|
25
|
+
|
26
|
+
# The application of this context. Contains configuration
|
27
|
+
# parameters.
|
28
|
+
|
29
|
+
attr_accessor :application
|
30
|
+
|
31
|
+
# The session contains variables that stay alive
|
32
|
+
# for the full user session. Session variables
|
33
|
+
# should be generally avoided. This variable
|
34
|
+
# becomes populated ONLY if needed.
|
35
|
+
|
36
|
+
attr_reader :session
|
37
|
+
|
38
|
+
# The rendering level. An action may include sub-actions,
|
39
|
+
# each time the action is called, the level is increased,
|
40
|
+
# when the action returns the level decreases. The first
|
41
|
+
# action, called top level action has a level of 1.
|
42
|
+
|
43
|
+
attr_accessor :level
|
44
|
+
|
45
|
+
# The resource representation format for this request.
|
46
|
+
|
47
|
+
attr_accessor :format
|
48
|
+
|
49
|
+
# The output buffer accumulates the generated output.
|
50
|
+
|
51
|
+
attr_accessor :output_buffer
|
52
|
+
|
53
|
+
def initialize(application)
|
54
|
+
@level = 0
|
55
|
+
@application = application
|
56
|
+
@post_params = {}
|
57
|
+
@get_params = {}
|
58
|
+
@response_headers = {}
|
59
|
+
@output_buffer = ""
|
60
|
+
@status = Http::STATUS_OK
|
61
|
+
|
62
|
+
# Store this instance in a thread local variable for easy
|
63
|
+
# access.
|
64
|
+
|
65
|
+
Thread.current[:CURRENT_CONTEXT] = self
|
66
|
+
end
|
67
|
+
|
68
|
+
# Don't sync session. This method may be needed in low level
|
69
|
+
# hacks with the session code. For example if you updade an
|
70
|
+
# entity (managed) object that is cached in the session, you
|
71
|
+
# may dissable the syncing to avoid resetting the old value
|
72
|
+
# after the sync.
|
73
|
+
|
74
|
+
def no_sync!
|
75
|
+
@no_sync = true
|
76
|
+
end
|
77
|
+
|
78
|
+
# Close the context, should be called at the end of the HTTP
|
79
|
+
# request handling code.
|
80
|
+
|
81
|
+
def close
|
82
|
+
if @session
|
83
|
+
# Ugly hack: need to use AOP instead
|
84
|
+
if @session.has_key?(:FLASH)
|
85
|
+
@session[:FLASH].clean
|
86
|
+
end
|
87
|
+
|
88
|
+
# INVESTIGATE: is this needed?
|
89
|
+
@session.sync unless @no_sync
|
90
|
+
end
|
91
|
+
end
|
92
|
+
alias_method :finish, :close
|
93
|
+
|
94
|
+
# Access the dispactcher
|
95
|
+
|
96
|
+
def dispatcher
|
97
|
+
@application.dispatcher
|
98
|
+
end
|
99
|
+
|
100
|
+
# Lazy lookup of the session to avoid costly cookie
|
101
|
+
# lookup when not needed.
|
102
|
+
|
103
|
+
def session
|
104
|
+
@session || @session = Session.lookup(self)
|
105
|
+
end
|
106
|
+
|
107
|
+
# Access global variables. In a distributed server scenario,
|
108
|
+
# these variables can reside outside of the process.
|
109
|
+
|
110
|
+
def global
|
111
|
+
return Global
|
112
|
+
end
|
113
|
+
|
114
|
+
# Automagically populate an object from request parameters.
|
115
|
+
# This is a truly dangerous method.
|
116
|
+
#
|
117
|
+
# === Options
|
118
|
+
#
|
119
|
+
# * name
|
120
|
+
# * force_boolean
|
121
|
+
#
|
122
|
+
# === Example
|
123
|
+
#
|
124
|
+
# request.fill(User.new)
|
125
|
+
#
|
126
|
+
# This method is deprecated, Prefer to use the following form:
|
127
|
+
#
|
128
|
+
# User.new.assign_with(request)
|
129
|
+
|
130
|
+
def fill(obj, options = {})
|
131
|
+
AttributeUtils.populate_object(obj, params, options)
|
132
|
+
end
|
133
|
+
alias_method :populate, :fill
|
134
|
+
alias_method :assign, :fill
|
135
|
+
|
136
|
+
# Is the current action the top level action? The level
|
137
|
+
# of the top action is 1.
|
138
|
+
|
139
|
+
def is_top_level?
|
140
|
+
@level == 1
|
141
|
+
end
|
142
|
+
alias_method :top?, :is_top_level?
|
143
|
+
alias_method :is_top?, :is_top_level?
|
144
|
+
alias_method :top_level?, :is_top_level?
|
145
|
+
|
146
|
+
# Returns the context for the current thread.
|
147
|
+
|
148
|
+
def self.current
|
149
|
+
Thread.current[:CURRENT_CONTEXT]
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
|
154
|
+
end
|