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
data/lib/proto/start.rb CHANGED
@@ -1,3 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
1
3
  # Use this file directly like `ruby start.rb` if you don't want to use the
2
4
  # `ramaze start` command.
3
5
  # All application related things should go into `app.rb`, this file is simply
@@ -9,7 +9,7 @@
9
9
  <code>view/index.xhtml</code>, this page.
10
10
  </li>
11
11
  <li>
12
- <code>view/page.xhtml</code>, the layout for this page.
12
+ <code>layout/default.xhtml</code>, the layout for this page.
13
13
  </li>
14
14
  <li>
15
15
  <code>controller/main.rb</code>, where you can change the header of this
@@ -27,8 +27,8 @@
27
27
  </p>
28
28
 
29
29
  <p>
30
- You can also read the
31
- <a href="http://ramaze.rubyforge.org/rdoc/files/doc/README.html">rdocs</a>
30
+ You can also read the
31
+ <a href="http://doc.rubyists.com/ramaze%2binnate/">rdocs</a>
32
32
  or browse around the
33
33
  <a href="http://source.ramaze.net">Ramaze source code</a>.
34
34
  </p>
data/lib/ramaze.rb CHANGED
@@ -23,7 +23,6 @@ module Ramaze
23
23
  class << self; attr_accessor :options; end
24
24
 
25
25
  # vendored, will go into rack-contrib
26
- require 'vendor/etag'
27
26
  require 'vendor/route_exceptions'
28
27
 
29
28
  # Ramaze itself
@@ -67,7 +66,7 @@ module Ramaze
67
66
  m.use Rack::ShowStatus
68
67
  m.use Rack::RouteExceptions
69
68
  m.use Rack::ConditionalGet
70
- m.use Rack::ETag
69
+ m.use Rack::ETag, 'public'
71
70
  m.use Rack::Head
72
71
  m.use Ramaze::Reloader
73
72
  m.run Ramaze::AppMap
data/lib/ramaze/cache.rb CHANGED
@@ -6,6 +6,7 @@ require 'innate/cache'
6
6
  module Ramaze
7
7
  Cache = Innate::Cache
8
8
 
9
+ # TODO: Describe what this class does and how it can be used.
9
10
  class Cache
10
11
  autoload :LRU, 'ramaze/cache/lru'
11
12
  autoload :LocalMemCache, 'ramaze/cache/localmemcache'
@@ -1,79 +1,173 @@
1
1
  # Copyright (c) 2009 Michael Fellinger m.fellinger@gmail.com
2
2
  # All files in this distribution are subject to the terms of the Ruby license.
3
-
4
3
  require 'sequel'
5
4
 
6
5
  module Ramaze
7
6
  class Cache
8
-
9
- # Cache based on a Sequel model using relational databases.
7
+ ##
8
+ # Cache system that uses Sequel to store data in a database table named
9
+ # "ramaze_cache". Values stored in the database will be automatically serialized/
10
+ # unserialized using Marshal. Originally this cache system didn't work with Sequel 3
11
+ # but this has been fixed by Yorick Peterse.
12
+ #
13
+ # @example
14
+ # # Define that we want to use the Sequel cache for sessions
15
+ # Ramaze.options.cache.session = Ramaze::Cache::Sequel
16
+ #
17
+ # # Store some data in the session
18
+ # session["framework"] = "Ramaze"
19
+ #
20
+ # # Do something with the data
21
+ # session["framework"] += ", simply (r)amazing"
22
+ #
23
+ # @author Unknown, Yorick Peterse
10
24
  #
11
- # Please note that this cache might not work perfectly with Sequel 3.0.0,
12
- # as the #[] and #[]= methods do not respect serialization.
13
- # I'll lobby for a change in that direction.
14
25
  class Sequel
26
+ # I can haz API?
15
27
  include Cache::API
16
28
 
