ramaze 2010.06.18 → 2011.01

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.
Files changed (95) hide show
  1. data/.gitignore +1 -0
  2. data/MANIFEST +9 -16
  3. data/README.md +37 -30
  4. data/Rakefile +5 -1
  5. data/TODO.md +19 -0
  6. data/doc/AUTHORS +5 -1
  7. data/doc/CHANGELOG +3553 -3272
  8. data/doc/tutorial/todolist.html +1512 -1512
  9. data/examples/app/blog/app.rb +2 -0
  10. data/examples/app/todolist/controller/init.rb +1 -2
  11. data/examples/app/wiktacular/mkd/main/2007-07-20_19-21-12.mkd +1 -1
  12. data/examples/app/wiktacular/mkd/main/2007-07-20_19-23-10.mkd +1 -1
  13. data/examples/app/wiktacular/mkd/main/2007-07-20_19-45-07.mkd +1 -1
  14. data/examples/app/wiktacular/mkd/main/current.mkd +1 -1
  15. data/examples/app/wiktacular/mkd/testing/2007-07-20_16-43-46.mkd +1 -1
  16. data/examples/app/wiktacular/mkd/testing/2007-07-20_19-43-50.mkd +2 -2
  17. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-08.mkd +16 -16
  18. data/examples/app/wiktacular/mkd/testing/2007-07-21_18-47-54.mkd +16 -16
  19. data/examples/app/wiktacular/mkd/testing/current.mkd +16 -16
  20. data/lib/proto/model/init.rb +1 -1
  21. data/lib/proto/public/js/jquery.js +2034 -1095
  22. data/lib/proto/start.rb +2 -0
  23. data/lib/proto/view/index.xhtml +3 -3
  24. data/lib/ramaze.rb +1 -2
  25. data/lib/ramaze/cache.rb +1 -0
  26. data/lib/ramaze/cache/sequel.rb +131 -37
  27. data/lib/ramaze/controller.rb +1 -0
  28. data/lib/ramaze/gestalt.rb +75 -46
  29. data/lib/ramaze/helper.rb +1 -0
  30. data/lib/ramaze/helper/auth.rb +38 -4
  31. data/lib/ramaze/helper/blue_form.rb +498 -78
  32. data/lib/ramaze/helper/cache.rb +2 -2
  33. data/lib/ramaze/helper/csrf.rb +225 -0
  34. data/lib/ramaze/helper/erector.rb +67 -9
  35. data/lib/ramaze/helper/flash.rb +4 -2
  36. data/lib/ramaze/helper/gestalt.rb +2 -0
  37. data/lib/ramaze/helper/gravatar.rb +1 -1
  38. data/lib/ramaze/helper/localize.rb +4 -0
  39. data/lib/ramaze/helper/send_file.rb +30 -0
  40. data/lib/ramaze/helper/thread.rb +5 -0
  41. data/lib/ramaze/helper/user.rb +4 -3
  42. data/lib/ramaze/helper/xhtml.rb +87 -8
  43. data/lib/ramaze/log.rb +13 -0
  44. data/lib/ramaze/log/analogger.rb +15 -5
  45. data/lib/ramaze/log/growl.rb +28 -13
  46. data/lib/ramaze/log/hub.rb +12 -4
  47. data/lib/ramaze/log/informer.rb +28 -11
  48. data/lib/ramaze/log/knotify.rb +7 -2
  49. data/lib/ramaze/log/logger.rb +12 -4
  50. data/lib/ramaze/log/logging.rb +40 -14
  51. data/lib/ramaze/log/rotatinginformer.rb +47 -23
  52. data/lib/ramaze/log/syslog.rb +37 -31
  53. data/lib/ramaze/log/xosd.rb +7 -4
  54. data/lib/ramaze/middleware_compiler.rb +2 -2
  55. data/lib/ramaze/snippets/fiber.rb +63 -63
  56. data/lib/ramaze/snippets/ramaze/lru_hash.rb +1 -1
  57. data/lib/ramaze/tool/bin.rb +1 -1
  58. data/lib/ramaze/version.rb +1 -1
  59. data/lib/ramaze/view.rb +4 -4
  60. data/lib/ramaze/view/erector.rb +88 -13
  61. data/ramaze.gemspec +65 -65
  62. data/spec/ramaze/bin/ramaze.rb +1 -1
  63. data/spec/ramaze/cache/localmemcache.rb +20 -12
  64. data/spec/ramaze/cache/sequel.rb +19 -19
  65. data/spec/ramaze/helper/blue_form.rb +549 -257
  66. data/spec/ramaze/helper/csrf.rb +109 -0
  67. data/spec/ramaze/helper/httpdigest.rb +31 -29
  68. data/spec/ramaze/helper/user.rb +1 -1
  69. data/spec/ramaze/helper/xhtml.rb +17 -0
  70. data/spec/ramaze/log/growl.rb +34 -0
  71. data/spec/ramaze/log/informer.rb +1 -0
  72. data/spec/ramaze/view/erector.rb +49 -71
  73. data/spec/ramaze/view/erector/external_view.erector +5 -0
  74. data/spec/ramaze/view/erector/index.erector +5 -0
  75. data/spec/ramaze/view/erector/layout.erector +13 -3
  76. data/spec/ramaze/view/erector/tables.erector +23 -0
  77. data/spec/ramaze/view/erector/view.erector +6 -0
  78. data/tasks/git.rake +2 -2
  79. metadata +133 -176
  80. data/examples/helpers/form_with_sequel.rb +0 -24
  81. data/examples/helpers/nitro_form.rb +0 -23
  82. data/lib/ramaze/helper/form.rb +0 -133
  83. data/lib/ramaze/helper/nitroform.rb +0 -14
  84. data/lib/ramaze/helper/pager.rb +0 -367
  85. data/lib/ramaze/helper/partial.rb +0 -100
  86. data/lib/ramaze/helper/sequel.rb +0 -55
  87. data/lib/ramaze/helper/sequel_form.rb +0 -284
  88. data/lib/vendor/etag.rb +0 -22
  89. data/spec/ramaze/helper/form.rb +0 -360
  90. data/spec/ramaze/helper/pager.rb +0 -96
  91. data/spec/ramaze/helper/sequel_form.rb +0 -94
  92. data/spec/ramaze/view/erector/external.erector +0 -1
  93. data/spec/ramaze/view/erector/invoke_helper_method.erector +0 -1
  94. data/spec/ramaze/view/erector/strict_xhtml.erector +0 -3
  95. data/spec/ramaze/view/erector/sum.erector +0 -1
