ramaze 0.1.4 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +26 -6
- data/bin/ramaze +8 -1
- data/doc/AUTHORS +13 -11
- data/doc/CHANGELOG +472 -13
- data/doc/LEGAL +22 -0
- data/doc/README +1 -4
- data/doc/TODO +7 -2
- data/doc/changes.txt +472 -13
- data/doc/changes.xml +472 -13
- data/doc/meta/announcement.txt +21 -23
- data/doc/readme_chunks/appendix.txt +0 -3
- data/doc/readme_chunks/features.txt +1 -1
- data/examples/auth/auth.rb +49 -0
- data/examples/auth/template/layout.haml +20 -0
- data/examples/auth/template/login.haml +16 -0
- data/examples/blog/spec/blog.rb +1 -0
- data/examples/caching.rb +5 -6
- data/examples/css.rb +37 -0
- data/examples/layout.rb +3 -17
- data/examples/simple_auth.rb +23 -0
- data/examples/sourceview/public/images/file.gif +0 -0
- data/examples/sourceview/public/images/folder.gif +0 -0
- data/examples/sourceview/public/images/tv-collapsable-last.gif +0 -0
- data/examples/sourceview/public/images/tv-collapsable.gif +0 -0
- data/examples/sourceview/public/images/tv-expandable-last.gif +0 -0
- data/examples/sourceview/public/images/tv-expandable.gif +0 -0
- data/examples/sourceview/public/images/tv-item-last.gif +0 -0
- data/examples/sourceview/public/images/tv-item.gif +0 -0
- data/examples/sourceview/public/jquery.js +11 -0
- data/examples/sourceview/public/jquery.treeview.css +47 -0
- data/examples/sourceview/public/jquery.treeview.js +223 -0
- data/examples/sourceview/public/sourceview.js +16 -0
- data/examples/sourceview/sourceview.rb +74 -0
- data/examples/sourceview/template/index.haml +43 -0
- data/examples/templates/template/external.nag +28 -0
- data/examples/templates/template/external.xsl +57 -0
- data/examples/templates/template_amrita2.rb +2 -4
- data/examples/templates/template_erubis.rb +1 -1
- data/examples/templates/template_haml.rb +1 -1
- data/examples/templates/template_liquid.rb +2 -4
- data/examples/templates/template_markaby.rb +2 -4
- data/examples/templates/template_nagoro.rb +53 -0
- data/examples/templates/template_remarkably.rb +2 -4
- data/examples/templates/template_xslt.rb +52 -0
- data/examples/whywiki/spec/whywiki.rb +63 -0
- data/examples/whywiki/start.rb +11 -13
- data/examples/whywiki/template/edit.xhtml +3 -3
- data/examples/whywiki/template/show.xhtml +5 -8
- data/examples/wikore/spec/wikore.rb +115 -0
- data/examples/wikore/src/controller.rb +81 -0
- data/examples/wikore/src/model.rb +51 -0
- data/examples/wikore/start.rb +6 -0
- data/examples/wikore/template/index.xhtml +8 -0
- data/examples/wiktacular/spec/wiktacular.rb +1 -0
- data/examples/wiktacular/src/controller.rb +1 -1
- data/lib/ramaze.rb +6 -3
- data/lib/ramaze/action.rb +2 -13
- data/lib/ramaze/action/render.rb +36 -18
- data/lib/ramaze/adapter.rb +1 -1
- data/lib/ramaze/adapter/cgi.rb +0 -3
- data/lib/ramaze/adapter/evented_mongrel.rb +7 -0
- data/lib/ramaze/adapter/mongrel.rb +4 -13
- data/lib/ramaze/adapter/swiftiplied_mongrel.rb +7 -0
- data/lib/ramaze/cache.rb +12 -7
- data/lib/ramaze/contrib.rb +22 -0
- data/lib/ramaze/contrib/auto_params.rb +128 -0
- data/lib/ramaze/contrib/auto_params/get_args.rb +56 -0
- data/lib/ramaze/contrib/gzip_filter.rb +57 -0
- data/lib/ramaze/contrib/route.rb +40 -0
- data/lib/ramaze/contrib/sequel/fill.rb +12 -0
- data/lib/ramaze/controller.rb +17 -6
- data/lib/ramaze/controller/resolve.rb +51 -14
- data/lib/ramaze/dispatcher.rb +15 -13
- data/lib/ramaze/dispatcher/action.rb +4 -3
- data/lib/ramaze/dispatcher/directory.rb +3 -3
- data/lib/ramaze/dispatcher/error.rb +1 -1
- data/lib/ramaze/dispatcher/file.rb +17 -6
- data/lib/ramaze/error.rb +3 -0
- data/lib/ramaze/gestalt.rb +28 -8
- data/lib/ramaze/global.rb +26 -6
- data/lib/ramaze/global/globalstruct.rb +31 -6
- data/lib/ramaze/helper.rb +2 -1
- data/lib/ramaze/helper/aspect.rb +2 -2
- data/lib/ramaze/helper/auth.rb +6 -9
- data/lib/ramaze/helper/cache.rb +89 -9
- data/lib/ramaze/helper/cgi.rb +2 -2
- data/lib/ramaze/helper/formatting.rb +44 -0
- data/lib/ramaze/helper/link.rb +7 -5
- data/lib/ramaze/helper/partial.rb +6 -4
- data/lib/ramaze/helper/redirect.rb +24 -9
- data/lib/ramaze/helper/stack.rb +6 -1
- data/lib/ramaze/inform/growl.rb +1 -1
- data/lib/ramaze/inform/informer.rb +2 -1
- data/lib/ramaze/inform/informing.rb +6 -0
- data/lib/ramaze/inform/syslog.rb +1 -0
- data/lib/ramaze/snippets/array/put_within.rb +24 -0
- data/lib/ramaze/snippets/dictionary.rb +499 -0
- data/lib/ramaze/snippets/numeric/filesize_format.rb +19 -0
- data/lib/ramaze/snippets/ordered_set.rb +31 -0
- data/lib/ramaze/snippets/string/DIVIDE.rb +1 -1
- data/lib/ramaze/snippets/string/snake_case.rb +1 -1
- data/lib/ramaze/snippets/struct/values_at.rb +5 -1
- data/lib/ramaze/snippets/thread/into.rb +25 -0
- data/lib/ramaze/sourcereload.rb +39 -19
- data/lib/ramaze/spec/helper.rb +4 -1
- data/lib/ramaze/spec/helper/{context.rb → browser.rb} +3 -0
- data/lib/ramaze/spec/helper/layout.rb +3 -0
- data/lib/ramaze/spec/helper/minimal.rb +3 -0
- data/lib/ramaze/spec/helper/mock_http.rb +8 -5
- data/lib/ramaze/spec/helper/requester.rb +4 -1
- data/lib/ramaze/spec/helper/wrap.rb +15 -7
- data/lib/ramaze/template.rb +5 -1
- data/lib/ramaze/template/ezamar/engine.rb +2 -3
- data/lib/ramaze/template/ezamar/morpher.rb +26 -45
- data/lib/ramaze/template/nagoro.rb +53 -0
- data/lib/ramaze/template/none.rb +14 -0
- data/lib/ramaze/template/xslt.rb +96 -0
- data/lib/ramaze/tool.rb +0 -1
- data/lib/ramaze/tool/localize.rb +7 -2
- data/lib/ramaze/trinity/request.rb +1 -0
- data/lib/ramaze/trinity/session.rb +3 -3
- data/lib/ramaze/version.rb +2 -2
- data/rake_tasks/conf.rake +1 -2
- data/rake_tasks/{maintaince.rake → maintenance.rake} +25 -17
- data/spec/contrib/auto_params.rb +97 -0
- data/spec/contrib/route.rb +60 -0
- data/spec/contrib/sequel/fill.rb +46 -0
- data/spec/examples/caching.rb +1 -2
- data/spec/examples/css.rb +12 -0
- data/spec/examples/element.rb +0 -1
- data/spec/examples/hello.rb +0 -1
- data/spec/examples/simple.rb +0 -1
- data/spec/helper.rb +3 -2
- data/spec/ramaze/action/cache.rb +24 -7
- data/spec/ramaze/action/layout.rb +19 -11
- data/spec/ramaze/action/template/sub/sub_wrapper.xhtml +1 -0
- data/spec/ramaze/controller.rb +11 -0
- data/spec/ramaze/controller/template_resolving.rb +28 -27
- data/spec/ramaze/dispatcher.rb +32 -0
- data/spec/ramaze/dispatcher/directory.rb +2 -1
- data/spec/ramaze/element.rb +1 -1
- data/spec/ramaze/gestalt.rb +28 -0
- data/spec/ramaze/helper/aspect.rb +14 -3
- data/spec/ramaze/helper/cache.rb +78 -13
- data/spec/ramaze/helper/formatting.rb +20 -0
- data/spec/ramaze/helper/link.rb +2 -0
- data/spec/ramaze/helper/partial.rb +12 -1
- data/spec/ramaze/helper/redirect.rb +44 -8
- data/spec/ramaze/helper/stack.rb +3 -3
- data/spec/ramaze/helper/template/loop.xhtml +3 -0
- data/spec/ramaze/helper/template/num.xhtml +1 -0
- data/spec/ramaze/helper/template/recursive.xhtml +8 -0
- data/spec/ramaze/morpher.rb +25 -6
- data/spec/ramaze/params.rb +6 -2
- data/spec/ramaze/request.rb +5 -2
- data/spec/ramaze/session.rb +19 -0
- data/spec/ramaze/template.rb +2 -2
- data/spec/ramaze/template/amrita2.rb +2 -2
- data/spec/ramaze/template/erubis.rb +2 -2
- data/spec/ramaze/template/ezamar.rb +6 -3
- data/spec/ramaze/template/haml.rb +3 -3
- data/spec/ramaze/template/liquid.rb +1 -1
- data/spec/ramaze/template/markaby.rb +1 -1
- data/spec/ramaze/template/nagoro.rb +65 -0
- data/spec/ramaze/template/nagoro/another/long/action.nag +1 -0
- data/spec/ramaze/template/nagoro/combined.nag +1 -0
- data/spec/ramaze/template/nagoro/file_only.nag +1 -0
- data/spec/ramaze/template/nagoro/index.nag +1 -0
- data/spec/ramaze/template/nagoro/nested.nag +1 -0
- data/spec/ramaze/template/nagoro/some__long__action.nag +1 -0
- data/spec/ramaze/template/nagoro/sum.nag +1 -0
- data/spec/ramaze/template/remarkably.rb +1 -1
- data/spec/ramaze/template/sass.rb +1 -1
- data/spec/ramaze/template/xslt.rb +93 -0
- data/spec/ramaze/template/xslt/concat_words.xsl +16 -0
- data/spec/ramaze/template/xslt/index.xsl +14 -0
- data/spec/ramaze/template/xslt/products.xsl +32 -0
- data/spec/ramaze/template/xslt/ruby_version.xsl +14 -0
- data/spec/snippets/array/put_within.rb +32 -0
- data/spec/snippets/numeric/filesize_format.rb +12 -0
- data/spec/snippets/ordered_set.rb +56 -0
- data/spec/snippets/ramaze/caller_lines.rb +6 -3
- data/spec/snippets/string/snake_case.rb +3 -0
- metadata +118 -22
- data/doc/README.html +0 -737
- data/examples/fcgi.rb +0 -13
- data/lib/ramaze/snippets/numeric/human_readable_filesize_format.rb +0 -33
- data/lib/ramaze/tool/tidy.rb +0 -104
- data/spec/ramaze/controller/template/edit.xhtml +0 -1
- data/spec/ramaze/controller/template/edit/content.xhtml +0 -1
- data/spec/ramaze/tidy.rb +0 -12
- data/spec/snippets/numeric/human_readable_filesize_format.rb +0 -11
@@ -0,0 +1,53 @@
|
|
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 'nagoro'
|
5
|
+
|
6
|
+
module Ramaze
|
7
|
+
module Template
|
8
|
+
|
9
|
+
# Is responsible for compiling a template using the Nagoro templating engine.
|
10
|
+
|
11
|
+
class Nagoro < Template
|
12
|
+
|
13
|
+
ENGINES[self] = %w[ xhtml nag ]
|
14
|
+
|
15
|
+
LISTENERS = [ :Element, :Morpher, :Include, :Instruction ]
|
16
|
+
|
17
|
+
TEMPLATE = ::Nagoro::Template[LISTENERS]
|
18
|
+
|
19
|
+
class << self
|
20
|
+
|
21
|
+
# Transforms an action into the XHTML code for parsing and returns
|
22
|
+
# the result
|
23
|
+
def transform action
|
24
|
+
nagoro = wrap_compile(action)
|
25
|
+
file = action.template || action.method
|
26
|
+
nagoro.result(action.binding, file.to_s)
|
27
|
+
end
|
28
|
+
|
29
|
+
def wrap_compile(action, template = nil)
|
30
|
+
template ||= file_or_result(action)
|
31
|
+
caching_compile(action, template)
|
32
|
+
end
|
33
|
+
|
34
|
+
def file_or_result(action)
|
35
|
+
result = render_method(action).to_s
|
36
|
+
|
37
|
+
if file = action.template
|
38
|
+
return File.new(file)
|
39
|
+
end
|
40
|
+
|
41
|
+
result
|
42
|
+
end
|
43
|
+
|
44
|
+
# Compile a template, applying all transformations from the pipeline
|
45
|
+
# and returning an instance of ::Nagoro::Template
|
46
|
+
|
47
|
+
def compile(action, template)
|
48
|
+
TEMPLATE.render(template)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,14 @@
|
|
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
|
+
module Ramaze
|
5
|
+
module Template
|
6
|
+
|
7
|
+
class None < Template
|
8
|
+
def self.transform action
|
9
|
+
render_method(action)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,96 @@
|
|
1
|
+
# Copyright (c) 2007 Stephan Maka stephan@spaceboyz.net
|
2
|
+
# All files in this distribution are subject to the terms of the Ruby license.
|
3
|
+
|
4
|
+
require 'xml/libxml'
|
5
|
+
require 'xml/xslt'
|
6
|
+
require 'thread'
|
7
|
+
|
8
|
+
module Ramaze
|
9
|
+
|
10
|
+
# Use the Gestalt helper to put your controller result
|
11
|
+
# into proper XML form
|
12
|
+
#
|
13
|
+
# TODO:
|
14
|
+
# * Error handling
|
15
|
+
# * Maybe prevent extFunction to be called by HTTP
|
16
|
+
module Template
|
17
|
+
class XSLT < Template
|
18
|
+
ENGINES[self] = %w[ xsl ]
|
19
|
+
|
20
|
+
XSLT_EXT_FUNCTIONS_LOCK = Mutex.new
|
21
|
+
|
22
|
+
class << self
|
23
|
+
|
24
|
+
# Entry point for Action#render
|
25
|
+
|
26
|
+
def transform action
|
27
|
+
|
28
|
+
if options = action.instance.ancestral_trait[:xslt_options] and
|
29
|
+
fun_xmlns = options[:fun_xmlns]
|
30
|
+
# If a controller uses extFunctions, lock the whole
|
31
|
+
# transform action with a Mutex to prevent mixing
|
32
|
+
# extFunction binding and callback of two controller
|
33
|
+
# instances with one fun_xmlns.
|
34
|
+
ext_functions_synchronize do
|
35
|
+
register_ext_functions action.instance, fun_xmlns
|
36
|
+
do_transform action
|
37
|
+
end
|
38
|
+
|
39
|
+
else
|
40
|
+
do_transform action
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
|
45
|
+
private
|
46
|
+
|
47
|
+
def do_transform(action)
|
48
|
+
result, file = result_and_file(action)
|
49
|
+
|
50
|
+
xslt = XML::XSLT.new
|
51
|
+
xslt.xsl = action.template
|
52
|
+
xslt.xml = result
|
53
|
+
xslt.serve
|
54
|
+
end
|
55
|
+
|
56
|
+
def ext_functions_synchronize &block
|
57
|
+
XSLT_EXT_FUNCTIONS_LOCK.synchronize &block
|
58
|
+
end
|
59
|
+
|
60
|
+
def register_ext_functions instance, fun_xmlns
|
61
|
+
|
62
|
+
instance.methods.each do |method|
|
63
|
+
if method =~ /^xslt_.+/
|
64
|
+
method_name = method[5..-1]
|
65
|
+
|
66
|
+
proxy_instance = make_functor(method_name.intern) { |*a|
|
67
|
+
instance.send method.intern, *a
|
68
|
+
}
|
69
|
+
|
70
|
+
XML::XSLT.extFunction method_name.gsub('_', '-'), fun_xmlns, proxy_instance
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
# Can be replaced by Ruby Facets' Functor pattern
|
77
|
+
def make_functor(m, &block)
|
78
|
+
# Create anonymous class and instantiate;
|
79
|
+
# anonymous because only this one object with this
|
80
|
+
# particular custom method should call &block
|
81
|
+
o = Class.new.new
|
82
|
+
|
83
|
+
class << o
|
84
|
+
def create_method(name, &block)
|
85
|
+
self.class.send(:define_method, name, &block)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
o.create_method(m, &block)
|
90
|
+
o
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
end
|
data/lib/ramaze/tool.rb
CHANGED
data/lib/ramaze/tool/localize.rb
CHANGED
@@ -7,6 +7,10 @@ require 'ya2yaml'
|
|
7
7
|
# Localize helps transforming arbitrary text into localized forms using
|
8
8
|
# a simple regular expression and substituting occurences with predefined
|
9
9
|
# snippets stored in YAML files.
|
10
|
+
#
|
11
|
+
# == Usage:
|
12
|
+
#
|
13
|
+
# Ramaze::Dispatcher::Action::FILTER << Ramaze::Tool::Localize
|
10
14
|
|
11
15
|
class Ramaze::Tool::Localize
|
12
16
|
|
@@ -55,7 +59,7 @@ class Ramaze::Tool::Localize
|
|
55
59
|
# `localize` for more information.
|
56
60
|
|
57
61
|
def localize_body(body, options)
|
58
|
-
locale = session[:LOCALE] || set_session_locale
|
62
|
+
locale = (session[:LOCALE] || set_session_locale).to_s
|
59
63
|
|
60
64
|
body.gsub!(trait[:regex]) do
|
61
65
|
localize($1, locale) unless $1.to_s.empty?
|
@@ -118,6 +122,7 @@ class Ramaze::Tool::Localize
|
|
118
122
|
# Returns the dictionary used for translation.
|
119
123
|
|
120
124
|
def dictionary
|
125
|
+
trait[:languages].map! {|x| x.to_s }.uniq!
|
121
126
|
trait[:dictionary] || load(*trait[:languages])
|
122
127
|
end
|
123
128
|
|
@@ -143,7 +148,7 @@ class Ramaze::Tool::Localize
|
|
143
148
|
|
144
149
|
def store(*locales)
|
145
150
|
locales.uniq.compact.each do |locale|
|
146
|
-
Ramaze::Inform.
|
151
|
+
Ramaze::Inform.dev "saving localized to: #{trait[:file] % locale}"
|
147
152
|
data = dictionary[locale].ya2yaml
|
148
153
|
file = trait[:file] % locale
|
149
154
|
File.open(file, File::CREAT|File::TRUNC|File::WRONLY) do |fd|
|
@@ -60,15 +60,15 @@ module Ramaze
|
|
60
60
|
|
61
61
|
# the key used for the cookie
|
62
62
|
|
63
|
-
SESSION_KEY = '_ramaze_session_id'
|
63
|
+
SESSION_KEY = '_ramaze_session_id' unless defined?(SESSION_KEY)
|
64
64
|
|
65
65
|
# Holds counter for IPs
|
66
66
|
|
67
|
-
IP_COUNT = Hash.new{|h,k| h[k] =
|
67
|
+
IP_COUNT = Hash.new{|h,k| h[k] = OrderedSet.new} unless defined?(IP_COUNT)
|
68
68
|
|
69
69
|
# Limit the number of sessions one IP is allowed to hold.
|
70
70
|
|
71
|
-
IP_COUNT_LIMIT = 1000
|
71
|
+
IP_COUNT_LIMIT = 1000 unless defined?(IP_COUNT_LIMIT)
|
72
72
|
|
73
73
|
class << self
|
74
74
|
|
data/lib/ramaze/version.rb
CHANGED
data/rake_tasks/conf.rake
CHANGED
@@ -7,8 +7,7 @@ BIN_FILES = %w( ramaze )
|
|
7
7
|
BASEDIR = File.expand_path(File.join(File.dirname(__FILE__), '..'))
|
8
8
|
|
9
9
|
NAME = "ramaze"
|
10
|
-
|
11
|
-
VERS = ENV['VERSION'] || (Ramaze::VERSION + (REV ? ".#{REV}" : ""))
|
10
|
+
VERS = Ramaze::VERSION
|
12
11
|
COPYRIGHT = [
|
13
12
|
"# Copyright (c) 2006 Michael Fellinger m.fellinger@gmail.com",
|
14
13
|
"# All files in this distribution are subject to the terms of the Ruby license."
|
@@ -1,10 +1,16 @@
|
|
1
1
|
desc "add copyright to all .rb files in the distribution"
|
2
2
|
task 'add-copyright' do
|
3
|
+
ignore = File.readlines('doc/LEGAL').
|
4
|
+
select{|line| line.strip!; File.exist?(line)}.
|
5
|
+
map{|file| File.expand_path(file)}
|
6
|
+
|
3
7
|
puts "adding copyright to files that don't have it currently"
|
4
8
|
puts COPYRIGHT
|
5
9
|
puts
|
10
|
+
|
6
11
|
Dir['{lib,test}/**/*{.rb}'].each do |file|
|
7
|
-
|
12
|
+
file = File.expand_path(file)
|
13
|
+
next if file =~ /_darcs/ or ignore.include? file
|
8
14
|
lines = File.readlines(file).map{|l| l.chomp}
|
9
15
|
unless lines.first(COPYRIGHT.size) == COPYRIGHT
|
10
16
|
puts "#{file} seems to need attention, first 4 lines:"
|
@@ -197,11 +203,7 @@ task 'tutorial' => ['tutorial2html'] do
|
|
197
203
|
end
|
198
204
|
end
|
199
205
|
|
200
|
-
|
201
|
-
task 'authors' do
|
202
|
-
changes = `darcs changes`
|
203
|
-
authors = []
|
204
|
-
mapping = {}
|
206
|
+
def authors
|
205
207
|
author_map = {
|
206
208
|
'm.fellinger@gmail.com' => 'Michael Fellinger',
|
207
209
|
'manveru@weez-int.com' => 'Michael Fellinger',
|
@@ -210,26 +212,32 @@ task 'authors' do
|
|
210
212
|
'rff.rff@gmail.com' => 'Gabriele Renzi',
|
211
213
|
'comp.lang.zenix+ramaze@gmail.com' => 'zenix',
|
212
214
|
'jesuswasramazing.10.pistos@geoshell.com' => 'Pistos',
|
215
|
+
'stephan@spaceboyz.net' => 'Stephan Maka',
|
213
216
|
}
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
email.gsub
|
217
|
+
|
218
|
+
mapping = {}
|
219
|
+
`darcs changes`.split("\n").grep(/^\w/).each do |line|
|
220
|
+
author = line.split[6..-1]
|
221
|
+
email = author.pop.gsub(/<(.*?)>/, '\1')
|
219
222
|
name = author.join(' ')
|
220
223
|
name = author_map[email] if name.empty?
|
221
|
-
mapping[name]
|
224
|
+
mapping[name] ||= { :email => email, :patches => 0 }
|
225
|
+
mapping[name][:patches] += 1
|
222
226
|
end
|
223
|
-
pp mapping
|
224
227
|
|
225
|
-
max = mapping.map{|k,v| k.
|
228
|
+
max = mapping.map{|k,v| k.length}.max
|
229
|
+
mapping.inject({}) {|h,(k,v)| h[k.ljust(max)] = v; h}
|
230
|
+
end
|
226
231
|
|
232
|
+
desc "Update /doc/AUTHORS"
|
233
|
+
task 'authors' do
|
227
234
|
File.open('doc/AUTHORS', 'w+') do |fp|
|
228
|
-
fp.puts
|
235
|
+
fp.puts "Following persons (in alphabetical order) have contributed to Ramaze:"
|
229
236
|
fp.puts
|
230
|
-
|
231
|
-
fp.puts
|
237
|
+
authors.sort_by{|k,v| k}.each do |name, author|
|
238
|
+
fp.puts " #{name} - #{author[:email]}"
|
232
239
|
end
|
240
|
+
fp.puts
|
233
241
|
end
|
234
242
|
end
|
235
243
|
|
@@ -0,0 +1,97 @@
|
|
1
|
+
require 'spec/helper'
|
2
|
+
testcase_requires 'ruby2ruby'
|
3
|
+
|
4
|
+
require 'ramaze/contrib'
|
5
|
+
Ramaze.contrib :auto_params
|
6
|
+
|
7
|
+
module AnotherController
|
8
|
+
def another_page
|
9
|
+
'another page'
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class MainController < Ramaze::Controller
|
14
|
+
include AnotherController
|
15
|
+
engine :None
|
16
|
+
|
17
|
+
def search query
|
18
|
+
query.inspect
|
19
|
+
end
|
20
|
+
|
21
|
+
def create name, age = '?', occupation = nil
|
22
|
+
[name, age, occupation].compact.join(', ')
|
23
|
+
end
|
24
|
+
|
25
|
+
def show *args
|
26
|
+
args.join(', ')
|
27
|
+
end
|
28
|
+
|
29
|
+
def add item, price = 1.0, *args
|
30
|
+
[item, price, *args].join(', ')
|
31
|
+
end
|
32
|
+
|
33
|
+
def find width, height, depth
|
34
|
+
[width, height, depth].join(', ')
|
35
|
+
end
|
36
|
+
|
37
|
+
define_method('page') do
|
38
|
+
'page'
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe 'Parameterized actions' do
|
43
|
+
before(:all) { ramaze }
|
44
|
+
|
45
|
+
it 'should pass in values from request.params' do
|
46
|
+
get('/create/Aman/20').body.should == 'Aman, 20'
|
47
|
+
get('/create', :name => 'Aman', :age => 20).body.should == 'Aman, 20'
|
48
|
+
|
49
|
+
get('/create/Aman/20/Unemployed').body.should == 'Aman, 20, Unemployed'
|
50
|
+
get('/create', :name => 'Aman', :age => 20, :occupation => 'Unemployed').body.should == 'Aman, 20, Unemployed'
|
51
|
+
|
52
|
+
get('/create/Aman').body.should == 'Aman, ?'
|
53
|
+
get('/create', :name => 'Aman').body.should == 'Aman, ?'
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'should insert nil for arguments not found' do
|
57
|
+
get('/find', :width => 10, :depth => 20).body.should == '10, , 20'
|
58
|
+
end
|
59
|
+
|
60
|
+
it 'should work with variable arguments' do
|
61
|
+
get('/show/1/2/3').body.should == '1, 2, 3'
|
62
|
+
|
63
|
+
get('/add/Shoe').body.should == 'Shoe, 1.0'
|
64
|
+
get('/add', :item => 'Shoe').body.should == 'Shoe, 1.0'
|
65
|
+
|
66
|
+
get('/add/Shoe/10.50/1/2/3').body.should == 'Shoe, 10.50, 1, 2, 3'
|
67
|
+
get('/add/Shoe/11.00').body.should == 'Shoe, 11.00'
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'should not break existing methods' do
|
71
|
+
get('/search/Aman').body.should == '"Aman"'
|
72
|
+
get('/search', 'query=Aman').body.should == '"Aman"'
|
73
|
+
get('/search/tmm1', 'query=Aman').body.should == ['tmm1','Aman'].inspect
|
74
|
+
end
|
75
|
+
|
76
|
+
it 'should consolidate all values for the same key into an array' do
|
77
|
+
get('/add', 'item=Shoe&item=Shirt').body.should == 'Shoe, Shirt, 1.0'
|
78
|
+
get('/add/Pants', 'item=Shoe&item=Shirt').body.should == 'Pants, Shoe, Shirt, 1.0'
|
79
|
+
get('/add/Shoe', :item => 'Shirt').body.should == 'Shoe, Shirt, 1.0'
|
80
|
+
end
|
81
|
+
end if method(:puts).respond_to? :get_args
|
82
|
+
|
83
|
+
describe 'Normal behavior' do
|
84
|
+
before(:all) { ramaze }
|
85
|
+
|
86
|
+
it 'should work with no arguments' do
|
87
|
+
get('/page').body.should == 'page'
|
88
|
+
end
|
89
|
+
|
90
|
+
it 'should raise no action' do
|
91
|
+
get('/none').body.should =~ /^No Action found/
|
92
|
+
end
|
93
|
+
|
94
|
+
it 'should work with included actions' do
|
95
|
+
get('/another_page').body.should == 'another page'
|
96
|
+
end
|
97
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec/helper'
|
2
|
+
|
3
|
+
require 'ramaze/contrib'
|
4
|
+
|
5
|
+
class MainController < Ramaze::Controller
|
6
|
+
def float(flt)
|
7
|
+
"Float: #{flt}"
|
8
|
+
end
|
9
|
+
|
10
|
+
def string(str)
|
11
|
+
"String: #{str}"
|
12
|
+
end
|
13
|
+
|
14
|
+
def price(p)
|
15
|
+
"Price: \$#{p}"
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
describe 'Route' do
|
20
|
+
before :all do
|
21
|
+
Ramaze.contrib :route
|
22
|
+
ramaze
|
23
|
+
@route = Ramaze::Contrib::Route
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'should be possible to define routes' do
|
27
|
+
@route[%r!^/(\d+\.\d{2})$!] = "/price/%.2f"
|
28
|
+
@route[%r!^/(\d+\.\d{2})$!].should == "/price/%.2f"
|
29
|
+
|
30
|
+
@route[%r!^/(\d+\.\d+)!] = "/float/%.3f"
|
31
|
+
@route[%r!^/(\d+\.\d+)!].should == "/float/%.3f"
|
32
|
+
|
33
|
+
@route[%r!^/(\w+)!] = "/string/%s"
|
34
|
+
@route[%r!^/(\w+)!].should == "/string/%s"
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'should be used - /float' do
|
38
|
+
r = get('/123.123')
|
39
|
+
r.status.should == 200
|
40
|
+
r.body.should == 'Float: 123.123'
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'should be used - /string' do
|
44
|
+
r = get('/foo')
|
45
|
+
r.status.should == 200
|
46
|
+
r.body.should == 'String: foo'
|
47
|
+
end
|
48
|
+
|
49
|
+
it 'should use %.3f' do
|
50
|
+
r = get('/123.123456')
|
51
|
+
r.status.should == 200
|
52
|
+
r.body.should == 'Float: 123.123'
|
53
|
+
end
|
54
|
+
|
55
|
+
it 'should resolve in the order added' do
|
56
|
+
r = get('/12.84')
|
57
|
+
r.status.should == 200
|
58
|
+
r.body.should == 'Price: $12.84'
|
59
|
+
end
|
60
|
+
end
|