ramaze 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (89) hide show
  1. data/Rakefile +14 -29
  2. data/bin/ramaze +2 -3
  3. data/doc/AUTHORS +5 -2
  4. data/doc/CHANGELOG +262 -9
  5. data/doc/FAQ +6 -6
  6. data/doc/meta/announcement.txt +5 -19
  7. data/doc/tutorial/todolist.html +47 -57
  8. data/doc/tutorial/todolist.mkd +47 -55
  9. data/examples/memleak_detector.rb +31 -0
  10. data/examples/todolist/src/controller/main.rb +14 -13
  11. data/examples/todolist/src/element/page.rb +2 -2
  12. data/examples/todolist/src/model.rb +2 -2
  13. data/examples/todolist/todolist.db +0 -4
  14. data/examples/whywiki/main.rb +2 -2
  15. data/examples/whywiki/template/edit.xhtml +1 -1
  16. data/examples/whywiki/template/show.xhtml +3 -3
  17. data/lib/proto/src/controller/main.rb +18 -1
  18. data/lib/proto/template/index.xhtml +11 -2
  19. data/lib/ramaze.rb +1 -1
  20. data/lib/ramaze/action.rb +104 -5
  21. data/lib/ramaze/action/render.rb +54 -0
  22. data/lib/ramaze/adapter.rb +2 -1
  23. data/lib/ramaze/adapter/mongrel.rb +13 -4
  24. data/lib/ramaze/cache.rb +17 -8
  25. data/lib/ramaze/cache/memcached.rb +1 -5
  26. data/lib/ramaze/controller.rb +51 -18
  27. data/lib/ramaze/controller/resolve.rb +19 -14
  28. data/lib/ramaze/dispatcher.rb +13 -16
  29. data/lib/ramaze/dispatcher/action.rb +2 -3
  30. data/lib/ramaze/dispatcher/error.rb +8 -3
  31. data/lib/ramaze/dispatcher/file.rb +1 -4
  32. data/lib/ramaze/error.rb +5 -5
  33. data/lib/ramaze/global.rb +7 -1
  34. data/lib/ramaze/global/globalstruct.rb +1 -3
  35. data/lib/ramaze/helper/aspect.rb +8 -10
  36. data/lib/ramaze/helper/cgi.rb +21 -3
  37. data/lib/ramaze/helper/identity.rb +4 -6
  38. data/lib/ramaze/helper/link.rb +4 -4
  39. data/lib/ramaze/helper/pager.rb +316 -0
  40. data/lib/ramaze/helper/partial.rb +37 -0
  41. data/lib/ramaze/helper/stack.rb +1 -1
  42. data/lib/ramaze/inform.rb +9 -0
  43. data/lib/ramaze/inform/hub.rb +5 -0
  44. data/lib/ramaze/inform/informer.rb +12 -6
  45. data/lib/ramaze/inform/informing.rb +32 -7
  46. data/lib/ramaze/inform/knotify.rb +21 -0
  47. data/lib/ramaze/inform/xosd.rb +58 -24
  48. data/lib/ramaze/sourcereload.rb +30 -1
  49. data/lib/ramaze/template.rb +33 -12
  50. data/lib/ramaze/template/amrita2.rb +21 -20
  51. data/lib/ramaze/template/erubis.rb +18 -14
  52. data/lib/ramaze/template/ezamar.rb +15 -26
  53. data/lib/ramaze/template/ezamar/element.rb +1 -1
  54. data/lib/ramaze/template/ezamar/engine.rb +45 -36
  55. data/lib/ramaze/template/ezamar/morpher.rb +3 -3
  56. data/lib/ramaze/template/ezamar/render_partial.rb +26 -0
  57. data/lib/ramaze/template/haml.rb +23 -18
  58. data/lib/ramaze/template/liquid.rb +5 -3
  59. data/lib/ramaze/template/markaby.rb +14 -11
  60. data/lib/ramaze/template/remarkably.rb +11 -5
  61. data/lib/ramaze/tool/localize.rb +12 -4
  62. data/lib/ramaze/tool/tidy.rb +26 -23
  63. data/lib/ramaze/trinity/request.rb +11 -7
  64. data/lib/ramaze/trinity/session.rb +24 -8
  65. data/lib/ramaze/version.rb +1 -1
  66. data/rake_tasks/maintaince.rake +136 -11
  67. data/spec/examples/templates/template_liquid.rb +6 -3
  68. data/spec/examples/todolist.rb +1 -2
  69. data/spec/helper/minimal.rb +7 -7
  70. data/spec/ramaze/action/basics.rb +19 -0
  71. data/spec/ramaze/action/render.rb +18 -0
  72. data/spec/ramaze/controller.rb +1 -1
  73. data/spec/ramaze/controller/template_resolving.rb +1 -1
  74. data/spec/ramaze/dispatcher/file.rb +24 -0
  75. data/spec/ramaze/error.rb +28 -29
  76. data/spec/ramaze/helper/cgi.rb +43 -0
  77. data/spec/ramaze/helper/pager.rb +27 -0
  78. data/spec/ramaze/helper/partial.rb +38 -0
  79. data/spec/ramaze/helper/template/partial.xhtml +1 -0
  80. data/spec/ramaze/inform/informer.rb +1 -1
  81. data/spec/ramaze/localize.rb +1 -1
  82. data/spec/ramaze/morpher.rb +3 -3
  83. data/spec/ramaze/request.rb +1 -3
  84. data/spec/ramaze/template.rb +9 -7
  85. data/spec/ramaze/template/haml.rb +2 -1
  86. metadata +21 -7
  87. data/examples/todolist/public/404.jpg +0 -0
  88. data/examples/todolist/public/error.xhtml +0 -74
  89. data/lib/ramaze/controller/render.rb +0 -90