@@ -3,8 +3,10 @@
3
3
 
4
4
  module Ramaze
5
5
 
6
+ ##
6
7
  # This module provides a basic skeleton for your own loggers to be compatible.
7
- # The minimal usage is like this:
8
+ #
9
+ # @example
8
10
  #
9
11
  # class MyLogger
10
12
  # include Logging
@@ -13,14 +15,19 @@ module Ramaze
13
15
  # p tag => args
14
16
  # end
15
17
  # end
16
-
18
+ #
17
19
  module Logging
18
20
 
21
+ ##
19
22
  # Takes the tag (:warn|:debug|:error|:info) and the name of a method to be
20
23
  # called upon elements of msgs that don't respond to :to_str
21
24
  # Goes on and sends the tag and transformed messages each to the #log method.
22
25
  # If you include this module you have to define #log or it will raise.
23
-
26
+ #
27
+ # @param [String] tag The level of the log message.
28
+ # @param [String] method
29
+ # @param [Array] msgs The data that should be logged.
30
+ #
24
31
  def tag_log(tag, meth, *msgs)
25
32
  msgs.each do |msg|
26
33
  string = (msg.respond_to?(:to_str) ? msg : msg.send(meth))
@@ -28,35 +35,50 @@ module Ramaze
28
35
  end
29
36
  end
30
37
 
38
+ ##
31
39
  # Converts everything given to strings and passes them on with :info
32
-
40
+ #
41
+ # @param [Array] objects An array of objects that need to be converted to strings.
42
+ #
33
43
  def info(*objects)
34
44
  tag_log(:info, :to_s, *objects)
35
45
  end
36
46
 