29
+ ##
30
+ # Model used for managing the data in the database.
31
+ # All data stored in the "value" column will be serialized/unserialized by Sequel itself.
32
+ # The structure of the table that belongs to this model looks like the following:
33
+ #
34
+ # _________________________________________________________________
35
+ # | | | | |
36
+ # | (integer) ID | (string) key | (string) value | (date) expires |
37
+ # |______________|______________|________________|__________________|
38
+ #
39
+ #
40
+ # Note that "key" is a unique field so double check to see if your application might try
41
+ # to insert an already existing key as this will cause Sequel errors.
42
+ #
43
+ # @author Unknown, Yorick Peterse
44
+ #
17
45
  class Table < ::Sequel::Model(:ramaze_cache)
18
46
  plugin :schema
19
- plugin :serialization
20
-
21
- serialize_attributes :marshal, :value
47
+ plugin :serialization, :marshal, :value
22
48
 
49
+ # Define the schema for this model
23
50
  set_schema do
24
51
  primary_key :id
25
- index :key, :unique => true
26
-
27
- String :key
28
- String :value
52
+
53
+ String :key, :null => false, :unique => true
54
+ String :value, :text => true
55
+
29
56
  Time :expires
30
57
  end
31
-
32
- def [](column)
33
- if column == :value
34
- deserialized_values[column] = deserialize_value(column, @values[column])
35
- else
36
- super
37
- end
38
- end
39
58
  end
40
59
 
41
- # Setup the table, not suitable for multiple apps yet.
60
+ ##
61
+ # Create the cache table if it doesn't exist yet.
62
+ # This cache does not yet support multiple applications unless you
63
+ # give "app" an unique name.
64
+ #
65
+ # @author Unknown, Yorick Peterse
66
+ # @example
67
+ # cache = Ramaze::Cache::Sequel.new
68
+ # cache.cache_setup 'my_server', 'chuck_norris', 'blog', 'articles'
69
+ #
70
+ # @param [String] host The hostname of the machine on which the application is running.
71
+ # @param [String] user The user under which the application is running.
72
+ # @param [String] app The name of the "application". For example, when using this cache
73
+ # for session "app" will be set to "session".
74
+ # @param [String] name The name for the row. When using sessions this will be set to the
75
+ # user's session ID.
76
+ #
42
77
  def cache_setup(host, user, app, name)
43
78
  @namespace = [host, user, app, name].compact.join(':')
44
79
  Table.create_table?
45
80
  @store = Table
46
81
  end
47
82
 
48
- # Wipe out _all_ data in the table, use with care.
83
+ ##
84
+ # Wipe out _all_ data in the table, use with care!
85
+ #
86
+ # @author Unknown, Yorick Peterse
87
+ # @example
88
+ # cache = Ramaze::Cache::Sequel.new
89
+ # cache.cache_clear
90
+ #
49
91
  def cache_clear
50
- Table.delete
92
+ @store.delete
51
93
  end
52
94
 
53
- # Delete records for given +keys+
95
+ ##
96
+ # Deletes a specific set of records based on the provided keys.
97
+ #
98
+ # @author Unknown, Yorick Peterse
99
+ # @example
100
+ # # Delete everything where "key" is set to "chunky_bacon"
101
+ # cache = Ramaze::Cache::Sequel.new
102
+ # cache.cache_delete 'chunky_bacon'
103
+ #
104
+ # @param [String] *keys A set of keys that define which row has to be deleted.
105
+ #
54
106
  def cache_delete(*keys)
55
- super do |key|
56
- record = @store[:key => namespaced(key)]
57
- record.delete if record
107
+ if keys
108
+ keys.each do |key|
109
+ record = @store[:key => namespaced(key)]
110
+ record.delete if record
111
+ end
58
112
  end
59
113
  end
60
114
 
115
+ ##
116
+ # Retrieve the cache that belongs to the specified key.
117
+ #
118
+ # @author Unknown, Yorick Peterse
119
+ # @example
120
+ # cache = Ramaze::Cache::Sequel.new
121
+ # data = cache.cache_fetch 'chunky_bacon'
122
+ #
123
+ # @param [String] key The key that defines what record to retrieve.
124
+ # @param [String] default The value to return in case no data could be found.
125
+ # @return [String] The unserialized data from the "value" column.
126
+ # @return [String]
127
+ #
61
128
  def cache_fetch(key, default = nil)
