ramaze 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +13 -7
- data/doc/README +1 -1
- data/doc/README.html +729 -0
- data/doc/meta/users.kml +61 -59
- data/doc/readme_chunks/installing.txt +1 -1
- data/examples/auth/auth.rb +13 -8
- data/examples/element.rb +1 -2
- data/examples/ramaise.rb +139 -0
- data/examples/simple.rb +2 -5
- data/examples/sourceview/public/coderay.css +104 -0
- data/examples/sourceview/public/jquery.treeview.css +10 -9
- data/examples/sourceview/public/jquery.treeview.js +7 -7
- data/examples/sourceview/public/sourceview.js +43 -7
- data/examples/sourceview/sourceview.rb +36 -33
- data/examples/sourceview/template/index.haml +33 -17
- data/examples/wikore/spec/wikore.rb +1 -0
- data/examples/wikore/src/controller.rb +0 -1
- data/examples/wikore/src/model.rb +17 -16
- data/lib/proto/src/controller/main.rb +1 -1
- data/lib/proto/start.rb +2 -3
- data/lib/ramaze.rb +3 -0
- data/lib/ramaze/contrib/auto_params.rb +3 -3
- data/lib/ramaze/contrib/gzip_filter.rb +3 -4
- data/lib/ramaze/contrib/route.rb +5 -0
- data/lib/ramaze/controller/resolve.rb +1 -1
- data/lib/ramaze/dispatcher/action.rb +1 -1
- data/lib/ramaze/dispatcher/error.rb +7 -4
- data/lib/ramaze/gestalt.rb +1 -2
- data/lib/ramaze/helper.rb +8 -4
- data/lib/ramaze/helper/auth.rb +1 -1
- data/lib/ramaze/helper/cache.rb +4 -0
- data/lib/ramaze/helper/identity.rb +2 -2
- data/lib/ramaze/snippets/{string/DIVIDE.rb → divide.rb} +11 -8
- data/lib/ramaze/snippets/string/unindent.rb +7 -0
- data/lib/ramaze/snippets/thread/into.rb +5 -12
- data/lib/ramaze/spec/helper/wrap.rb +1 -1
- data/lib/ramaze/template/haml.rb +4 -14
- data/lib/ramaze/template/sass.rb +4 -14
- data/lib/ramaze/trinity/request.rb +34 -1
- data/lib/ramaze/version.rb +1 -1
- data/rake_tasks/coverage.rake +46 -0
- data/rake_tasks/spec.rake +1 -1
- data/spec/contrib/auto_params.rb +6 -1
- data/spec/contrib/route.rb +0 -2
- data/spec/contrib/sequel/fill.rb +6 -4
- data/spec/ramaze/controller/resolve.rb +31 -0
- data/spec/ramaze/helper/cache.rb +14 -7
- data/spec/ramaze/template/haml.rb +14 -0
- data/spec/ramaze/template/sass.rb +23 -1
- data/spec/ramaze/trinity/request.rb +19 -0
- data/spec/snippets/{string/DIVIDE.rb → divide.rb} +5 -1
- data/spec/snippets/kernel/__dir__.rb +1 -1
- data/spec/snippets/string/unindent.rb +22 -0
- data/spec/snippets/thread/into.rb +21 -0
- metadata +90 -80
@@ -4,10 +4,10 @@
|
|
4
4
|
# using ruby2ruby and ParseTree
|
5
5
|
#
|
6
6
|
# Usage:
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# Ramaze.contrib :auto_params
|
9
9
|
#
|
10
|
-
#
|
10
|
+
# Then, for example,
|
11
11
|
#
|
12
12
|
# def search(query) end
|
13
13
|
#
|
@@ -86,7 +86,7 @@ module Ramaze
|
|
86
86
|
# use Method#get_args to insert values from request.params into Action#params
|
87
87
|
|
88
88
|
def self.resolve_method(name, *params)
|
89
|
-
if method = action_methods.delete(
|
89
|
+
if method = [ name, name.gsub('__','/') ].find{|n| action_methods.delete(n) }
|
90
90
|
meth = instance_method(method)
|
91
91
|
arity = meth.arity
|
92
92
|
|
@@ -6,11 +6,10 @@
|
|
6
6
|
# Use this to compress "large" pages with gzip. All major browsers support gzipped pages.
|
7
7
|
# This filter brought to you by your friends in #ramaze: Pistos, manveru, rikur and Kashia.
|
8
8
|
#
|
9
|
-
# Usage:
|
10
|
-
# in start.rb:
|
9
|
+
# Usage, in start.rb:
|
11
10
|
#
|
12
|
-
#
|
13
|
-
#
|
11
|
+
# require 'ramaze/contrib/gzip_filter'
|
12
|
+
# Ramaze::Dispatcher::Action::FILTER << Ramaze::Filter::Gzip
|
14
13
|
|
15
14
|
require 'zlib'
|
16
15
|
|
data/lib/ramaze/contrib/route.rb
CHANGED
@@ -1,6 +1,11 @@
|
|
1
1
|
# Copyright (c) 2006 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
|
+
|
4
9
|
module Ramaze
|
5
10
|
module Contrib
|
6
11
|
class Route
|
@@ -126,7 +126,7 @@ module Ramaze
|
|
126
126
|
|
127
127
|
# Based on methodname and arity, tries to find the right method on current controller.
|
128
128
|
def resolve_method(name, *params)
|
129
|
-
if method = action_methods.delete(
|
129
|
+
if method = [ name, name.gsub('__','/') ].find{|n| action_methods.delete(n) }
|
130
130
|
arity = instance_method(method).arity
|
131
131
|
if params.size == arity or arity < 0
|
132
132
|
return method, params
|
@@ -23,7 +23,7 @@ module Ramaze
|
|
23
23
|
# post-processing.
|
24
24
|
|
25
25
|
def process(path)
|
26
|
-
Inform.info("Dynamic request from #{request.
|
26
|
+
Inform.info("Dynamic request from #{request.ip}: #{request.request_uri}")
|
27
27
|
body = Controller.handle(path)
|
28
28
|
response = Response.current.build(body)
|
29
29
|
FILTER.inject(response){|r,f| f.call(r) }
|
@@ -40,11 +40,14 @@ module Ramaze
|
|
40
40
|
status ||= 500
|
41
41
|
|
42
42
|
if controller = metainfo[:controller]
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
43
|
+
newpath = (controller.mapping + path).squeeze('/')
|
44
|
+
action_response = Dispatcher::Action.process(newpath)
|
45
|
+
case action_response
|
46
|
+
when Ramaze::Error
|
47
47
|
Inform.debug("No custom error page found on #{controller}, going to #{path}")
|
48
|
+
else
|
49
|
+
action_response.status = status
|
50
|
+
return action_response
|
48
51
|
end
|
49
52
|
end
|
50
53
|
|
data/lib/ramaze/gestalt.rb
CHANGED
data/lib/ramaze/helper.rb
CHANGED
@@ -23,10 +23,14 @@ module Ramaze
|
|
23
23
|
def helper *syms
|
24
24
|
syms.each do |sym|
|
25
25
|
mod_name = sym.to_s.capitalize + 'Helper'
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
26
|
+
begin
|
27
|
+
include ::Ramaze.const_get(mod_name)
|
28
|
+
extend ::Ramaze.const_get(mod_name)
|
29
|
+
rescue NameError
|
30
|
+
files = Dir["{helper,#{BASEDIR/:ramaze/:helper}}/#{sym}.{rb,so}"]
|
31
|
+
raise LoadError, "#{mod_name} not found" unless files.any?
|
32
|
+
require(files.first) ? retry : raise
|
33
|
+
end
|
30
34
|
end
|
31
35
|
end
|
32
36
|
end
|
data/lib/ramaze/helper/auth.rb
CHANGED
@@ -29,7 +29,7 @@ module Ramaze
|
|
29
29
|
if check_auth(username, password)
|
30
30
|
session[:logged_in] = true
|
31
31
|
session[:username] = username
|
32
|
-
inside_stack? ? answer :
|
32
|
+
inside_stack? ? answer : redirect_referrer
|
33
33
|
else
|
34
34
|
if AUTH_ELEMENT and AUTH_ELEMENT.to_s.split.any?
|
35
35
|
open_element = "<#{AUTH_ELEMENT}>"
|
data/lib/ramaze/helper/cache.rb
CHANGED
@@ -37,8 +37,12 @@ module Ramaze
|
|
37
37
|
# "hi #{request['name']}"
|
38
38
|
# end
|
39
39
|
# end
|
40
|
+
#
|
41
|
+
# cache acts as a wrapper for value_cache if no args are given
|
40
42
|
|
41
43
|
def cache *args
|
44
|
+
return value_cache if args.size == 0
|
45
|
+
|
42
46
|
if args.last.is_a? Hash
|
43
47
|
opts = args.pop
|
44
48
|
end
|
@@ -20,11 +20,11 @@ module Ramaze
|
|
20
20
|
# Simple form for use or overwriting.
|
21
21
|
# Has to provide the same functionality when overwritten or directly
|
22
22
|
# embedded into a page.
|
23
|
-
def openid_login_form
|
23
|
+
def openid_login_form(caption="login")
|
24
24
|
%{
|
25
25
|
<form method="GET" action="#{Rs(:openid_begin)}">
|
26
26
|
Identity URL: <input type="text" name="url" />
|
27
|
-
<input type="submit" />
|
27
|
+
<input type="submit" value="#{caption}"/>
|
28
28
|
</form>
|
29
29
|
}
|
30
30
|
end
|
@@ -1,17 +1,20 @@
|
|
1
1
|
# Copyright (c) 2006 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
|
-
#
|
4
|
+
# A convenient way to do File.join
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
# 'a' / 'b' # -> 'a/b'
|
8
|
+
# File.dirname(__FILE__) / 'bar' # -> "ramaze/snippets/string/bar"
|
5
9
|
|
6
10
|
class String
|
7
|
-
|
8
|
-
# A convenient way to do File.join
|
9
|
-
#
|
10
|
-
# Example:
|
11
|
-
# 'a' / 'b' # -> 'a/b'
|
12
|
-
# File.dirname(__FILE__) / 'bar' # -> "ramaze/snippets/string/bar"
|
13
|
-
|
14
11
|
def / obj
|
15
12
|
File.join(self, obj.to_s)
|
16
13
|
end
|
17
14
|
end
|
15
|
+
|
16
|
+
class Symbol
|
17
|
+
def / obj
|
18
|
+
self.to_s / obj
|
19
|
+
end
|
20
|
+
end
|
@@ -6,20 +6,13 @@ class Thread
|
|
6
6
|
# :action, :response, :request, :session,
|
7
7
|
# :task, :adapter, :controller, :exception
|
8
8
|
|
9
|
-
def self.into
|
10
|
-
Thread.new(Thread.current) do |thread|
|
11
|
-
|
12
|
-
|
13
|
-
vars = Dir["#{Ramaze::BASEDIR}/**/*.rb"].
|
14
|
-
map{|f| File.readlines(f).
|
15
|
-
map{|l| l[/Thread\.current\[:([^\]]*)\]/, 1] } }
|
16
|
-
|
17
|
-
vars.flatten.compact.uniq.each do |var|
|
18
|
-
var = var.to_sym
|
19
|
-
current[var] = thread[var]
|
9
|
+
def self.into *args
|
10
|
+
Thread.new(Thread.current, *args) do |thread, *args|
|
11
|
+
thread.keys.each do |k|
|
12
|
+
Thread.current[k] = thread[k] unless k.to_s =~ /^__/
|
20
13
|
end
|
21
14
|
|
22
|
-
yield
|
15
|
+
yield *args
|
23
16
|
end
|
24
17
|
end
|
25
18
|
end
|
data/lib/ramaze/template/haml.rb
CHANGED
@@ -11,32 +11,22 @@ module Ramaze
|
|
11
11
|
|
12
12
|
class Haml < Template
|
13
13
|
|
14
|
-
# Custom HAML-options for your controller to be merged.
|
15
|
-
|
16
|
-
trait :haml_options => {
|
17
|
-
:locals => {}
|
18
|
-
}
|
19
|
-
|
20
14
|
ENGINES[self] = %w[ haml ]
|
21
15
|
|
22
16
|
class << self
|
23
17
|
|
24
|
-
# Transform
|
25
|
-
# haml_options that you can set also by
|
26
|
-
# trait :haml_options => {}
|
27
|
-
# if you pass the options it will merge the trait with them. (your
|
28
|
-
# options override the defaults from trait[:haml_options]
|
18
|
+
# Transform via Haml templating engine
|
29
19
|
|
30
20
|
def transform action
|
31
21
|
haml = wrap_compile(action)
|
32
22
|
haml.to_html(action.instance)
|
33
23
|
end
|
34
24
|
|
35
|
-
# Instantiates Haml::Engine with the template and haml_options from
|
36
|
-
# the
|
25
|
+
# Instantiates Haml::Engine with the template and haml_options trait from
|
26
|
+
# the controller.
|
37
27
|
|
38
28
|
def compile(action, template)
|
39
|
-
::Haml::Engine.new(template,
|
29
|
+
::Haml::Engine.new(template, action.controller.trait[:haml_options] || {})
|
40
30
|
end
|
41
31
|
end
|
42
32
|
end
|
data/lib/ramaze/template/sass.rb
CHANGED
@@ -11,21 +11,11 @@ module Ramaze
|
|
11
11
|
|
12
12
|
class Sass < Template
|
13
13
|
|
14
|
-
# Custom SASS-options for your controller to be merged.
|
15
|
-
|
16
|
-
trait :sass_options => {
|
17
|
-
:locals => {}
|
18
|
-
}
|
19
|
-
|
20
14
|
ENGINES[self] = %w[ sass ]
|
21
15
|
|
22
16
|
class << self
|
23
17
|
|
24
|
-
# Transform
|
25
|
-
# sass_options that you can set also by
|
26
|
-
# trait :sass_options => {}
|
27
|
-
# if you pass the options it will merge the trait with them. (your
|
28
|
-
# options override the defaults from trait[:sass_options]
|
18
|
+
# Transform via Sass templating engine
|
29
19
|
|
30
20
|
def transform action
|
31
21
|
Response.current['Content-Type'] = "text/css"
|
@@ -33,11 +23,11 @@ module Ramaze
|
|
33
23
|
sass.to_css()
|
34
24
|
end
|
35
25
|
|
36
|
-
# Instantiates Sass::Engine with the template and sass_options from
|
37
|
-
# the
|
26
|
+
# Instantiates Sass::Engine with the template and sass_options trait from
|
27
|
+
# the controller.
|
38
28
|
|
39
29
|
def compile(action, template)
|
40
|
-
::Sass::Engine.new(template,
|
30
|
+
::Sass::Engine.new(template, action.controller.trait[:sass_options] || {})
|
41
31
|
end
|
42
32
|
end
|
43
33
|
end
|
@@ -4,6 +4,7 @@
|
|
4
4
|
require 'cgi'
|
5
5
|
require 'tmpdir'
|
6
6
|
require 'digest/md5'
|
7
|
+
require 'ipaddr'
|
7
8
|
require 'rack'
|
8
9
|
require 'rack/request'
|
9
10
|
|
@@ -34,7 +35,39 @@ module Ramaze
|
|
34
35
|
super
|
35
36
|
end
|
36
37
|
|
37
|
-
|
38
|
+
def request_uri
|
39
|
+
env['REQUEST_URI'] || path_info
|
40
|
+
end
|
41
|
+
|
42
|
+
def ip
|
43
|
+
env['HTTP_X_FORWARDED_FOR'] || env['REMOTE_ADDR']
|
44
|
+
end
|
45
|
+
|
46
|
+
# Request is from a local network?
|
47
|
+
# Checks both IPv4 and IPv6
|
48
|
+
|
49
|
+
ipv4 = %w[ 127.0.0.1/32 192.168.0.0/16 172.16.0.0/12 10.0.0.0/8 169.254.0.0/16 ]
|
50
|
+
ipv6 = %w[ fc00::/7 fe80::/10 fec0::/10 ::1 ]
|
51
|
+
LOCAL = (ipv4 + ipv6).map{|a| IPAddr.new(a)}
|
52
|
+
|
53
|
+
# --
|
54
|
+
# Mongrel somehow puts together multiple IPs when proxy is involved.
|
55
|
+
# ++
|
56
|
+
|
57
|
+
def local_net?(address = ip)
|
58
|
+
address = address.to_s.split(',').first
|
59
|
+
addr = IPAddr.new(address)
|
60
|
+
LOCAL.find{|range| range.include?(addr) }
|
61
|
+
end
|
62
|
+
|
63
|
+
def [](key, *rest)
|
64
|
+
value = params[key.to_s]
|
65
|
+
return value if rest.empty?
|
66
|
+
keys = rest.flatten.map{|k| k.to_s}
|
67
|
+
Array[value, *params.values_at(*keys)]
|
68
|
+
end
|
69
|
+
|
70
|
+
unless method_defined?(:rack_params)
|
38
71
|
alias rack_params params
|
39
72
|
|
40
73
|
# Wrapping Request#params to support a one-level hash notation.
|
data/lib/ramaze/version.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
1
|
+
# Copyright (c) 2006 Michael Fellinger m.fellinger@gmail.com
|
2
|
+
# All files in this distribution are subject to the terms of the Ruby license.
|
3
|
+
|
4
|
+
require 'rake'
|
5
|
+
require 'lib/ramaze/snippets/divide'
|
6
|
+
|
7
|
+
spec_base = File.expand_path('spec/ramaze/')
|
8
|
+
example_base = File.expand_path('examples')
|
9
|
+
snippets_base = File.expand_path('spec/snippets')
|
10
|
+
# ignore files with these paths
|
11
|
+
ignores = [ './*', './helper/*', './ramaze/adapter.rb', './ramaze/request.rb', ]
|
12
|
+
|
13
|
+
files = Dir[spec_base/'**'/'*.rb'] +
|
14
|
+
Dir[example_base/'**/spec'/'*.rb']
|
15
|
+
ignores.each do |ignore|
|
16
|
+
ignore_files = Dir[spec_base/ignore]
|
17
|
+
ignore_files.each do |ignore_file|
|
18
|
+
files.delete File.expand_path(ignore_file)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
files.sort!
|
23
|
+
|
24
|
+
last = files.pop
|
25
|
+
|
26
|
+
COV_CMD = "rcov --aggregate coverage.data --%shtml -%s -x gem -x rack %s"
|
27
|
+
|
28
|
+
def sys(cmd)
|
29
|
+
puts cmd
|
30
|
+
system(cmd)
|
31
|
+
end
|
32
|
+
|
33
|
+
task :coverage => :clean do
|
34
|
+
# these are the tests that can be run in parallel.
|
35
|
+
# IMHO, ideally we should have
|
36
|
+
# * 100% coverage of ramaze with pure tests
|
37
|
+
# * 100% coverage with non-pure functional tests
|
38
|
+
pure_specs = Dir[snippets_base/'**/*.rb'].entries
|
39
|
+
sys(COV_CMD % ["no-","t", pure_specs.join(' ')])
|
40
|
+
|
41
|
+
files.each do |file|
|
42
|
+
sys(COV_CMD % ["no-","t", file])
|
43
|
+
end
|
44
|
+
sys(COV_CMD % ["", "t", last] )
|
45
|
+
|
46
|
+
end
|
data/rake_tasks/spec.rake
CHANGED
data/spec/contrib/auto_params.rb
CHANGED
@@ -1,13 +1,14 @@
|
|
1
1
|
require 'spec/helper'
|
2
2
|
testcase_requires 'ruby2ruby'
|
3
3
|
|
4
|
-
require 'ramaze/contrib'
|
5
4
|
Ramaze.contrib :auto_params
|
6
5
|
|
7
6
|
module AnotherController
|
8
7
|
def another_page
|
9
8
|
'another page'
|
10
9
|
end
|
10
|
+
|
11
|
+
define_method(:css/'style.css') { 'style.css' }
|
11
12
|
end
|
12
13
|
|
13
14
|
class MainController < Ramaze::Controller
|
@@ -94,4 +95,8 @@ describe 'Normal behavior' do
|
|
94
95
|
it 'should work with included actions' do
|
95
96
|
get('/another_page').body.should == 'another page'
|
96
97
|
end
|
98
|
+
|
99
|
+
it 'should work with /' do
|
100
|
+
get('/css/style.css').body.should == 'style.css'
|
101
|
+
end
|
97
102
|
end
|