47
+ ##
37
48
  # Converts everything given to strings and passes them on with :warn
38
-
49
+ #
50
+ # @param [Array] objects An array of objects that need to be converted to strings.
51
+ #
39
52
  def warn(*objects)
40
53
  tag_log(:warn, :to_s, *objects)
41
54
  end
42
55
 
43
- # inspects objects if they are no strings. Tag is :debug
44
-
56
+ ##
57
+ # Inspects objects if they are no strings. Tag is :debug
58
+ #
59
+ # @param [Array] objects An array of objects that will be inspected.
60
+ #
45
61
  def debug(*objects)
46
62
  tag_log(:debug, :inspect, *objects)
47
63
  end
48
64
 
49
- # inspects objects if they are no strings. Tag is :dev
50
-
65
+ ##
66
+ # Inspects objects if they are no strings. Tag is :dev
67
+ #
68
+ # @param [Array] objects An array of objects that will be inspected.
69
+ #
51
70
  def dev(*objects)
52
71
  tag_log(:dev, :inspect, *objects)
53
72
  end
54
73
 
55
74
  alias << debug
56
75
 
76
+ ##
57
77
  # Takes either an Exception or just a String, formats backtraces to be a bit
58
78
  # more readable and passes all of this on to tag_log :error
59
-
79
+ #
80
+ # @param [Object] ex The exception that was raised.
81
+ #
60
82
  def error(ex)
61
83
  if ex.respond_to?(:exception)
62
84
  message = ex.backtrace
@@ -68,13 +90,17 @@ module Ramaze
68
90
  tag_log(:error, :to_s, *message)
69
91
  end
70
92
 
71
- # nothing
72
-
93
+ ##
94
+ # Nothing.
95
+ #
96
+ # THINK: Is this really required? It doesn't do anything anyway.
97
+ #
73
98
  def shutdown
74
99
  end
75
100
 
76
- # stub for WEBrick
77
-
101
+ ##
102
+ # Stub for WEBrick
103
+ #
78
104
  def debug?
79
105
  false
80
106
  end
@@ -2,8 +2,11 @@ module Ramaze
2
2
 
3
3
  module Logger
4
4
 
5
+ ##
5
6
  # A customized logger (based on Informer) that creates multiple log files based on time
6
-
7
+ #
8
+ # TODO: This class isn't fully documented and could use a few improvements.
9
+ #
7
10
  class RotatingInformer
8
11
  include Innate::Traited
9
12
  include Logging
@@ -16,7 +19,8 @@ module Ramaze
16
19
 
17
20
  # This is how the final output is arranged.
18
21
  trait :format => "[%time] %prefix %text"
19
-
22
+
23
+ ##
20
24
  # Create a new instance of RotatingInformer.
21
25
  #
22
26
  # base_dir is the directory where all log files will be stored
@@ -29,21 +33,24 @@ module Ramaze
29
33
  # that the log receives. The array may contain
30
34
  # any or all of the symbols :debug, :error, :info and/or :warn
31
35
  #
32
- # Examples:
36
+ # @example
37
+ #
38
+ # # Creates logs in directory called logs. The generated filenames will be in the form YYYY-MM-DD.log
33
39
  # RotatingInformer.new('logs')
34
- # #=> Creates logs in directory called logs.
35
- # The generated filenames will be in the
36
- # form YYYY-MM-DD.log
40
+ #
41
+ #
42
+ # # Creates logs in directory called logs. The generated filenames will be in the form YYYY-MM.txt
37
43
  # RotatingInformer.new('logs', '%Y-%m.txt')
38
- # #=> Creates logs in directory called logs.
39
- # The generated filenames will be in the
40
- # form YYYY-MM.txt
44
+ #
45
+ #
46
+ # # Creates logs in directory called logs. The generated filenames will be in the form YYYY-MM.txt.
47
+ # # Only errors will be logged to the files.
41
48
  # RotatingInformer.new('logs', '%Y-%m.txt', [:error])
