ramaze 2010.06.18 → 2011.01

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1,24 +0,0 @@
1
- require 'sequel'
2
- require 'ramaze'
3
-
4
- DB = Sequel.sqlite
5
-
6
- class User < Sequel::Model
7
- set_schema do
8
- varchar :name
9
- text :description
10
- date :created
11
- end
12
- end
13
-
14
- User.create_table
15
-
16
- class MainController < Ramaze::Controller
17
- helper :form
18
-
19
- def index
20
- form_for User
21
- end
22
- end
23
-
24
- Ramaze.start
@@ -1,23 +0,0 @@
1
- require 'rubygems'
2
- require 'ramaze'
3
-
4
- gem 'facets', '=1.4.5'
5
- require '/home/manveru/prog/projects/nitroproject/glycerin'
6
- require 'nitro'
7
- require 'og'
8
-
9
- class Article
10
- attr_accessor :title, String
11
- end
12
-
13
- Og.setup :store => :sqlite, :destroy => true
14
-
15
- class MainController < Ramaze::Controller
16
- helper :nitroform
17
-
18
- def index
19
- form(Article.new).to_s
20
- end
21
- end
22
-
23
- Ramaze.start
@@ -1,133 +0,0 @@
1
- require 'ramaze/gestalt'
2
-
3
- module Ramaze
4
- module Helper
5
- module Form
6
- def form_text(label, name, value = nil)
7
- form_input(label, :type => :text, :name => name, :value => value)
8
- end
9
-
10
- def form_checkbox(label, name, checked = false)
11
- hash = {:type => :checkbox, :name => name}
12
- hash[:checked] = 'checked' if checked
13
- form_input(label, hash)
14
- end
15
-
16
- def form_checkbox_tag(label, name, value, checked = false)
17
- hash = {:type => :checkbox, :name => name + '[]', :value => value}
18
- hash[:checked] = 'checked' if checked
19
- form_input(label, hash)
20
- end
21
-
22
- def form_password(label, name)
23
- form_input(label, :type => :password, :name => name)
24
- end
25
-
26
- def form_textarea(label, name, value = nil)
27
- form_build(:textarea, label, :name => name){ value }
28
- end
29
-
30
- def form_file(label, name)
31
- form_input(label, :type => :file, :name => name)
32
- end
33
-
34
- def form_hidden(name, value = nil)
35
- Ramaze::Gestalt.build{ input(:type => :hidden, :name => name, :value => value) }
36
- end
37
-
38
- def form_submit(value = nil)
39
- hash = {:type => :submit}.merge(form_tabindex)
40
- hash[:value] = value if value
41
- Ramaze::Gestalt.build{ tr{ td(:colspan => 2){ input(hash) }}}
42
- end
43
-
44
- # @example usage, normal select drop-down
45
- #
46
- # form_select('Favourite colors', :colors, @colors, :selected => @color)
47
- #
48
- # @example usage for pre-selected value
49
- #
50
- # form_select('Favourite colors', :colors, @colors, :selected => @color)
51
- #
52
- # @example usage, allow selecting multiple
53
- #
54
- # form_select('Cups', :cups, @cups, :selected => @cup, :multiple => 5)
55
- def form_select(label, name, values, hash = {})
56
- name = name.to_sym
57
- id = "form-#{name}"
58
- multiple, size = hash.values_at(:multiple, :size)
59
-
60
- s_args = {:name => name, :id => id}.merge(form_tabindex)
61
- s_args[:multiple] = :multiple if multiple
62
- s_args[:size] = (size || multiple || 1).to_i
63
-
64
- has_selected, selected = hash.key?(:selected), hash[:selected]
65
- error = form_errors[name.to_s]
66
-
67
- g = Ramaze::Gestalt.new
68
- g.tr do
69
- g.td do
70
- g.label(:for => id){ "#{label}:" }
71
- g.span(:class => 'error'){ error } if error
72
- end
73
- g.td do
74
- g.select(s_args) do
75
- values.each do |key, value|
76
- value ||= key
77
- o_args = {:value => value}
78
- o_args[:selected] = :selected if has_selected and value == selected
79
- g.option(o_args){ key }
80
- end
81
- end
82
- end
83
- end
84
-
85
- g.to_s
86
- end
87
-
88
- def form_input(label, hash)
89
- form_build(:input, label, hash)
90
- end
91
-
92
- def form_build(tag_name, label, hash, &block)
93
- name = hash[:name].to_sym
94
- form_id = "form-#{name}"
95
- opts = hash.merge(form_tabindex.merge(:id => form_id))
96
- error = form_errors[name.to_s]
97
-
98
- Ramaze::Gestalt.build do
99
- tr do
100
- td do
101
- label(:for => form_id){ "#{label}:" } unless label==''
102
- span(:class => "error"){ error } if error
103
- end
104
- td do
105
- tag(tag_name, opts, &block)
106
- end
107
- end
108
- end
109
- end
110
-
111
- def form_tabindex
112
- @tabindex ||= 0
113
- @tabindex += 1
114
-
115
- {:tabindex => @tabindex}
116
- end
117
-
118
- def form_error(name, message)
119
- form_errors[name.to_s] = message.to_s
120
- end
121
-
122
- def form_errors
123
- @form_errors ||= {}
124
- end
125
-
126
- def form_errors_from_model(obj)
127
- obj.errors.each do |key, value|
128
- form_error(key, value.first % key)
129
- end
130
- end
131
- end
132
- end
133
- end
@@ -1,14 +0,0 @@
1
- # Copyright (c) 2008 Michael Fellinger m.fellinger@gmail.com
2
- # All files in this distribution are subject to the terms of the Ruby license.
3
-
4
- require 'nitro/helper/form'
5
-
6
- module Ramaze
7
- module Helper
8
-
9
- # This helper simply includes the Nitro::FormHelper so you can use its methods
10
- # in your Controller.
11
-
12
- Nitroform = ::Nitro::FormHelper
13
- end
14
- end
@@ -1,367 +0,0 @@
1
- module Ramaze
2
-
3
- # The BSD License
4
- #
5
- # Copyright (c) 2004-2007, George K. Moschovitis. (http://www.gmosx.com)
6
- # All rights reserved.
7
- #
8
- # Redistribution and use in source and binary forms, with or without
9
- # modification, are permitted provided that the following conditions are
10
- # met:
11
- #
12
- # * Redistributions of source code must retain the above copyright
13
- # notice, this list of conditions and the following disclaimer.
14
- #
15
- # * Redistributions in binary form must reproduce the above copyright
16
- # notice, this list of conditions and the following disclaimer in the
17
- # documentation and/or other materials provided with the distribution.
18
- #
19
- # * Neither the name of Nitro nor the names of its contributors may be
20
- # used to endorse or promote products derived from this software
21
- # without specific prior written permission.
22
- #
23
- # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24
- # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25
- # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26
- # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27
- # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28
- # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
29
- # TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
30
- # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
31
- # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
32
- # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33
- # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
- #
35
-
36
- # Displays a collection of entitities in multiple pages.
37
- #
38
- # === Design
39
- #
40
- # This pager is carefully designed for scaleability. It stores only the items
41
- # for one page. The key parameter is needed, multiple pagers can coexist in a
42
- # single page. The pager leverages the SQL LIMIT option to optimize database
43
- # interaction.
44
- #
45
- #
46
- # === Example
47
- #
48
- # class MyController
49
- # def index
50
- # objs = (0..200).to_a
51
- # @entries, @pager = paginate(objs, :limit => 20)
52
- # end
53
- # end
54
- #
55
- #
56
- # <html>
57
- # <head><title>Pager</title></head>
58
- # <body>
59
- # <?r if pager.navigation? ?>
60
- # <div class="pager">#{@pager.navigation}</div>
61
- # <?r end ?>
62
- # <ul>
63
- # <?r @entries.each do |entry| ?>
64
- # <li>#{entry}</li>
65
- # <?r end ?>
66
- # </ul>
67
- # </body>
68
- # </html>
69
- #
70
- # === Styling
71
- #
72
- # The following classes can be used for styling with CSS (provided you put the
73
- # pager in a element with class 'pager' like shown above):
74
- #
75
- # .pager {}
76
- # .pager .first {}
77
- # .pager .previous {}
78
- # .pager .next {}
79
- # .pager .last {}
80
- # .pager ul {}
81
- # .pager li {}
82
- # .pager li.active {}
83
-
84
- class Pager
85
- include Ramaze::Helper::Link
86
- include Ramaze::Traited
87
-
88
- # Items per page.
89
-
90
- trait :limit => 10
91
-
92
- # The request key.
93
-
94
- trait :key => '_page'
95
-
96
- # The current page.
97
-
98
- attr_reader :page
99
-
100
- # Items per page.
101
-
102
- attr_reader :limit
103
-
104
- # The total number of pages.
105
-
106
- attr_reader :page_count
107
-
108
- # Total count of items.
109
-
110
- attr_reader :total_count
111
-
112
- # Create a new Pager object.
113
- #
114
- # request:: Ramaze::Request object providing access to GET parameters
115
- # limit:: how many elements go to one page
116
- # total_count:: total element count
117
- # key:: key used for getting the current page from GET paramaters
118
- #
119
- # Note: You never have to create this class yourself, use the `paginate()`
120
- # convenience method from the Helper::Pager.
121
-
122
- def initialize(request, limit, total_count, key = trait[:key])
123
- raise 'limit should be > 0' unless limit > 0
124
-
125
- @request, @key = request, key
126
- @page = (request.params[key] || 1).to_i
127
- @limit = limit
128
- set_count(total_count)
129
- @start_idx = (@page - 1) * limit
130
- end
131
-
132
- # Return the first page index.
133
-
134
- def first_page
135
- 1
136
- end
137
-
138
- # Is the first page displayed?
139
-
140
- def first_page?
141
- @page == 1
142
- end
143
-
144
- # Return the last page index.
145
-
146
- def last_page
147
- return @page_count
148
- end
149
-
150
- # Is the last page displayed?
151
-
152
- def last_page?
153
- @page == @page_count
154
- end
155
-
156
- # Return the index of the previous page.
157
-
158
- def prev_page
159
- [@page - 1, 1].max
160
- end
161
-
162
- # Return the index of the next page.
163
-
164
- def next_page
165
- [@page + 1, @page_count].min
166
- end
167
-
168
- # Returns each element for the current page
169
-
170
- def each(&block)
171
- @page_items.each(&block)
172
- end
173
-
174
- # Iterator
175
- # Returns 1-based index.
176
-
177
- def each_with_index(&block)
178
- @page_items.each_with_index(&block)
179
- end
180
-
181
- # Is the pager empty, ie has one page only?
182
-
183
- def empty?
184
- @page_count < 2
185
- end
186
-
187
- # Returns true if a navigation is necessary (meaning there is more than one
188
- # page)
189
-
190
- def navigation?
191
- !empty?
192
- end
193
-
194
- # Returns the amount of all elements in all pages.
195
-
196
- def size
197
- @total_count
198
- end
199
-
200
- # Override this method in your application if needed.
201
- #--
202
- # TODO: better markup.
203
- #++
204
-
205
- def navigation
206
- nav = ""
207
-
208
- unless first_page?
209
- nav << %{
210
- <div class="first"><a href="#{link_first_page}">First</a></div>
211
- <div class="previous"><a href="#{link_prev_page}">Previous</a></div>
212
- }
213
- end
214
-
215
- unless last_page?
216
- nav << %{
217
- <div class="last"><a href="#{link_last_page}">Last</a></div>
218
- <div class="next"><a href="#{link_next_page}">Next</a></div>
219
- }
220
- end
221
-
222
- nav << %{<ul>}
223
-
224
- for i in nav_range()
225
- if i == @page
226
- nav << %{<li class="active">#{i}</li>}
227
- else
228
- nav << %{<li><a href="#{target_uri(i)}">#{i}</a></li>}
229
- end
230
- end
231
-
232
- nav << %{</ul>}
233
-
234
- return nav
235
- end
236
-
237
- # To be used with Og queries.
238
-
239
- def limit
240
- if @start_idx > 0
241
- { :limit => @limit, :offset => @start_idx }
242
- else
243
- { :limit => @limit }
244
- end
245
- end
246
-
247
- # Returns the index of the first element to go into the current page
248
-
249
- def offset
250
- @start_idx
251
- end
252
-
253
- private
254
-
255
- # Generate the target URI.
256
-
257
- def target_uri(page)
258
- params = @request.params.merge(@key => page)
259
- Current.action.node.r(Current.action.name, params)
260
- end
261
-
262
- # Generate link for the first page.
263
-
264
- def link_first_page; target_uri(first_page); end
265
-
266
- # Generate link for the last page.
267
-
268
- def link_last_page; target_uri(last_page); end
269
-
270
- # Generate link for the previous page.
271
-
272
- def link_prev_page; target_uri(prev_page); end
273
-
274
- # Generate link for the next page.
275
-
276
- def link_next_page; target_uri(next_page); end
277
-
278
-
279
- # Returns the range of the current page.
280
-
281
- def page_range
282
- s = @idx
283
- e = [@idx + @items_limit - 1, all_total_count].min
284
-
285
- return [s, e]
286
- end
287
-
288
- # Returns the range of
289
- # Override if needed.
290
-
291
- def nav_range
292
- # effective range = 10 pages.
293
- s = [@page - 5, 1].max
294
- e = [@page + 9, @page_count].min
295
-
296
- d = 9 - (e - s)
297
- e += d if d < 0
298
-
299
- return (s..e)
300
- end
301
-
302
- # generates total and page count of the pager.
303
-
304
- def set_count(total_count)
305
- @total_count = total_count
306
- @page_count = (@total_count.to_f / @limit).ceil
307
- end
308
-
309
- end
310
-
311
- # Pager related helper methods.
312
-
313
- module Helper::Pager
314
-
315
- # Helper method that generates a collection of items and the
316
- # associated pager object.
317
- #
318
- # === Example
319
- #
320
- # items = [ 'item1', 'item2', ... ]
321
- # entries, pager = paginate(items, :limit => 10)
322
- #
323
- # <ul>
324
- # <?r for entry in entries ?>
325
- # <li>#{entry.to_link}</li>
326
- # <?r end ?>
327
- # </ul>
328
- # #{pager.navigation}
329
- #
330
- # === Og Example
331
- #
332
- # entries, pager = paginate(Article, :where => 'title LIKE..', :limit => 10)
333
- #
334
- # or
335
- #
336
- # entries, pager = paginate(article.comments, :limit => 10)
337
-
338
- def paginate(items, options = {})
339
- limit = options.delete(:limit) || Pager.trait[:limit]
340
- pager_key = options.delete(:pager_key) || Pager.trait[:key]
341
-
342
- case items
343
- when Array
344
- pager = Pager.new(request, limit, items.size, pager_key)
345
- items = items.slice(pager.offset, pager.limit[:limit])
346
- return items, pager
347
- end
348
-
349
- if defined?(Og) && items.is_a?(Og::Collection)
350
- pager = Pager.new(request, limit, items.count, pager_key)
351
- options.update(pager.limit)
352
- items = items.reload(options)
353
- return items, pager
354
- elsif defined?(Og::EntityMixin) && items.is_a?(Og::EntityMixin) ||
355
- defined?(Og::Mixin) && items.is_a?(Og::Mixin) # Og <= 0.41
356
- pager = Pager.new(request, limit, items.count(options), pager_key)
357
- options.update(pager.limit)
358
- items = items.all(options)
359
- return items, pager
360
- end
361
-
362
- raise "No suitable pagination method for #{items.inspect}"
363
- end
364
-
365
- end
366
-
367
- end