62
- super{|key| @store[:key => namespaced(key)] }
129
+ # Retrieve the data and return it
130
+ record = @store[:key => namespaced(key)]
131
+ record.value rescue default
63
132
  end
64
133
 
134
+ ##
135
+ # Store the specified key/value variables in the cache.
136
+ #
137
+ # @author Unknown, Yorick Peterse
138
+ # @example
139
+ # cache = Ramaze::Cache::Sequel.new
140
+ # cache.cache_store 'name', 'Yorick Peterse', :ttl => 3600
141
+ #
142
+ # @param [String] key The name of the cache to store.
143
+ # @param [String] value The actual data to cache.
144
+ # @param [Hash] options Additional options such as the TTL.
145
+ # @return [String]
146
+ #
65
147
  def cache_store(key, value, options = {})
66
- key = namespaced(key)
67
- ttl = options[:ttl]
68
- expires = Time.now + ttl if ttl
148
+ key = namespaced(key)
149
+ ttl = options[:ttl] rescue nil
150
+ expires = Time.now + ttl if !ttl.nil?
151
+ record = @store[:key => key]
69
152
 
70
- record = @store[:key => key].update(:value => value, :expires => expires)
71
- record.value
72
- rescue
73
- record = @store.create(:key => key, :value => value, :expires => expires)
74
- record.value
153
+ # Figure out if the record is new or already exists
154
+ if !record
155
+ record = @store.create(:key => key, :value => value, :expires => expires)
156
+ record.value
157
+ else
158
+ record = record.update(:value => value, :expires => expires)
159
+ record.value
160
+ end
75
161
  end
76
162
 
163
+ ##
164
+ # Generate the namespace for the cache.
165
+ # Namespaces have the format of host:user:app:name:key.
166
+ #
167
+ # @author Unknown
168
+ # @param [String] key The name of the cache key.
169
+ # @return [String]
170
+ #
77
171
  def namespaced(key)
78
172
  [@namespace, key].join(':')
79
173
  end
@@ -2,6 +2,7 @@
2
2
  # All files in this distribution are subject to the terms of the Ruby license.
3
3
 
4
4
  module Ramaze
5
+ # TODO: Describe what this class does other than initailizing the Controller system.
5
6
  class Controller
6
7
  include Innate::Traited
7
8
  include Innate::Node
@@ -1,85 +1,91 @@
1
1
  # Copyright (c) 2009 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
- =begin rdoc
5
- Example:
6
-
7
- require 'ramaze'
8
- require 'ramaze/gestalt'
9
-
10
- page = Ramaze::Gestalt.build{
11
- title = 'Hello, World!'
12
-
13
- html do
14
- head{ title(title) }
15
- body do
16
- h1(title)
17
- p 'I count to 10'
18
- ('1'..'10').each do |count|
19
- div(:style => 'width: 25px; height: 25px'){ count }
20
- end
21
- end
22
- end
23
- }
24
- =end
25
-
26
4
  module Ramaze
27
5
 
6
+ ##
28
7
  # Gestalt is the custom HTML/XML builder for Ramaze, based on a very simple
29
8
  # DSL it will build your markup.
30
-
9
+ #
10
+ # @example
11
+ #
12
+ # html =
13
+ # Gestalt.build do
14
+ # html do
15
+ # head do
16
+ # title "Hello, World!"
17
+ # end
18
+ # body do
19
+ # h1 "Hello, World!"
20
+ # end
21
+ # end
22
+ # end
23
+ #
31
24
  class Gestalt
32
25
  attr_accessor :out
33
26
 
27
+ ##
34
28
  # The default way to start building your markup.
35
29
  # Takes a block and returns the markup.
36
30
  #
37
- # Example:
38
- # html =
39
- # Gestalt.build do
40
- # html do
41
- # head do
42
- # title "Hello, World!"
43
- # end
44
- # body do
45
- # h1 "Hello, World!"
46
- # end
47
- # end
48
- # end
31
+ # @param [Block] block
49
32
  #
50
-
51
33
  def self.build(&block)
52
34
  self.new(&block).to_s
53
35
  end
54
36
 
37
+ ##
55
38
  # Gestalt.new is like ::build but will return itself.