42
- # #=> Creates logs in directory called logs.
43
- # The generated filenames will be in the
44
- # form YYYY-MM.txt. Only errors will be
45
- # logged to the files.
46
-
49
+ #
50
+ # @param [String] base_dir The base directory for all the log files.
51
+ # @param [String] time_format The time format for all log files.
52
+ # @param [Array] log_levels Array containing the type of messages to log.
53
+ #
47
54
  def initialize(base_dir, time_format = '%Y-%m-%d.log', log_levels = [:debug, :error, :info, :warn])
48
55
  # Verify and set base directory
49
56
  send :base_dir=, base_dir, true
@@ -55,6 +62,7 @@ module Ramaze
55
62
  @in_shutdown = false
56
63
  end
57
64
 
65
+ ##
58
66
  # Set the base directory for log files
59
67
  #
60
68
  # If this method is called with the raise_exception
@@ -63,8 +71,11 @@ module Ramaze
63
71
  #
64
72
  # If raise_exception is set to false, the method will just
65
73
  # silently fail if the specified directory does not exist
66
- # or is unwritable
67
-
74
+ # or is unwritable.
75
+ #
76
+ # @param [String] directory The base directory specified by the developer.
77
+ # @param [Bool] raise_exception Boolean that indicates if an exception should be raised if the base directory doesn't exist.
78
+ #
68
79
  def base_dir=(directory, raise_exception = false)
69
80
  # Expand directory path
70
81
  base_dir = File.expand_path(directory)
@@ -86,8 +97,9 @@ module Ramaze
86
97
  end
87
98
  end
88
99
 
100
+ ##
89
101
  # Close the file we log to if it isn't closed already.
90
-
102
+ #
91
103
  def shutdown
92
104
  if @out.respond_to?(:close)
93
105
  unless @in_shutdown
@@ -99,8 +111,12 @@ module Ramaze
99
111
  end
100
112
  end
101
113
 
114
+ ##
102
115
  # Integration to Logging.
103
-
116
+ #
117
+ # @param [String] tag The type of message we're logging.
118
+ # @param [Array] messages An array of messages to log.
119
+ #
104
120
  def log tag, *messages
105
121
 
106
122
  return unless @log_levels.include?(tag)
@@ -119,9 +135,14 @@ module Ramaze
119
135
  @out.flush if @out.respond_to?(:flush)
120
136
  end
121
137
 
138
+ ##
122
139
  # Takes the prefix (tag), text and timestamp and applies it to
123
140
  # the :format trait.
124
-
141
+ #
142
+ # @param [String] prefix
143
+ # @param [String] text
144
+ # @param [Integer] time
145
+ #
125
146
  def log_interpolate prefix, text, time = timestamp
126
147
  message = class_trait[:format].dup
127
148
 
@@ -131,27 +152,30 @@ module Ramaze
131
152
  message
132
153
  end
133
154
 
155
+ ##
134
156
  # This uses timestamp trait or a date in the format of
135
157
  # %Y-%m-%d %H:%M:%S
136
158
  # # => "2007-01-19 21:09:32"
137
-
159
+ #
138
160
  def timestamp
139
161
  mask = class_trait[:timestamp]
140
162
  Time.now.strftime(mask || "%Y-%m-%d %H:%M:%S")
141
163
  end
142
164
 
143
- # is @out closed?
144
-
165
+ ##
166
+ # Is @out closed?
167
+ #
145
168
  def closed?
146
169
  @out.respond_to?(:closed?) && @out.closed?
147
170
  end
148
171
 
149
172
  private
150
173
 
174
+ ##
151
175
  # Checks whether current filename is still valid.
152
176
  # If not, update the current log to point at the new
153
177
  # filename
154
-
178
+ #
155
179
  def update_current_log
156
180
  out = File.join(@base_dir, Time.now.strftime(@time_format))
157
181
  if @out.nil? || @out.path != out
@@ -13,39 +13,45 @@ module Syslog
13
13
  end
14
14
 
15
15
  module Ramaze
16
- module Logger
17
- # Logger class for writing to syslog. It is a *very* thin wrapper
18
- # around the Syslog library.
19
- class Syslog
20
- include Logging
16
+ module Logger
17
+ ##
18
+ # Logger class for writing to syslog. It is a *very* thin wrapper
19
+ # around the Syslog library.
20
+ #
21
+ class Syslog
22
+ include Logging
21
23
 
