ramaze 2008.11 → 2009.01
Sign up to get free protection for your applications and to get access to all the features.
- data/README.markdown +7 -7
- data/benchmark/run.rb +1 -1
- data/doc/CHANGELOG +662 -0
- data/examples/app/blog/model/entry.rb +8 -1
- data/examples/app/blog/spec/blog.rb +2 -2
- data/examples/app/rapaste/spec/rapaste.rb +1 -1
- data/examples/app/rapaste/start.rb +2 -2
- data/examples/app/rapaste/view/view.xhtml +3 -0
- data/examples/app/todolist/spec/todolist.rb +1 -1
- data/examples/app/whywiki/spec/whywiki.rb +1 -1
- data/examples/app/wikore/spec/wikore.rb +1 -1
- data/examples/app/wikore/src/model.rb +8 -2
- data/examples/app/wiktacular/spec/wiktacular.rb +1 -1
- data/examples/app/wiktacular/src/model.rb +1 -1
- data/examples/basic/partial.rb +28 -0
- data/examples/helpers/httpdigest.rb +68 -10
- data/examples/misc/ramaise.rb +2 -2
- data/examples/templates/template_amrita2.rb +1 -1
- data/examples/templates/template_erubis.rb +1 -1
- data/examples/templates/template_ezamar.rb +1 -1
- data/examples/templates/template_haml.rb +2 -2
- data/examples/templates/template_liquid.rb +1 -1
- data/examples/templates/template_markaby.rb +2 -2
- data/examples/templates/template_nagoro.rb +1 -1
- data/examples/templates/template_redcloth.rb +1 -1
- data/examples/templates/template_remarkably.rb +2 -2
- data/examples/templates/template_tenjin.rb +1 -1
- data/examples/templates/template_xslt.rb +1 -1
- data/lib/proto/controller/init.rb +2 -1
- data/lib/proto/model/init.rb +3 -3
- data/lib/proto/public/dispatch.fcgi +2 -2
- data/lib/proto/spec/main.rb +3 -3
- data/lib/proto/start.rb +4 -0
- data/lib/ramaze.rb +6 -0
- data/lib/ramaze/action.rb +7 -1
- data/lib/ramaze/action/render.rb +6 -5
- data/lib/ramaze/cache.rb +1 -0
- data/lib/ramaze/cache/file.rb +71 -0
- data/lib/ramaze/contrib.rb +1 -1
- data/lib/ramaze/contrib/email.rb +2 -0
- data/lib/ramaze/contrib/facebook.rb +2 -2
- data/lib/ramaze/contrib/file_cache.rb +2 -64
- data/lib/ramaze/contrib/sequel/image.rb +1 -1
- data/lib/ramaze/controller.rb +9 -1
- data/lib/ramaze/controller/resolve.rb +10 -5
- data/lib/ramaze/current/request.rb +87 -70
- data/lib/ramaze/current/session.rb +3 -5
- data/lib/ramaze/current/session/hash.rb +7 -11
- data/lib/ramaze/dispatcher/action.rb +2 -0
- data/lib/ramaze/dispatcher/file.rb +6 -1
- data/lib/ramaze/helper.rb +12 -4
- data/lib/ramaze/helper/aspect.rb +2 -2
- data/lib/ramaze/helper/bench.rb +43 -0
- data/lib/ramaze/helper/form.rb +5 -2
- data/lib/ramaze/helper/formatting.rb +4 -0
- data/lib/ramaze/helper/gravatar.rb +18 -1
- data/lib/ramaze/helper/httpdigest.rb +55 -28
- data/lib/ramaze/helper/markaby.rb +1 -1
- data/lib/ramaze/helper/maruku.rb +2 -0
- data/lib/ramaze/helper/paginate.rb +1 -1
- data/lib/ramaze/helper/partial.rb +1 -1
- data/lib/ramaze/helper/redirect.rb +22 -4
- data/lib/ramaze/helper/user.rb +4 -4
- data/lib/ramaze/option.rb +1 -1
- data/lib/ramaze/option/holder.rb +3 -3
- data/lib/ramaze/reloader.rb +25 -41
- data/lib/ramaze/reloader/watch_inotify.rb +85 -0
- data/lib/ramaze/reloader/watch_stat.rb +58 -0
- data/lib/ramaze/snippets/divide.rb +2 -0
- data/lib/ramaze/snippets/numeric/time.rb +1 -1
- data/lib/ramaze/snippets/object/__dir__.rb +3 -3
- data/lib/ramaze/snippets/object/acquire.rb +3 -6
- data/lib/ramaze/snippets/ramaze/acquire.rb +31 -0
- data/lib/ramaze/snippets/ramaze/deprecated.rb +2 -1
- data/lib/ramaze/spec/helper/mock_http.rb +6 -5
- data/lib/ramaze/template/ezamar/render_partial.rb +8 -0
- data/lib/ramaze/tool/mime.rb +1 -1
- data/lib/ramaze/tool/project_creator.rb +2 -1
- data/lib/ramaze/version.rb +2 -2
- data/rake_tasks/coverage.rake +4 -5
- data/rake_tasks/spec.rake +6 -6
- data/ramaze-2008.11.gem +0 -0
- data/ramaze.gemspec +759 -758
- data/spec/contrib/profiling.rb +2 -2
- data/spec/ramaze/action/file_cache.rb +1 -1
- data/spec/ramaze/action/layout.rb +1 -1
- data/spec/ramaze/controller/actionless_templates.rb +1 -1
- data/spec/ramaze/controller/resolve.rb +1 -1
- data/spec/ramaze/controller/template_resolving.rb +1 -1
- data/spec/ramaze/dispatcher/directory.rb +3 -3
- data/spec/ramaze/helper/aspect.rb +1 -1
- data/spec/ramaze/helper/partial.rb +1 -1
- data/spec/ramaze/localize.rb +1 -1
- data/spec/ramaze/rewrite.rb +1 -1
- data/spec/ramaze/template.rb +3 -3
- data/spec/ramaze/template/amrita2.rb +1 -1
- data/spec/ramaze/template/erubis.rb +1 -1
- data/spec/ramaze/template/ezamar.rb +1 -1
- data/spec/ramaze/template/haml.rb +2 -2
- data/spec/ramaze/template/nagoro.rb +1 -1
- data/spec/ramaze/template/redcloth.rb +1 -1
- data/spec/ramaze/template/sass.rb +1 -1
- data/spec/ramaze/template/tenjin.rb +1 -1
- data/spec/snippets/object/__dir__.rb +6 -0
- data/spec/snippets/{object → ramaze}/acquire.rb +24 -18
- metadata +18 -16
- data/lib/ramaze/contrib/auto_params.rb +0 -135
- data/lib/ramaze/contrib/auto_params/get_args.rb +0 -58
- data/spec/contrib/auto_params.rb +0 -121
- data/spec/snippets/divide.rb +0 -19
@@ -1,135 +0,0 @@
|
|
1
|
-
# auto_params.rb
|
2
|
-
#
|
3
|
-
# AutoParams implements action parameterization ala merb 0.4 and Nitro
|
4
|
-
# using ruby2ruby and ParseTree
|
5
|
-
#
|
6
|
-
# Usage:
|
7
|
-
#
|
8
|
-
# Ramaze.contrib :auto_params
|
9
|
-
#
|
10
|
-
# Then, for example,
|
11
|
-
#
|
12
|
-
# def search(query) end
|
13
|
-
#
|
14
|
-
# can be accessed via
|
15
|
-
#
|
16
|
-
# - /search?query=findthis, which calls search('findthis')
|
17
|
-
# - /search/findthis search('findthis')
|
18
|
-
# - /search/findthis?query=andthis search(['findthis', 'andthis'])
|
19
|
-
#
|
20
|
-
# For more examples, take a look at spec/contrib/auto_params.rb
|
21
|
-
#
|
22
|
-
# Note: A simpler alternative for similar functionality would be:
|
23
|
-
#
|
24
|
-
# def search(query = request['query']) end
|
25
|
-
#
|
26
|
-
|
27
|
-
require __DIR__/:auto_params/:get_args
|
28
|
-
|
29
|
-
module Ramaze
|
30
|
-
|
31
|
-
module Contrib
|
32
|
-
class AutoParams
|
33
|
-
def self.startup
|
34
|
-
Ramaze::Cache.add :args
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
class Action
|
40
|
-
|
41
|
-
# with parameterization, params may include
|
42
|
-
# arrays: /num?n=1&n=2 becomes [['1','2']] for def num(n) end
|
43
|
-
# nil: /calc?w=10&d=2 becomes ['10', nil, '2'] for def calc(w, h, d) end
|
44
|
-
|
45
|
-
def params=(*par)
|
46
|
-
par = *par
|
47
|
-
self[:params] = par.map{ |pa|
|
48
|
-
case pa
|
49
|
-
when Array
|
50
|
-
pa.map{|p| Rack::Utils.unescape(p)}
|
51
|
-
when nil
|
52
|
-
nil
|
53
|
-
else
|
54
|
-
Rack::Utils.unescape(pa)
|
55
|
-
end
|
56
|
-
} unless par.nil?
|
57
|
-
self[:params] ||= []
|
58
|
-
end
|
59
|
-
|
60
|
-
end
|
61
|
-
|
62
|
-
class Controller
|
63
|
-
|
64
|
-
# ignore cache when request.params is interesting
|
65
|
-
|
66
|
-
def self.cached(path)
|
67
|
-
if found = Cache.resolved[path]
|
68
|
-
if found.respond_to?(:relaxed_hash)
|
69
|
-
|
70
|
-
# don't use cache if we need to add request.params entries to the Action
|
71
|
-
if args = Cache.args[found.method]
|
72
|
-
param_keys = request.params.keys
|
73
|
-
return nil if args.find{|k,v| param_keys.include?(k.to_s) }
|
74
|
-
end
|
75
|
-
|
76
|
-
return found.dup
|
77
|
-
else
|
78
|
-
Log.warn("Found faulty `#{path}' in Cache.resolved, deleting it for sanity.")
|
79
|
-
Cache.resolved.delete path
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
nil
|
84
|
-
end
|
85
|
-
|
86
|
-
# use Method#get_args to insert values from request.params into Action#params
|
87
|
-
|
88
|
-
def self.resolve_method(name, *params)
|
89
|
-
if method = [ name, name.gsub('__','/') ].find{|n|
|
90
|
-
cached_action_methods.include?(n) }
|
91
|
-
meth = instance_method(method)
|
92
|
-
arity = meth.arity
|
93
|
-
|
94
|
-
if meth.respond_to? :get_args
|
95
|
-
unless args = Cache.args[name]
|
96
|
-
if args = meth.get_args
|
97
|
-
args = args.select{|e| e.to_s !~ /^\*/}
|
98
|
-
else
|
99
|
-
args = []
|
100
|
-
end
|
101
|
-
Cache.args[name] = args
|
102
|
-
end
|
103
|
-
|
104
|
-
param_keys = request.params.keys
|
105
|
-
|
106
|
-
# if there are missing args, or keys in request.params that match expected args
|
107
|
-
if args.size > params.size or args.find{|k,v| param_keys.include?(k.to_s) }
|
108
|
-
args.each_with_index do |(name, val), i|
|
109
|
-
r_params = request.params[name.to_s]
|
110
|
-
if params[i] and r_params and r_params.size > 0
|
111
|
-
params[i] = [params[i], r_params].flatten
|
112
|
-
else
|
113
|
-
params[i] ||= r_params
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
# strip trailing nils so default argument values are used
|
118
|
-
params.reverse.each{|e| if e.nil? then params.pop else break end }
|
119
|
-
end
|
120
|
-
|
121
|
-
argity = args.select{|e| e.size==1}.size..args.size
|
122
|
-
else
|
123
|
-
argity = arity..arity
|
124
|
-
end
|
125
|
-
|
126
|
-
if arity < 0 or argity.include? params.size
|
127
|
-
return method, params
|
128
|
-
end
|
129
|
-
end
|
130
|
-
return nil, []
|
131
|
-
end
|
132
|
-
|
133
|
-
end
|
134
|
-
|
135
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
# from merb/core_ext/get_args.rb
|
2
|
-
begin
|
3
|
-
require 'parse_tree'
|
4
|
-
require 'ruby2ruby'
|
5
|
-
|
6
|
-
class ParseTreeArray < Array
|
7
|
-
def self.translate(*args)
|
8
|
-
self.new(ParseTree.translate(*args))
|
9
|
-
end
|
10
|
-
|
11
|
-
def deep_array_node(type = nil)
|
12
|
-
each do |node|
|
13
|
-
return ParseTreeArray.new(node) if node.is_a?(Array) && (!type || node[0] == type)
|
14
|
-
next unless node.is_a?(Array)
|
15
|
-
return ParseTreeArray.new(node).deep_array_node(type)
|
16
|
-
end
|
17
|
-
nil
|
18
|
-
end
|
19
|
-
|
20
|
-
def arg_nodes
|
21
|
-
self[1..-1].inject([]) do |sum,item|
|
22
|
-
sum << [item] unless item.is_a?(Array)
|
23
|
-
sum
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def get_args
|
28
|
-
arg_node = deep_array_node(:args)
|
29
|
-
return nil unless arg_node
|
30
|
-
args = arg_node.arg_nodes
|
31
|
-
default_node = arg_node.deep_array_node(:block)
|
32
|
-
return args unless default_node
|
33
|
-
lasgns = default_node[1..-1]
|
34
|
-
lasgns.each do |asgn|
|
35
|
-
args.assoc(asgn[1]) << eval(RubyToRuby.new.process(asgn[2]))
|
36
|
-
end
|
37
|
-
args
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
module GetArgs
|
43
|
-
def get_args
|
44
|
-
klass, meth = self.to_s.split(/ /).to_a[1][0..-2].split("#")
|
45
|
-
klass = $` if klass =~ /\(/
|
46
|
-
ParseTreeArray.translate(Object.const_get(klass), meth).get_args
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
class UnboundMethod
|
51
|
-
include GetArgs
|
52
|
-
end
|
53
|
-
|
54
|
-
class Method
|
55
|
-
include GetArgs
|
56
|
-
end
|
57
|
-
rescue LoadError
|
58
|
-
end
|
data/spec/contrib/auto_params.rb
DELETED
@@ -1,121 +0,0 @@
|
|
1
|
-
require 'spec/helper'
|
2
|
-
spec_require 'parse_tree', 'ruby2ruby'
|
3
|
-
|
4
|
-
Ramaze.contrib :auto_params
|
5
|
-
|
6
|
-
module AnotherController
|
7
|
-
Ramaze::Helper::LOOKUP << self
|
8
|
-
|
9
|
-
def another_page
|
10
|
-
'another page'
|
11
|
-
end
|
12
|
-
|
13
|
-
define_method('css/style.css') { 'style.css' }
|
14
|
-
end
|
15
|
-
|
16
|
-
class MainController < Ramaze::Controller
|
17
|
-
include AnotherController
|
18
|
-
engine :None
|
19
|
-
|
20
|
-
def search query
|
21
|
-
query.inspect
|
22
|
-
end
|
23
|
-
|
24
|
-
def create name, age = '?', occupation = nil
|
25
|
-
[name, age, occupation].compact.join(', ')
|
26
|
-
end
|
27
|
-
|
28
|
-
def show *args
|
29
|
-
args.join(', ')
|
30
|
-
end
|
31
|
-
|
32
|
-
def add item, price = 1.0, *args
|
33
|
-
[item, price, *args].join(', ')
|
34
|
-
end
|
35
|
-
|
36
|
-
def find width, height, depth
|
37
|
-
[width, height, depth].join(', ')
|
38
|
-
end
|
39
|
-
|
40
|
-
define_method('page') do
|
41
|
-
'page'
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
class GetArgsTest
|
46
|
-
def one(a, b, c) end
|
47
|
-
def two(a, b = 1, c = nil) end
|
48
|
-
def three(a, *args) end
|
49
|
-
end
|
50
|
-
|
51
|
-
describe 'Method#get_args' do
|
52
|
-
it 'should return a list of arguments' do
|
53
|
-
gat = GetArgsTest.new
|
54
|
-
gat.method(:one).get_args.should == [[:a], [:b], [:c]]
|
55
|
-
gat.method(:two).get_args.should == [[:a], [:b, 1], [:c, nil]]
|
56
|
-
gat.method(:three).get_args.should == [[:a], [:"*args"]]
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
describe 'Parameterized actions' do
|
61
|
-
behaves_like 'http'
|
62
|
-
ramaze
|
63
|
-
|
64
|
-
it 'should pass in values from request.params' do
|
65
|
-
get('/create/Aman/20').body.should == 'Aman, 20'
|
66
|
-
get('/create', :name => 'Aman', :age => 20).body.should == 'Aman, 20'
|
67
|
-
|
68
|
-
get('/create/Aman/20/Unemployed').body.should == 'Aman, 20, Unemployed'
|
69
|
-
get('/create', :name => 'Aman', :age => 20, :occupation => 'Unemployed').body.should == 'Aman, 20, Unemployed'
|
70
|
-
|
71
|
-
get('/create/Aman').body.should == 'Aman, ?'
|
72
|
-
get('/create', :name => 'Aman').body.should == 'Aman, ?'
|
73
|
-
end
|
74
|
-
|
75
|
-
it 'should insert nil for arguments not found' do
|
76
|
-
get('/find', :width => 10, :depth => 20).body.should == '10, , 20'
|
77
|
-
end
|
78
|
-
|
79
|
-
it 'should work with variable arguments' do
|
80
|
-
get('/show/1/2/3').body.should == '1, 2, 3'
|
81
|
-
|
82
|
-
get('/add/Shoe').body.should == 'Shoe, 1.0'
|
83
|
-
get('/add', :item => 'Shoe').body.should == 'Shoe, 1.0'
|
84
|
-
|
85
|
-
get('/add/Shoe/10.50/1/2/3').body.should == 'Shoe, 10.50, 1, 2, 3'
|
86
|
-
get('/add/Shoe/11.00').body.should == 'Shoe, 11.00'
|
87
|
-
end
|
88
|
-
|
89
|
-
it 'should not break existing methods' do
|
90
|
-
get('/search/Aman').body.should == '"Aman"'
|
91
|
-
get('/search', 'query=Aman').body.should == '"Aman"'
|
92
|
-
get('/search/tmm1', 'query=Aman').body.should == ['tmm1','Aman'].inspect
|
93
|
-
end
|
94
|
-
|
95
|
-
it 'should consolidate all values for the same key into an array' do
|
96
|
-
get('/add', 'item=Shoe&item=Shirt').body.should == 'Shoe, Shirt, 1.0'
|
97
|
-
get('/add/Pants', 'item=Shoe&item=Shirt').body.should == 'Pants, Shoe, Shirt, 1.0'
|
98
|
-
get('/add/Shoe', :item => 'Shirt').body.should == 'Shoe, Shirt, 1.0'
|
99
|
-
end
|
100
|
-
end if method(:puts).respond_to? :get_args
|
101
|
-
|
102
|
-
describe 'Normal behavior' do
|
103
|
-
behaves_like 'http'
|
104
|
-
ramaze
|
105
|
-
|
106
|
-
it 'should work with no arguments' do
|
107
|
-
get('/page').body.should == 'page'
|
108
|
-
end
|
109
|
-
|
110
|
-
it 'should raise no action' do
|
111
|
-
get('/none').body.should =~ /No Action found/
|
112
|
-
end
|
113
|
-
|
114
|
-
it 'should work with included actions' do
|
115
|
-
get('/another_page').body.should == 'another page'
|
116
|
-
end
|
117
|
-
|
118
|
-
it 'should work with /' do
|
119
|
-
get('/css/style.css').body.should == 'style.css'
|
120
|
-
end
|
121
|
-
end
|
data/spec/snippets/divide.rb
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'lib/ramaze/spec/helper/snippets'
|
2
|
-
|
3
|
-
describe 'String#/ and Symbol#/' do
|
4
|
-
it 'should join two strings' do
|
5
|
-
('a' / 'b').should == 'a/b'
|
6
|
-
end
|
7
|
-
|
8
|
-
it 'should join a string and a symbol' do
|
9
|
-
('a' / :b).should == 'a/b'
|
10
|
-
end
|
11
|
-
|
12
|
-
it 'should join two symbols' do
|
13
|
-
(:a / :b).should == 'a/b'
|
14
|
-
end
|
15
|
-
|
16
|
-
it 'should be usable in concatenation' do
|
17
|
-
('a' / :b / :c).should == 'a/b/c'
|
18
|
-
end
|
19
|
-
end
|