56
39
  # you can either access #out or .to_s it, which will
57
40
  # return the actual markup.
58
41
  #
59
42
  # Useful for distributed building of one page.
60
-
43
+ #
44
+ # @param [Block] block
45
+ #
61
46
  def initialize(&block)
62
47
  @out = []
63
48
  instance_eval(&block) if block_given?
64
49
  end
65
50
 
66
- # catching all the tags. passing it to _gestalt_build_tag
67
-
51
+ ##
52
+ # Catching all the tags. passing it to _gestalt_build_tag
53
+ #
54
+ # @param [String] method The method that was called.
55
+ # @param [Hash] args Additional arguments passed to the called method.
56
+ # @param [Block] block
57
+ #
68
58
  def method_missing(meth, *args, &block)
69
59
  _gestalt_call_tag meth, args, &block
70
60
  end
71
61
 
72
- # workaround for Kernel#p to make <p /> tags possible.
73
-
62
+ ##
63
+ # Workaround for Kernel#p to make <p /> tags possible.
64
+ #
65
+ # @param [Hash] args Extra arguments that should be processed before creating the paragraph tag.
66
+ # @param [Block] block
67
+ #
74
68
  def p(*args, &block)
75
69
  _gestalt_call_tag :p, args, &block
76
70
  end
77
-
78
- # workaround for Kernel#select to make <select></select> work
71
+
72
+ ##
73
+ # Workaround for Kernel#select to make <select></select> work.
74
+ #
75
+ # @param [Hash] args Extra arguments that should be processed before creating the select tag.
76
+ # @param [Block] block
77
+ #
79
78
  def select(*args, &block)
80
79
  _gestalt_call_tag(:select, args, &block)
81
80
  end
82
81
 
82
+ ##
83
+ # TODO: Describe this method, I'm not exactly sure what it does - Yorick
84
+ #
85
+ # @param [String] name
86
+ # @param [Hash] args
87
+ # @param [Block] block
88
+ #
83
89
  def _gestalt_call_tag(name, args, &block)
84
90
  if args.size == 1 and args[0].kind_of? Hash
85
91
  # args are just attributes, children in block...
@@ -93,9 +99,16 @@ module Ramaze
93
99
  end
94
100
  end
95
101
 
96
- # build a tag for `name`, using `args` and an optional block that
97
- # will be yielded
98
-
102
+ ##
103
+ # Build a tag for `name`, using `args` and an optional block that
104
+ # will be yielded.
105
+ #
106
+ # TODO: Describe this method since I'm not exactly sure what it does - Yorick
107
+ #
108
+ # @param [String] name
109
+ # @param [Hash] attr
110
+ # @param [Hash] text
111
+ #
99
112
  def _gestalt_build_tag(name, attr = {}, text = [])
100
113
  @out << "<#{name}"
101
114
  @out << attr.map{|(k,v)| %[ #{k}="#{_gestalt_escape_entities(v)}"] }.join
@@ -112,6 +125,11 @@ module Ramaze
112
125
  end
113
126
  end
114
127
 
128
+ ##
129
+ # Replace common HTML characters such as " and < with their entities.
130
+ #
131
+ # @param [String] s The HTML string that needs to be escaped.
132
+ #
115
133
  def _gestalt_escape_entities(s)
116
134
  s.to_s.gsub(/&/, '&amp;').
117
135
  gsub(/"/, '&quot;').
@@ -120,10 +138,21 @@ module Ramaze
120
138
  gsub(/>/, '&gt;')
121
139
  end
122
140
 
141
+ ##
142
+ # TODO: Describe this method since I'm not exactly sure what it does - Yorick
143
+ #
144
+ # @param [String] name
145
+ # @param [Hash] args
146
+ # @param [Block] block
147
+ #
123
148
  def tag(name, *args, &block)
124
149
  _gestalt_call_tag(name.to_s, args, &block)
125
150
  end
126
151
 
152
+ ##
153
+ # Convert the final output of Gestalt to a string.
154
+ # This method has the following alias: "to_str".
155
+ #
127
156
  def to_s
128
157
  @out.join
129
158
  end