22
- # Open the syslog library, if it is allready open, we reopen it using the
23
- # new argument list. The argument list is passed on to the Syslog library
24
- # so please check that, and man syslog for detailed information.
25
- # There are 3 parameters:
26
- #
27
- # ident: The identification used in the log file, defaults to $0
28
- # options: defaults to Syslog::LOG_PID | Syslog::LOG_CONS
29
- # facility: defaults to Syslog::LOG_USER
30
- #
31
- def initialize( *args )
32
- ::Syslog.close if ::Syslog.opened?
33
- ::Syslog.open( *args )
34
- end
24
+ ##
25
+ # Open the syslog library, if it is allready open, we reopen it using the
26
+ # new argument list. The argument list is passed on to the Syslog library
27
+ # so please check that, and man syslog for detailed information.
28
+ # There are 3 parameters:
29
+ #
30
+ # ident: The identification used in the log file, defaults to $0
31
+ # options: defaults to Syslog::LOG_PID | Syslog::LOG_CONS
32
+ # facility: defaults to Syslog::LOG_USER
33
+ #
34
+ def initialize( *args )
35
+ ::Syslog.close if ::Syslog.opened?
36
+ ::Syslog.open( *args )
37
+ end
35
38
 
36
- # just sends all messages received to ::Syslog
37
- # We simply return if the log was closed for some reason, this behavior
38
- # was copied from Informer. We do not handle levels here. This will
39
- # be done by te syslog daemon based on it's configuration.
40
- def log(tag, *messages)
41
- return if !::Syslog.opened?
42
- ::Syslog.send(tag, *messages)
43
- end
39
+ ##
40
+ # Just sends all messages received to ::Syslog
41
+ # We simply return if the log was closed for some reason, this behavior
42
+ # was copied from Informer. We do not handle levels here. This will
43
+ # be done by te syslog daemon based on it's configuration.
44
+ def log(tag, *messages)
45
+ return if !::Syslog.opened?
46
+ ::Syslog.send(tag, *messages)
47
+ end
44
48
 
45
- # Has to call the modules singleton-method.
46
- def inspect
47
- ::Syslog.inspect
48
- end
49
- end
49
+ ##
50
+ # Has to call the modules singleton-method.
51
+ #
52
+ def inspect
53
+ ::Syslog.inspect
54
+ end
50
55
  end
56
+ end
51
57
  end
@@ -8,11 +8,12 @@ require 'thread'
8
8
  module Ramaze
9
9
  module Logger
10
10
 
11
+ ##
11
12
  # Informer for the XOSD notification system for X11.
12
13
  #
13
14
  # You can install the ruby-bindings with:
14
15
  # gem install xosd.
15
-
16
+ #
16
17
  class Xosd < ::Xosd
17
18
  attr_accessor :options
18
19
 
@@ -43,11 +44,12 @@ module Ramaze
43
44
  # Here new messages are pushed to eventually displaying them.
44
45
  QUEUE = Queue.new
45
46
 
47
+ ##
46
48
  # Create a new instance, valid options are in DEFAULT.
47
49
  # In the background a new thread will be running that checks the QUEUE
48
50
  # and processes all messages that are being sent to it.
49
51
  # This is done to make output nicer and readable.
50
-
52
+ #
51
53
  def initialize(options = {})
52
54
  @options = DEFAULT.merge(options)
53
55
 
@@ -79,8 +81,9 @@ module Ramaze
79
81
  end
80
82
  end
81
83
 
82
- # pushes all messages it gets on the QUEUE for further processing.
83
-
84
+ ##
85
+ # Pushes all messages it gets on the QUEUE for further processing.
86
+ #
84
87
  def log(tag, *messages)
85
88
  messages.each do |message|
86
89
  QUEUE << [tag, message]
@@ -2,12 +2,12 @@ module Ramaze
2
2
  class MiddlewareCompiler < Innate::MiddlewareCompiler
3
3
  def static(path)
4
4
  require 'rack/contrib'