@@ -29,29 +29,30 @@ module Ramaze
29
29
  :wrap => 500
30
30
  }
31
31
 
32
- # dirty html in, tidy html out
33
- # To activate Tidy for everything outgoing (given that it is of
34
- # Content-Type text/html) set
35
- # Global.tidy = true
36
- # there is almost no speed-tradeoff but makes debugging a much
37
- # nicer experience ;)
38
- #
39
- # Example:
40
- #
41
- # include Ramaze::Tool::Tidy
42
- # puts tidy('<html></html>')
43
- #
44
- # # results in something like:
45
- #
46
- # <html>
47
- # <head>
48
- # <meta name="generator" content="HTML Tidy for Linux/x86 (vers 1 September 2005), see www.w3.org" />
49
- # <title></title>
50
- # </head>
51
- # <body></body>
52
- # </html>
53
-
54
32
  class << self
33
+
34
+ # dirty html in, tidy html out
35
+ # To activate Tidy for everything outgoing (given that it is of
36
+ # Content-Type text/html) set
37
+ # Global.tidy = true
38
+ # there is almost no speed-tradeoff but makes debugging a much
39
+ # nicer experience ;)
40
+ #
41
+ # Example:
42
+ #
43
+ # include Ramaze::Tool::Tidy
44
+ # puts tidy('<html></html>')
45
+ #
46
+ # # results in something like:
47
+ #
48
+ # <html>
49
+ # <head>
50
+ # <meta name="generator" content="HTML Tidy for Linux/x86 (vers 1 September 2005), see www.w3.org" />
51
+ # <title></title>
52
+ # </head>
53
+ # <body></body>
54
+ # </html>
55
+
55
56
  def tidy html, options = {}
56
57
  require 'tidy'
57
58
 
@@ -84,6 +85,8 @@ module Ramaze
84
85
  puts "you can find it at http://tidy.rubyforge.org/"
85
86
  end
86
87
 
88
+ # Enables being plugged into Dispatcher::Action::FILTER
89
+
87
90
  def call(response, options = {})
88
91
  return response unless trait[:enable]
89
92
  response.body = tidy(response.body, options)
@@ -91,7 +94,7 @@ module Ramaze
91
94
  end
92
95
  end
93
96
 
94
- # calls self#tidy
97
+ # calls Tidy::tidy
95
98
 
96
99
  def tidy html, options = {}
97
100
  Ramaze::Tool::Tidy.tidy(html, options)
@@ -40,6 +40,9 @@ module Ramaze
40
40
  # Wrapping Request#params to support a one-level hash notation.
41
41
  # It doesn't support anything really fancy, so be conservative in its use.
42
42
  #
43
+ # See if following provides something useful for us:
44
+ # http://redhanded.hobix.com/2006/01/25.html
45
+ #
43
46
  # Example Usage:
44
47
  #
45
48
  # # Template:
@@ -66,20 +69,21 @@ module Ramaze
66
69
  # end
67
70
 
68
71
  def params
69
- ps = rack_params
70
- temp = {}
72
+ return @ramaze_params if @ramaze_params
73
+ @rack_params ||= rack_params
74
+ @ramaze_params = {}
71
75
 
72
- ps.each do |key, value|
76
+ @rack_params.each do |key, value|
73
77
  outer_key, inner_key = key.scan(/^(.+)\[(.*?)\]$/).first
