ramaze 0.3.0 → 0.3.5
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/Rakefile +3 -2
- data/bin/ramaze +9 -3
- data/doc/AUTHORS +6 -2
- data/doc/CHANGELOG +272 -66
- data/doc/GPL +12 -13
- data/doc/README.html +729 -0
- data/doc/changes.txt +5757 -0
- data/doc/changes.xml +5759 -0
- data/doc/meta/announcement.txt +48 -39
- data/doc/tutorial/todolist.mkd +10 -12
- data/examples/blog/start.rb +1 -0
- data/examples/caching.rb +1 -0
- data/examples/element.rb +3 -0
- data/examples/hello.rb +1 -3
- data/examples/identity.rb +5 -8
- data/examples/layout.rb +1 -0
- data/examples/linking.rb +1 -0
- data/examples/memleak_detector.rb +1 -0
- data/examples/nitro_form.rb +1 -0
- data/examples/rammit/start.rb +1 -0
- data/examples/rapaste/Rakefile +7 -0
- data/examples/rapaste/{src/controller.rb → controller/paste.rb} +28 -3
- data/examples/rapaste/{src/model.rb → model/paste.rb} +0 -4
- data/examples/rapaste/public/css/display.css +17 -0
- data/examples/rapaste/spec/rapaste.rb +2 -2
- data/examples/rapaste/start.rb +9 -4
- data/examples/rapaste/{template → view}/copy.xhtml +0 -0
- data/examples/rapaste/{template → view}/index.xhtml +0 -0
- data/examples/rapaste/{template → view}/layout.xhtml +3 -0
- data/examples/rapaste/{template → view}/list.xhtml +4 -3
- data/examples/rapaste/view/search.xhtml +41 -0
- data/examples/rapaste/{template → view}/view.xhtml +0 -0
- data/examples/simple.rb +3 -3
- data/examples/templates/template/external.amrita +9 -9
- data/examples/templates/template/external.redcloth +19 -0
- data/examples/templates/template_amrita2.rb +40 -7
- data/examples/templates/template_erubis.rb +3 -3
- data/examples/templates/template_ezamar.rb +1 -3
- data/examples/templates/template_haml.rb +1 -3
- data/examples/templates/template_liquid.rb +3 -3
- data/examples/templates/template_markaby.rb +1 -3
- data/examples/templates/template_nagoro.rb +1 -3
- data/examples/templates/template_redcloth.rb +59 -0
- data/examples/templates/template_remarkably.rb +1 -3
- data/examples/templates/template_xslt.rb +1 -4
- data/examples/todolist/src/controller/main.rb +1 -1
- data/examples/todolist/start.rb +1 -2
- data/examples/upload/start.rb +19 -0
- data/examples/upload/view/index.xhtml +25 -0
- data/examples/whywiki/start.rb +1 -3
- data/examples/wikore/start.rb +3 -0
- data/examples/wiktacular/mkd/newpagename/current.mkd +1 -0
- data/examples/wiktacular/mkd/newpagename/current.mkd.bak +1 -0
- data/examples/wiktacular/start.rb +1 -0
- data/lib/proto/controller/main.rb +0 -3
- data/lib/proto/public/js/jquery.js +106 -93
- data/lib/proto/spec/main.rb +2 -5
- data/lib/proto/start.rb +0 -3
- data/lib/ramaze.rb +3 -2
- data/lib/ramaze/action.rb +6 -10
- data/lib/ramaze/adapter/lsws.rb +19 -0
- data/lib/ramaze/contrib/email.rb +84 -0
- data/lib/ramaze/contrib/email.rb-darcs-backup0 +81 -0
- data/lib/ramaze/contrib/gettext.rb +1 -0
- data/lib/ramaze/contrib/gettext/parser.rb +46 -0
- data/lib/ramaze/contrib/route.rb +3 -36
- data/lib/ramaze/controller.rb +4 -6
- data/lib/ramaze/controller/resolve.rb +28 -1
- data/lib/ramaze/dispatcher.rb +1 -1
- data/lib/ramaze/dispatcher/file.rb +17 -0
- data/lib/ramaze/global/globalstruct.rb +7 -4
- data/lib/ramaze/helper/auth.rb +1 -1
- data/lib/ramaze/helper/identity.rb +25 -15
- data/lib/ramaze/helper/link.rb +29 -8
- data/lib/ramaze/helper/maruku.rb +7 -0
- data/lib/ramaze/helper/partial.rb +25 -10
- data/lib/ramaze/route.rb +56 -0
- data/lib/ramaze/snippets/metaid.rb +17 -0
- data/lib/ramaze/spec/helper.rb +0 -2
- data/lib/ramaze/spec/helper/mock_http.rb +6 -0
- data/lib/ramaze/spec/helper/pretty_output.rb +5 -1
- data/lib/ramaze/store/default.rb +3 -1
- data/lib/ramaze/template.rb +1 -1
- data/lib/ramaze/template/amrita2.rb +21 -15
- data/lib/ramaze/template/bijou.rb +39 -0
- data/lib/ramaze/template/builder.rb +28 -0
- data/lib/ramaze/template/redcloth.rb +24 -0
- data/lib/ramaze/template/sass.rb +3 -1
- data/lib/ramaze/tool/create.rb +2 -1
- data/lib/ramaze/tool/localize.rb +6 -1
- data/lib/ramaze/trinity/request.rb +8 -0
- data/lib/ramaze/trinity/session.rb +8 -5
- data/lib/ramaze/version.rb +1 -1
- data/rake_tasks/gem.rake +0 -1
- data/rake_tasks/maintenance.rake +4 -1
- data/spec/contrib/route.rb +14 -63
- data/spec/examples/linking.rb +2 -2
- data/spec/examples/templates/template_redcloth.rb +28 -0
- data/spec/ramaze/controller/subclass.rb +21 -0
- data/spec/ramaze/dispatcher/file.rb +31 -0
- data/spec/ramaze/helper/link.rb +46 -0
- data/spec/ramaze/helper/partial.rb +22 -1
- data/spec/ramaze/helper/template/locals.xhtml +1 -0
- data/spec/ramaze/helper/template/recursive_locals.xhtml +7 -0
- data/spec/ramaze/params.rb +8 -0
- data/spec/ramaze/request.rb +14 -0
- data/spec/ramaze/route.rb +107 -0
- data/spec/ramaze/session.rb +4 -2
- data/spec/ramaze/template/amrita2.rb +21 -7
- data/spec/ramaze/template/amrita2/external.amrita +6 -0
- data/spec/ramaze/template/amrita2/sum.amrita +1 -1
- data/spec/ramaze/template/bijou.rb +25 -0
- data/spec/ramaze/template/builder.rb +55 -0
- data/spec/ramaze/template/builder/external.rxml +3 -0
- data/spec/ramaze/template/haml.rb +15 -0
- data/spec/ramaze/template/haml/locals.haml +1 -0
- data/spec/ramaze/template/redcloth.rb +38 -0
- data/spec/ramaze/template/redcloth/external.redcloth +1 -0
- metadata +472 -442
- data/examples/rapaste/rapaste.sqlite +0 -0
- data/spec/ramaze/template/amrita2/data.amrita +0 -6
- data/spec/ramaze/template/amrita2/index.amrita +0 -1
data/lib/ramaze.rb
CHANGED
|
@@ -23,6 +23,7 @@ Thread.abort_on_exception = true
|
|
|
23
23
|
require 'ramaze/version'
|
|
24
24
|
require 'ramaze/snippets'
|
|
25
25
|
require 'ramaze/inform'
|
|
26
|
+
require 'ramaze/route'
|
|
26
27
|
require 'ramaze/global'
|
|
27
28
|
require 'ramaze/cache'
|
|
28
29
|
require 'ramaze/tool'
|
|
@@ -36,7 +37,6 @@ require 'ramaze/sourcereload'
|
|
|
36
37
|
require 'ramaze/dispatcher'
|
|
37
38
|
require 'ramaze/template/ezamar'
|
|
38
39
|
require 'ramaze/contrib'
|
|
39
|
-
require 'ramaze/controller/main'
|
|
40
40
|
|
|
41
41
|
module Ramaze
|
|
42
42
|
|
|
@@ -52,7 +52,8 @@ module Ramaze
|
|
|
52
52
|
# each class in trait[:essentials] by calling ::startup on them.
|
|
53
53
|
|
|
54
54
|
def startup options = {}
|
|
55
|
-
|
|
55
|
+
runner_from_caller = caller[0][/^(.*?):\d+/, 1]
|
|
56
|
+
runner = options.delete(:runner) || runner_from_caller
|
|
56
57
|
|
|
57
58
|
if $0 == runner or options.delete(:force)
|
|
58
59
|
Inform.info("Starting up Ramaze (Version #{VERSION})")
|
data/lib/ramaze/action.rb
CHANGED
|
@@ -80,17 +80,13 @@ module Ramaze
|
|
|
80
80
|
default = controller.trait.fetch(:engine, Template::Ezamar)
|
|
81
81
|
return default unless template
|
|
82
82
|
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
ext_engines = engines.reject{|k,v| not v.include?(ext) }
|
|
88
|
-
|
|
89
|
-
if ext_engines.has_key?(default)
|
|
90
|
-
self[:engine] = default
|
|
91
|
-
else
|
|
92
|
-
self[:engine] = ext_engines.keys.sort.first
|
|
83
|
+
Template::ENGINES.sort_by{|v| v.join}.each do |(engine, exts)|
|
|
84
|
+
if template =~ /\.(#{Regexp.union(*exts)})$/
|
|
85
|
+
return self[:engine] = engine
|
|
86
|
+
end
|
|
93
87
|
end
|
|
88
|
+
|
|
89
|
+
self[:engine] = default
|
|
94
90
|
end
|
|
95
91
|
|
|
96
92
|
# Returns an instance of controller, will be cached on first access.
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require 'ramaze/adapter'
|
|
2
|
+
|
|
3
|
+
module Ramaze::Adapter
|
|
4
|
+
|
|
5
|
+
# Our Lsws adapter acts as wrapper for the Rack::Handler::LSWS.
|
|
6
|
+
class Lsws < Base
|
|
7
|
+
class << self
|
|
8
|
+
|
|
9
|
+
# start Lsws in a new thread, host and port parameter are only taken
|
|
10
|
+
# to make it compatible with other adapters but have no influence and
|
|
11
|
+
# can be omitted
|
|
12
|
+
def run_server host = nil, ports = nil
|
|
13
|
+
Thread.new do
|
|
14
|
+
Rack::Handler::LSWS.run(self)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# EmailHelper can be used as a simple way to send basic e-mails from your app.
|
|
2
|
+
#
|
|
3
|
+
# Usage:
|
|
4
|
+
#
|
|
5
|
+
# require 'ramaze/contrib/email'
|
|
6
|
+
#
|
|
7
|
+
# # Set the required traits:
|
|
8
|
+
# Ramaze::EmailHelper.trait[ :smtp_server ] = 'smtp.your-isp.com'
|
|
9
|
+
# Ramaze::EmailHelper.trait[ :smtp_helo_domain ] = "originating-server.com"
|
|
10
|
+
# Ramaze::EmailHelper.trait[ :smtp_username ] = 'username'
|
|
11
|
+
# Ramaze::EmailHelper.trait[ :smtp_password ] = 'password'
|
|
12
|
+
# Ramaze::EmailHelper.trait[ :sender_address ] = 'no-reply@your-domain.com'
|
|
13
|
+
#
|
|
14
|
+
# # Optionally, set some other traits:
|
|
15
|
+
# Ramaze::EmailHelper.trait[ :smtp_auth_type ] = :login
|
|
16
|
+
# Ramaze::EmailHelper.trait[ :bcc_addresses ] = [ 'admin@your-domain.com' ]
|
|
17
|
+
# Ramaze::EmailHelper.trait[ :sender_full ] = 'MailBot <no-reply@your-domain.com>'
|
|
18
|
+
# Ramaze::EmailHelper.trait[ :id_generator ] = lambda { "<#{Time.now.to_i}@your-domain.com>" }
|
|
19
|
+
# Ramaze::EmailHelper.trait[ :subject_prefix ] = "[SiteName]"
|
|
20
|
+
#
|
|
21
|
+
# To send an e-mail:
|
|
22
|
+
#
|
|
23
|
+
# Ramaze::EmailHelper.send(
|
|
24
|
+
# "foo@foobarmail.com",
|
|
25
|
+
# "Your fooness",
|
|
26
|
+
# "Hey, you are very fooey!"
|
|
27
|
+
# )
|
|
28
|
+
|
|
29
|
+
require 'net/smtp'
|
|
30
|
+
|
|
31
|
+
module Ramaze
|
|
32
|
+
class EmailHelper
|
|
33
|
+
# Required to be set
|
|
34
|
+
trait :smtp_server => 'smtp.your-isp.com'
|
|
35
|
+
trait :smtp_helo_domain => 'your.helo.domain.com'
|
|
36
|
+
trait :smtp_username => 'no-username-set'
|
|
37
|
+
trait :smtp_password => ''
|
|
38
|
+
trait :sender_address => 'no-reply@your-domain.com'
|
|
39
|
+
|
|
40
|
+
# Optionally set
|
|
41
|
+
trait :smtp_port => 25
|
|
42
|
+
trait :smtp_auth_type => :login
|
|
43
|
+
trait :bcc_addresses => []
|
|
44
|
+
trait :sender_full => nil
|
|
45
|
+
trait :id_generator => lambda { "<" + Time.now.to_i.to_s + "@" + trait[ :smtp_helo_domain ] + ">" }
|
|
46
|
+
trait :subject_prefix => ""
|
|
47
|
+
|
|
48
|
+
class << self
|
|
49
|
+
def send(recipient, subject, message)
|
|
50
|
+
{:recipient => recipient, :subject => subject, :message => message}.each do |k,v|
|
|
51
|
+
if v.nil? or v.empty?
|
|
52
|
+
raise(ArgumentError, "EmailHelper error: Missing or invalid #{k}: #{v.inspect}")
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
sender = trait[:sender_full] || "#{trait[:sender_address]} <#{trait[:sender_address]}>"
|
|
56
|
+
subject = [trait[:subject_prefix], subject].join(' ').strip
|
|
57
|
+
id = trait[:id_generator].call
|
|
58
|
+
email = %{From: #{sender}
|
|
59
|
+
To: <#{recipient}>
|
|
60
|
+
Date: #{Time.now.rfc2822}
|
|
61
|
+
Subject: #{subject}
|
|
62
|
+
Message-Id: #{id}
|
|
63
|
+
|
|
64
|
+
#{message}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
send_smtp( email, recipient, subject )
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def send_smtp( email, recipient, subject )
|
|
71
|
+
options = trait.values_at(:smtp_server, :smtp_port, :smtp_helo_domain,
|
|
72
|
+
:smtp_username, :smtp_password, :smtp_auth_type)
|
|
73
|
+
|
|
74
|
+
Net::SMTP.start( *options ) do |smtp|
|
|
75
|
+
smtp.send_message( email, trait[ :sender_address ], Array[ recipient, *trait[ :bcc_addresses ] ] )
|
|
76
|
+
Inform.info "E-mail sent to #{recipient} - '#{subject}'"
|
|
77
|
+
end
|
|
78
|
+
rescue => e
|
|
79
|
+
Inform.error "Failed to send e-mail to #{recipient}"
|
|
80
|
+
Inform.error e
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
84
|
+
end
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
# EmailHelper can be used as a simple way to send basic e-mails from your app.
|
|
2
|
+
#
|
|
3
|
+
# Usage:
|
|
4
|
+
#
|
|
5
|
+
# require 'ramaze/contrib/email'
|
|
6
|
+
#
|
|
7
|
+
# # Set the required traits:
|
|
8
|
+
# EmailHelper.trait[ :smtp_server ] = 'smtp.your-isp.com'
|
|
9
|
+
# EmailHelper.trait[ :smtp_helo_domain ] = "originating-server.com"
|
|
10
|
+
# EmailHelper.trait[ :smtp_username ] = 'username'
|
|
11
|
+
# EmailHelper.trait[ :smtp_password ] = 'password'
|
|
12
|
+
# EmailHelper.trait[ :sender_address ] = 'no-reply@your-domain.com'
|
|
13
|
+
#
|
|
14
|
+
# # Optionally, set some other traits:
|
|
15
|
+
# EmailHelper.trait[ :smtp_auth_type ] = :login
|
|
16
|
+
# EmailHelper.trait[ :bcc_addresses ] = [ 'admin@your-domain.com' ]
|
|
17
|
+
# EmailHelper.trait[ :sender_full ] = 'MailBot <no-reply@your-domain.com>'
|
|
18
|
+
# EmailHelper.trait[ :id_generator ] = lambda { "<#{Time.now.to_i}@your-domain.com>" }
|
|
19
|
+
# EmailHelper.trait[ :subject_prefix ] = "[SiteName]"
|
|
20
|
+
#
|
|
21
|
+
# To send an e-mail:
|
|
22
|
+
#
|
|
23
|
+
# EmailHelper.send(
|
|
24
|
+
# "foo@foobarmail.com",
|
|
25
|
+
# "Your fooness",
|
|
26
|
+
# "Hey, you are very fooey!"
|
|
27
|
+
# )
|
|
28
|
+
|
|
29
|
+
require 'net/smtp'
|
|
30
|
+
|
|
31
|
+
module Ramaze
|
|
32
|
+
class EmailHelper
|
|
33
|
+
# Required to be set
|
|
34
|
+
trait :smtp_server => 'smtp.your-isp.com'
|
|
35
|
+
trait :smtp_helo_domain => 'your.helo.domain.com'
|
|
36
|
+
trait :smtp_username => 'no-username-set'
|
|
37
|
+
trait :smtp_password => ''
|
|
38
|
+
trait :sender_address => 'no-reply@your-domain.com'
|
|
39
|
+
|
|
40
|
+
# Optionally set
|
|
41
|
+
trait :smtp_port => 25
|
|
42
|
+
trait :smtp_auth_type => :login
|
|
43
|
+
trait :bcc_addresses => []
|
|
44
|
+
trait :sender_full => nil
|
|
45
|
+
trait :id_generator => lambda { "<" + Time.now.to_i.to_s + "@" + trait[ :smtp_helo_domain ] + ">" }
|
|
46
|
+
trait :subject_prefix => ""
|
|
47
|
+
|
|
48
|
+
class << self
|
|
49
|
+
def send(recipient, subject, message)
|
|
50
|
+
{:recipient => recipient, :subject => subject, :message => message}.each do |k,v|
|
|
51
|
+
raise(ArgumentError, "EmailHelper error: Missing or invalid #{k}: #{v.inspect}")
|
|
52
|
+
end
|
|
53
|
+
sender = trait[:sender_full] || "#{trait[:sender_address]} <#{trait[:sender_address]}>"
|
|
54
|
+
subject = [trait[:subject_prefix], subject].join(' ').strip
|
|
55
|
+
id = trait[:id_generator].call
|
|
56
|
+
email = %{From: #{sender}
|
|
57
|
+
To: <#{recipient}>
|
|
58
|
+
Date: #{Time.now.rfc2822}
|
|
59
|
+
Subject: #{subject}
|
|
60
|
+
Message-Id: #{id}
|
|
61
|
+
|
|
62
|
+
#{message}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
send_smtp(email)
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def send_smtp(email, recipient, subject, message)
|
|
69
|
+
options = trait.values_at(:smtp_server, :smtp_port, :smtp_helo_domain,
|
|
70
|
+
:smtp_username, :smtp_password, :smtp_auth_type)
|
|
71
|
+
Net::SMTP.start(*options) do |smtp|
|
|
72
|
+
smtp.send_message(email, sender_address, Array[recipient, *bcc_addresses])
|
|
73
|
+
Inform.info "E-mail sent to #{recipient} - '#{subject}'"
|
|
74
|
+
end
|
|
75
|
+
rescue => e
|
|
76
|
+
Inform.error "Failed to send e-mail to #{recipient}"
|
|
77
|
+
Inform.error e
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
@@ -89,6 +89,7 @@ class Ramaze::Tool::Gettext < Ramaze::Tool::Localize
|
|
|
89
89
|
dictionary.each do |locale, dict|
|
|
90
90
|
keys.concat dict.keys
|
|
91
91
|
end
|
|
92
|
+
keys.delete ""
|
|
92
93
|
|
|
93
94
|
data = ::GetText::RGetText.generate(keys.compact.uniq.sort.map {|x| [x] })
|
|
94
95
|
file = (trait[:file] % trait[:default_language]) + '.pot'
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# suppress load warning message
|
|
2
|
+
verbose = $VERBOSE
|
|
3
|
+
$VERBOSE = nil
|
|
4
|
+
require 'gettext/rgettext'
|
|
5
|
+
$VERBOSE = verbose
|
|
6
|
+
|
|
7
|
+
module Ramaze::Tool::Gettext::Parser
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
TARGETS = Ramaze::Template::ENGINES.values.inject([]) do |exts, list|
|
|
11
|
+
list += exts
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def target?(file)
|
|
15
|
+
TARGETS.include?(File.extname(file)[1..-1])
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def parse(file, ary)
|
|
19
|
+
regex = Ramaze::Tool::Gettext.trait[:regex]
|
|
20
|
+
body = File.read(file)
|
|
21
|
+
body.gsub!(regex) do
|
|
22
|
+
msg = $1
|
|
23
|
+
unless msg.to_s.empty?
|
|
24
|
+
line_number = body[0..(body.index(msg))].split("\n").size
|
|
25
|
+
add_message(ary, msg, file, line_number)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
return ary
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def add_message(ary, msg, file, line_number)
|
|
32
|
+
loc = message_location(file, line_number)
|
|
33
|
+
if value = ary.assoc(msg)
|
|
34
|
+
value << loc
|
|
35
|
+
else
|
|
36
|
+
ary << [msg, loc]
|
|
37
|
+
end
|
|
38
|
+
return ary
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def message_location(file, line_number)
|
|
42
|
+
file + ":line" + line_number.to_s
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
GetText::RGetText.add_parser(Ramaze::Tool::Gettext::Parser)
|
data/lib/ramaze/contrib/route.rb
CHANGED
|
@@ -1,55 +1,22 @@
|
|
|
1
1
|
# Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
|
|
2
2
|
# All files in this distribution are subject to the terms of the Ruby license.
|
|
3
3
|
|
|
4
|
-
# Usage:
|
|
5
|
-
#
|
|
6
|
-
# Ramaze.contrib :route
|
|
7
|
-
# Ramaze::Contrib::Route[ %r!^/(\d+\.\d{2})$! ] = "/price/%.2f"
|
|
8
|
-
|
|
9
4
|
module Ramaze
|
|
10
5
|
module Contrib
|
|
11
6
|
class Route
|
|
12
7
|
class << self
|
|
13
8
|
def startup
|
|
14
|
-
|
|
15
|
-
trait :routes => Dictionary.new
|
|
16
|
-
Ramaze::Controller::FILTER.put_before(:default, :routed)
|
|
9
|
+
warn "Ramaze::Contrib::Route is being deprecated, use Ramaze::Route instead"
|
|
17
10
|
end
|
|
18
11
|
|
|
19
12
|
def [](key)
|
|
20
|
-
trait[:routes][key]
|
|
13
|
+
Ramaze::Route.trait[:routes][key]
|
|
21
14
|
end
|
|
22
15
|
|
|
23
16
|
def []=(key, value)
|
|
24
|
-
trait[:routes][key] = value
|
|
17
|
+
Ramaze::Route.trait[:routes][key] = value
|
|
25
18
|
end
|
|
26
19
|
end
|
|
27
20
|
end
|
|
28
21
|
end
|
|
29
|
-
|
|
30
|
-
class Controller
|
|
31
|
-
class << self
|
|
32
|
-
def routed(path)
|
|
33
|
-
routes = Contrib::Route.trait[:routes]
|
|
34
|
-
routes.each do |key, val|
|
|
35
|
-
case
|
|
36
|
-
when key.is_a?(Regexp)
|
|
37
|
-
regex, pattern = key, val
|
|
38
|
-
if md = path.match(regex)
|
|
39
|
-
new_path = pattern % md.to_a[1..-1]
|
|
40
|
-
return resolve(new_path, :routed)
|
|
41
|
-
end
|
|
42
|
-
when val.respond_to?(:call)
|
|
43
|
-
if new_path = val.call(path, request)
|
|
44
|
-
return resolve(new_path, :routed)
|
|
45
|
-
end
|
|
46
|
-
else
|
|
47
|
-
Inform.error "Invalid route #{val}"
|
|
48
|
-
end
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
nil
|
|
52
|
-
end
|
|
53
|
-
end
|
|
54
|
-
end
|
|
55
22
|
end
|
data/lib/ramaze/controller.rb
CHANGED
|
@@ -67,11 +67,9 @@ module Ramaze
|
|
|
67
67
|
end
|
|
68
68
|
end
|
|
69
69
|
|
|
70
|
-
if Global.mapping.empty?
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
Inform.debug("mapped Controllers: #{Global.mapping.inspect}")
|
|
74
|
-
end
|
|
70
|
+
require 'ramaze/controller/main' if Global.mapping.empty?
|
|
71
|
+
|
|
72
|
+
Inform.debug("mapped Controllers: #{Global.mapping.inspect}")
|
|
75
73
|
end
|
|
76
74
|
|
|
77
75
|
# checks paths for existance and logs a warning if it doesn't exist yet.
|
|
@@ -149,7 +147,7 @@ module Ramaze
|
|
|
149
147
|
# Runs every given path through Controller::check_path
|
|
150
148
|
|
|
151
149
|
def template_root path = nil
|
|
152
|
-
if path
|
|
150
|
+
if path and path = path.to_s
|
|
153
151
|
message = "#{self}.template_root is #{path} which does not exist"
|
|
154
152
|
check_path(path, message)
|
|
155
153
|
@template_root = path
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
|
|
4
4
|
module Ramaze
|
|
5
5
|
class Controller
|
|
6
|
-
FILTER = [ :cached, :default ] unless defined?(FILTER)
|
|
6
|
+
FILTER = [ :cached, :routed, :default ] unless defined?(FILTER)
|
|
7
7
|
|
|
8
8
|
class << self
|
|
9
9
|
|
|
@@ -43,6 +43,33 @@ module Ramaze
|
|
|
43
43
|
nil
|
|
44
44
|
end
|
|
45
45
|
|
|
46
|
+
# Routing filter
|
|
47
|
+
# Loops over Route.trait[:routes] to find a matching route
|
|
48
|
+
|
|
49
|
+
def routed(path)
|
|
50
|
+
Route.trait[:routes].each do |key, val|
|
|
51
|
+
if key.is_a?(Regexp)
|
|
52
|
+
if md = path.match(key)
|
|
53
|
+
new_path = val % md.to_a[1..-1]
|
|
54
|
+
return resolve(new_path, :routed)
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
elsif val.respond_to?(:call)
|
|
58
|
+
if new_path = val.call(path, request)
|
|
59
|
+
return resolve(new_path, :routed)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
elsif val.is_a?(String)
|
|
63
|
+
return resolve(val, :routed) if path == key
|
|
64
|
+
|
|
65
|
+
else
|
|
66
|
+
Inform.error "Invalid route #{key} => #{val}"
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
nil
|
|
71
|
+
end
|
|
72
|
+
|
|
46
73
|
# Default element of FILTER.
|
|
47
74
|
# The default handler that tries to find the best match for the given
|
|
48
75
|
# path in terms of Controller/method/template and given arguments.
|
data/lib/ramaze/dispatcher.rb
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
# Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
|
|
2
2
|
# All files in this distribution are subject to the terms of the Ruby license.
|
|
3
3
|
|
|
4
|
+
require "time"
|
|
5
|
+
require 'digest/md5'
|
|
6
|
+
|
|
4
7
|
module Ramaze
|
|
5
8
|
module Dispatcher
|
|
6
9
|
|
|
@@ -20,6 +23,9 @@ module Ramaze
|
|
|
20
23
|
|
|
21
24
|
def process(path)
|
|
22
25
|
return unless file = open_file(path)
|
|
26
|
+
if file == :NotModified
|
|
27
|
+
return response.build([], STATUS_CODE['Not Modified'])
|
|
28
|
+
end
|
|
23
29
|
response.build(file, STATUS_CODE['OK'])
|
|
24
30
|
end
|
|
25
31
|
|
|
@@ -31,6 +37,17 @@ module Ramaze
|
|
|
31
37
|
|
|
32
38
|
if ::File.file?(file) or ::File.file?(file=file/'index')
|
|
33
39
|
response['Content-Type'] = Tool::MIME.type_for(file) unless ::File.extname(file).empty?
|
|
40
|
+
mtime = ::File.mtime(file)
|
|
41
|
+
response['Last-Modified'] = mtime.httpdate
|
|
42
|
+
response['ETag']= Digest::MD5.hexdigest(file+mtime.to_s).inspect
|
|
43
|
+
if modified_since = request.env['HTTP_IF_MODIFIED_SINCE']
|
|
44
|
+
return :NotModified unless Time.parse(modified_since) < mtime
|
|
45
|
+
elsif match = request.env['HTTP_IF_NONE_MATCH']
|
|
46
|
+
# Should be a unique string enclosed in ""
|
|
47
|
+
# To avoiding more file reading we use mtime and filepath
|
|
48
|
+
# we could throw in inode and size for more uniqueness
|
|
49
|
+
return :NotModified if response['ETag']==match
|
|
50
|
+
end
|
|
34
51
|
log(file)
|
|
35
52
|
::File.open(file, 'rb')
|
|
36
53
|
end
|