5
- Rack::ETag.new(Rack::ConditionalGet.new(Rack::File.new(path)))
5
+ Rack::ETag.new(Rack::ConditionalGet.new(Rack::File.new(path)), 'public')
6
6
  end
7
7
 
8
8
  def directory(path)
9
9
  require 'rack/contrib'
10
- Rack::ETag.new(Rack::ConditionalGet.new(Rack::Directory.new(path)))
10
+ Rack::ETag.new(Rack::ConditionalGet.new(Rack::Directory.new(path)), 'public')
11
11
  end
12
12
  end
13
13
  end
@@ -1,63 +1,63 @@
1
- unless defined? Fiber
2
- require 'thread'
3
-
4
- class FiberError < StandardError; end
5
-
6
- class Fiber
7
- def initialize
8
- raise ArgumentError, 'new Fiber requires a block' unless block_given?
9
-
10
- @yield = Queue.new
11
- @resume = Queue.new
12
-
13
- @thread = Thread.new{ @yield.push [*yield(*wait)] }
14
- @thread.abort_on_exception = true
15
- @thread[:fiber] = self
16
- end
17
- attr_reader :yield, :thread
18
-
19
- def resume *args
20
- raise FiberError, 'dead fiber called' unless @thread.alive?
21
- @resume.push(args)
22
- result = @yield.pop
23
- result.size > 1 ? result : result.first
24
- end
25
-
26
- def wait
27
- @resume.pop
28
- end
29
-
30
- def self.yield *args
31
- raise FiberError, "can't yield from root fiber" unless fiber = Thread.current[:fiber]
32
- fiber.yield.push(args)
33
- result = fiber.wait
34
- result.size > 1 ? result : result.first
35
- end
36
-
37
- def inspect
38
- "#<#{self.class}:0x#{self.object_id.to_s(16)}>"
39
- end
40
- end
41
- end
42
-
43
- if __FILE__ == $0
44
- f = Fiber.new{ puts 'hi'; p Fiber.yield(1); puts 'bye'; :done }
45
- p f.resume
46
- p f.resume(2)
47
- end
48
-
49
- __END__
50
-
51
- $ ruby fbr.rb
52
- hi
53
- 1
54
- 2
55
- bye
56
- :done
57
-
58
- $ ruby1.9 fbr.rb
59
- hi
60
- 1
61
- 2
62
- bye
63
- :done
1
+ unless defined? Fiber
2
+ require 'thread'
3
+
4
+ class FiberError < StandardError; end
5
+
6
+ class Fiber
7
+ def initialize
8
+ raise ArgumentError, 'new Fiber requires a block' unless block_given?
9
+
10
+ @yield = Queue.new
11
+ @resume = Queue.new
12
+
13
+ @thread = Thread.new{ @yield.push [*yield(*wait)] }
14
+ @thread.abort_on_exception = true
15
+ @thread[:fiber] = self
16
+ end
17
+ attr_reader :yield, :thread
18
+
19
+ def resume *args
20
+ raise FiberError, 'dead fiber called' unless @thread.alive?
21
+ @resume.push(args)
22
+ result = @yield.pop
23
+ result.size > 1 ? result : result.first
24
+ end
25
+
26
+ def wait
27
+ @resume.pop
28
+ end
29
+
30
+ def self.yield *args
31
+ raise FiberError, "can't yield from root fiber" unless fiber = Thread.current[:fiber]
32
+ fiber.yield.push(args)
33
+ result = fiber.wait
34
+ result.size > 1 ? result : result.first
35
+ end
36
+
37
+ def inspect
38
+ "#<#{self.class}:0x#{self.object_id.to_s(16)}>"
39
+ end
40
+ end
41
+ end
42
+
43
+ if __FILE__ == $0
44
+ f = Fiber.new{ puts 'hi'; p Fiber.yield(1); puts 'bye'; :done }
45
+ p f.resume
46
+ p f.resume(2)
47
+ end
48
+
49
+ __END__
50
+
51
+ $ ruby fbr.rb
52
+ hi
53
+ 1
54
+ 2
55
+ bye
56
+ :done
57
+
58
+ $ ruby1.9 fbr.rb
59
+ hi
60
+ 1
61
+ 2
62
+ bye
63
+ :done