74
78
  if outer_key and inner_key
75
- temp[outer_key] ||= {}
76
- temp[outer_key][inner_key] = value
79
+ @ramaze_params[outer_key] ||= {}
80
+ @ramaze_params[outer_key][inner_key] = value
77
81
  else
78
- temp[key] = value
82
+ @ramaze_params[key] = value
79
83
  end
80
84
  end
81
85
 
82
- temp
86
+ @ramaze_params
83
87
  end
84
88
  end
85
89
  end
@@ -27,6 +27,8 @@ module Ramaze
27
27
  result
28
28
  end
29
29
 
30
+ # Calls #inspect on the wrapped @hash
31
+
30
32
  def inspect
31
33
  @hash.inspect
32
34
  end
@@ -53,9 +55,13 @@ module Ramaze
53
55
 
54
56
  SESSION_KEY = '_ramaze_session_id'
55
57
 
56
- IP_CACHE = Hash.new{|h,k| h[k] = []}
58
+ # Holds counter for IPs
59
+
60
+ IP_COUNT = Hash.new{|h,k| h[k] = []}
61
+
62
+ # Limit the number of sessions one IP is allowed to hold.
57
63
 
58
- IP_CACHE_LIMIT = 1000
64
+ IP_COUNT_LIMIT = 1000
59
65
 
60
66
  class << self
61
67
 
@@ -81,12 +87,12 @@ module Ramaze
81
87
 
82
88
  def initialize request
83
89
  @session_id = (request.cookies[SESSION_KEY] || random_key)
84
- ip_cache = IP_CACHE
90
+
85
91
  ip = request.remote_addr
86
- ip_cache[ip] << @session_id
92
+ IP_COUNT[ip] << @session_id
87
93
 
88
- if ip_cache[ip].size > IP_CACHE_LIMIT
89
- sessions.delete(ip_cache[ip].shift)
94
+ if IP_COUNT[ip].size > IP_COUNT_LIMIT
95
+ sessions.delete(IP_COUNT[ip].shift)
90
96
  end
91
97
 
92
98
  @flash = Ramaze::SessionFlash.new
@@ -129,6 +135,8 @@ module Ramaze
129
135
  Digest::SHA256.hexdigest(h)
130
136
  end
131
137
 
138
+ # Inspect on Session.current
139
+
132
140
  def inspect
133
141
  current.inspect
134
142
  end
@@ -140,7 +148,7 @@ module Ramaze
140
148
  # and always just keep the current and previous key/value pairs.
141
149
 
142
150
  def finalize
143
- old = delete(:FLASH)
151
+ old = current.delete(:FLASH)
144
152
  current[:FLASH_PREVIOUS] = old if old
145
153
  end
146
154
  end
@@ -176,24 +184,32 @@ module Ramaze
176
184
  previous.merge(current)
177
185
  end
178
186
 
187
+ # flash[key] in your Controller
188
+
179
189
  def [](key)
180
190
  combined[key]
181
191
  end
182
192
 
193
+ # flash[key] = value in your Controller
194
+
183
195
  def []=(key, value)
184
196
  prev = session[:FLASH] || {}
185
197
  prev[key] = value
186
198
  session[:FLASH] = prev
187
199
  end
188
200
 
201
+ # Inspects the combined SessionFlash
202
+
189
203
  def inspect
190
204
  combined.inspect
191
205
  end
192
206
 
193
207
  private
194
208
 
209
+ # Session.current or {}
210
+
195
211
  def session
196
- Ramaze::Session.current || {}
212
+ Session.current || {}
197
213
  end
198
214
  end
199
215
  end
@@ -5,7 +5,7 @@ module Ramaze #:nodoc:
5
5
  module Version #:nodoc:
6
6
  MAJOR = 0
7
7
  MINOR = 1
8
- TINY = 1
8
+ TINY = 2
9
9
 
10
10
  STRING = [MAJOR, MINOR, TINY].join('.')
11
11
  end
@@ -1,16 +1,15 @@
1
1
  desc "add copyright to all .rb files in the distribution"
2
2
  task 'add-copyright' do
3
3
  puts "adding copyright to files that don't have it currently"
4
+ puts COPYRIGHT
5
+ puts
4
6
  Dir['{lib,test}/**/*{.rb}'].each do |file|
5
7
  next if file =~ /_darcs/
6
8
  lines = File.readlines(file).map{|l| l.chomp}
7
9
  unless lines.first(COPYRIGHT.size) == COPYRIGHT
8
- puts "fixing #{file}"
9
- File.open(file, 'w+') do |f|
10
- (COPYRIGHT + ["\n"] + lines).each do |line|
11
- f.puts(line)
12
- end
13
- end
10
+ puts "#{file} seems to need attention, first 4 lines:"
11
+ puts lines[0..3]
12
+ puts
14
13
  end
15
14
  end
16
15
  end
@@ -202,9 +201,12 @@ task 'authors' do
202
201
  authors = []
203
202
  mapping = {}
204
203
  author_map = {
205
- 'm.fellinger@gmail.com' => 'Michael Fellinger',
206
- 'manveru@weez-int.com' => 'Michael Fellinger',
207
- 'clive@crous.co.za' => 'Clive Crous'
204
+ 'm.fellinger@gmail.com' => 'Michael Fellinger',
205
+ 'manveru@weez-int.com' => 'Michael Fellinger',
206
+ 'clive@crous.co.za' => 'Clive Crous',
207
+ 'blueonyx@dev-area.net' => 'Martin Hilbig',
208
+ 'rff.rff@gmail.com' => 'Gabriele Renzi',
209
+ 'comp.lang.zenix+ramaze@gmail.com' => 'zenix',
208
210
  }
209
211
  changes.split("\n").grep(/^\w/).each do |line|
210
212
  splat = line.split
@@ -215,14 +217,137 @@ task 'authors' do
215
217
  name = author_map[email] if name.empty?
216
218
  mapping[name] = email
217
219
  end
220
+ pp mapping
218
221
 
219
222
  max = mapping.map{|k,v| k.size}.max
220
223
 
221
224
  File.open('doc/AUTHORS', 'w+') do |fp|
222
- fp.puts("Following persons have contributed to Ramaze:")
225
+ fp.puts("Following persons (in alphabetical order) have contributed to Ramaze:")
223
226
  fp.puts
224
- mapping.sort_by{|k,v| v}.each do |name, email|
227
+ mapping.sort_by{|k,v| k}.each do |name, email|
225
228
  fp.puts("#{name.ljust(max)} - #{email}")
226
229
  end
227
230
  end
228
231
  end
232
+
233
+ task 'release' => ['distribute'] do
234
+ sh 'rubyforge login'
235
+ sh 'rubyforge add_release ramaze ramaze #{VERS} pkg/ramaze-#{VERS}.gem'
236
+
237
+ require 'open-uri'
238
+ require 'hpricot'
239
+
240
+ url = "http://rubyforge.org/frs/?group_id=3034"
241
+ doc = Hpricot(open(url))
242
+ a = (doc/:a).find{|a| a[:href] =~ /release_id/}
243
+
244
+ version = a.inner_html
245
+ release_id = Hash[*a[:href].split('?').last.split('=').flatten]['release_id']
246
+
247
+ sh "rubyforge add_file ramaze ramaze #{release_id} pkg/ramaze-#{VERS}.tar.gz"
248
+ sh "rubyforge add_file ramaze ramaze #{release_id} pkg/ramaze-#{VERS}.tar.bz2"
249
+ end
250
+
251
+ desc "list all undocumented methods"
252
+ task 'undocumented-module' do
253
+ require 'strscan'
254
+ require 'term/ansicolor'
255
+
256
+ class String
257
+ include Term::ANSIColor
258
+ end
259
+
260
+ class SimpleDoc
261
+ def initialize(string)
262
+ @s = StringScanner.new(string)
263
+ end
264
+
265
+ def scan
266
+ comment = false
267
+ total, missing = [], []
268
+ until @s.eos?
269
+ unless @s.scan(/^\s*#.*/)
270
+ comment = true if @s.scan(/^=begin$/)
271
+ comment = false if comment and @s.scan(/^=end$/)
272
+
273
+ unless comment
274
+ if @s.scan(/(?:class ).*/)
275
+ #p @s.matched
276
+ elsif @s.scan(/(?:module ).*/)
277
+ #p @s.matched
278
+ elsif @s.scan(/(?:def )[\w?!*+\/-]+(?=[\(\s])/)
279
+ total << @s.matched.split.last
280
+ prev = @s.pre_match.split("\n")
281
+ prev.delete_if{|s| s.strip.empty?}
282
+ unless prev.last =~ /^\s*#.*/
283
+ missing << @s.matched.split.last
284
+ end
285
+ else
286
+ @s.scan(/./m)
287
+ end
288
+ end
289
+ end
290
+ end
291
+
292
+ return total, missing
293
+ end
294
+ end
295
+
296
+ all = {}
297
+ files = Dir['lib/**/*.rb']
298
+
299
+ files.each do |file|
300
+ t, m = SimpleDoc.new(File.read(file)).scan
301
+ all[file] = [t, m]
302
+ end
303
+
304
+ failed = all.reject{|k,(t,m)| m.size == 0}
305
+
306
+ max = failed.keys.sort_by{|f| f.size}.last.size
307
+
308
+ colors = {
309
+ (0..25 ) => :blue,
310
+ (25..50 ) => :green,
311
+ (50..75 ) => :yellow,
312
+ (75..100) => :red,
313
+ }
314
+
315
+ puts "\nAll undocumented methods\n\n"
316
+
317
+ failed.sort.each do |file, (t, m)|
318
+ ts, ms = t.size, m.size
319
+ tss, mss = ts.to_s, ms.to_s
320
+ ratio = ((ms.to_f/ts)*100).to_i
321
+ color = colors.find{|k,v| k.include?(ratio)}.last
322
+ complete = ms.to_f/ts.to_f
323
+ mthc = "method"
324
+ if ratio != 100
325
+ puts "#{file.ljust(max)}\t[#{[mss, tss].join('/').center(8)}]".send(color)
326
+ mthc = "methods" if ts > 1
327
+ if $VERBOSE
328
+ puts "Of #{tss} #{mthc}, #{mss} still needs documenting (#{100 - ratio}% documented, #{ratio}% undocumented)".send(color)
329
+ mthc = "method"
330
+ mthc = "methods" if ms > 1
331
+ print "#{mthc.capitalize}: "
332
+ end
333
+ puts m.join(', ')
334
+ puts
335
+ end
336
+ end
337
+
338
+ puts "The colors mean percentages of documentation left (ratio of undocumented methods to total):"
339
+ colors.sort_by{|k,v| k.begin}.each do |r, color|
340
+ print "[#{r.inspect}] ".send(color)
341
+ end
342
+ puts
343
+ end
344
+
345
+ task 'undocumented' do
346
+ $VERBOSE = false
347
+ Rake::Task['undocumented-module'].execute
348
+ end
349
+
350
+ task 'undocumented-verbose' do
351
+ $VERBOSE = true
352
+ Rake::Task['undocumented-module'].execute
353
+ end
@@ -13,10 +13,13 @@ describe 'Template Liquid' do
13
13
 
14
14
  %w[/internal /external].each do |url|
15
15
  it url do
16
- html = get(url).body
16
+ name = url.gsub(/^\//, '')
17
+ response = get(url)
18
+ response.status.should == 200
19
+ html = response.body
17
20
  html.should_not == nil
18
- html.should =~ %r{<title>Template::Liquid (internal|external)</title>}
19
- html.should =~ %r{<h1>The (internal|external) Template for Liquid</h1>}
21
+ html.should =~ %r(<title>Template::Liquid #{name}</title>)
22
+ html.should =~ %r(<h1>The #{name} Template for Liquid</h1>)
20
23
  end
21
24
  end
22
25
  end
@@ -8,7 +8,6 @@ require 'main'
8
8
  # fix the paths to template and public for the spec
9
9
  class MainController
10
10
  template_root 'examples/todolist/template'
11
- public_root 'examples/todolist/public'
12
11
  end
13
12
 
14
13
  describe 'todolist' do
@@ -47,7 +46,7 @@ describe 'todolist' do
47
46
  end
48
47
 
49
48
  it 'should start' do
50
- ramaze :port => 7080
49
+ ramaze :public_root => 'examples/todolist/public', :port => 7080
51
50
  get('/').status.should == 200
52
51
  end
53
52
 
@@ -1,5 +1,10 @@
1
1
  require 'timeout'
2
2
 
3
+ begin
4
+ require 'rubygems'
5
+ rescue LoadError => ex
6
+ end
7
+
3
8
  base = File.expand_path(File.join(File.dirname(__FILE__), '..', '..', 'lib'))
4
9
  $:.unshift base.gsub(/^#{Dir.pwd}/, '.')
5
10
 
@@ -8,13 +13,8 @@ $context_runner = false
8
13
 
9
14
  require 'ramaze'
10
15
 
11
- begin
12
- require 'rubygems'
13
- rescue LoadError => ex
14
- end
15
-
16
16
  require 'spec'
17
- if Spec::VERSION::FULL_VERSION < "0.9.1 (r1880)"
18
- puts "please update rspec >= 0.9.1"
17
+ if Spec::VERSION::FULL_VERSION < "1.0.3 (r2035)"
18
+ puts "please update rspec >= 1.0.3"
19
19
  exit 1
20
20
  end