hobo 0.8.5 → 0.8.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (68) hide show
  1. data/CHANGES.txt +41 -0
  2. data/Manifest +1 -5
  3. data/Rakefile +10 -3
  4. data/bin/hobo +38 -15
  5. data/dryml_generators/rapid/cards.dryml.erb +7 -7
  6. data/dryml_generators/rapid/pages.dryml.erb +52 -24
  7. data/hobo.gemspec +42 -322
  8. data/init.rb +0 -7
  9. data/lib/active_record/association_collection.rb +9 -0
  10. data/lib/hobo.rb +13 -14
  11. data/lib/hobo/accessible_associations.rb +32 -7
  12. data/lib/hobo/authentication_support.rb +1 -1
  13. data/lib/hobo/controller.rb +5 -7
  14. data/lib/hobo/dryml.rb +9 -2
  15. data/lib/hobo/dryml/dryml_builder.rb +11 -12
  16. data/lib/hobo/dryml/dryml_doc.rb +22 -24
  17. data/lib/hobo/dryml/dryml_generator.rb +41 -4
  18. data/lib/hobo/dryml/part_context.rb +5 -3
  19. data/lib/hobo/dryml/template.rb +7 -7
  20. data/lib/hobo/dryml/template_environment.rb +11 -22
  21. data/lib/hobo/dryml/template_handler.rb +94 -25
  22. data/lib/hobo/find_for.rb +2 -2
  23. data/lib/hobo/hobo_helper.rb +21 -21
  24. data/lib/hobo/include_in_save.rb +9 -5
  25. data/lib/hobo/lifecycles/transition.rb +2 -2
  26. data/lib/hobo/model.rb +11 -61
  27. data/lib/hobo/model_controller.rb +28 -29
  28. data/lib/hobo/model_router.rb +12 -13
  29. data/lib/hobo/permissions.rb +47 -37
  30. data/lib/hobo/permissions/associations.rb +1 -1
  31. data/lib/hobo/scopes/association_proxy_extensions.rb +5 -6
  32. data/lib/hobo/scopes/automatic_scopes.rb +7 -4
  33. data/lib/hobo/tasks/rails.rb +4 -0
  34. data/lib/hobo/user.rb +0 -1
  35. data/lib/hobo/user_controller.rb +3 -1
  36. data/lib/hobo/view_hints.rb +17 -3
  37. data/rails_generators/hobo/hobo_generator.rb +1 -0
  38. data/rails_generators/hobo_front_controller/templates/functional_test.rb +1 -11
  39. data/rails_generators/hobo_front_controller/templates/index.dryml +1 -6
  40. data/rails_generators/hobo_rapid/hobo_rapid_generator.rb +1 -0
  41. data/rails_generators/hobo_rapid/templates/hobo-rapid.css +3 -2
  42. data/rails_generators/hobo_rapid/templates/hobo-rapid.js +24 -15
  43. data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/clean.css +17 -12
  44. data/rails_generators/hobo_rapid/templates/themes/clean/public/stylesheets/rapid-ui.css +6 -2
  45. data/rails_generators/hobo_rapid/templates/themes/clean/views/clean.dryml +2 -2
  46. data/rails_generators/hobo_user_model/templates/forgot_password.erb +2 -2
  47. data/rails_generators/hobo_user_model/templates/model.rb +2 -2
  48. data/taglibs/rapid.dryml +3 -2
  49. data/taglibs/rapid_core.dryml +21 -16
  50. data/taglibs/rapid_document_tags.dryml +1 -1
  51. data/taglibs/rapid_editing.dryml +7 -10
  52. data/taglibs/rapid_forms.dryml +115 -26
  53. data/taglibs/rapid_generics.dryml +13 -3
  54. data/taglibs/rapid_lifecycles.dryml +18 -1
  55. data/taglibs/rapid_navigation.dryml +50 -61
  56. data/taglibs/rapid_pages.dryml +103 -19
  57. data/taglibs/rapid_plus.dryml +54 -6
  58. data/taglibs/rapid_support.dryml +38 -1
  59. data/taglibs/rapid_user_pages.dryml +17 -5
  60. data/test/permissions/models/models.rb +24 -12
  61. data/test/permissions/models/test.sqlite3 +0 -0
  62. metadata +6 -15
  63. data/lib/extensions/test_case.rb +0 -129
  64. data/lib/hobo/composite_model.rb +0 -73
  65. data/lib/hobo/model_support.rb +0 -44
  66. data/tasks/fix_dryml.rake +0 -143
  67. data/tasks/generate_tag_reference.rake +0 -192
  68. data/test/dryml/complilation_test.rb +0 -261
@@ -33,7 +33,7 @@ module Hobo
33
33
  # and record in question are Hobo models
34
34
  def nullify_keys(records)
35
35
  if (user = acting_user)
36
- records.each { |r| r.user_changes!(user, @reflection.primary_key_name => nil) if r.is_a?(Hobo::Model) }
36
+ records.each { |r| r.user_update_attributes!(user, @reflection.primary_key_name => nil) if r.is_a?(Hobo::Model) }
37
37
  end
38
38
 
39
39
  # Normal ActiveRecord implementatin
@@ -30,16 +30,15 @@ module Hobo
30
30
 
31
31
  HasManyThroughAssociationExtensions = classy_module do
32
32
 
33
- def conditions_with_hobo_scopes
33
+ def build_conditions_with_hobo_scopes
34
34
  scope_conditions = self.scope_conditions(@reflection)
35
35
  through_scope_conditions = self.scope_conditions(@reflection.through_reflection)
36
- unscoped_conditions = conditions_without_hobo_scopes
36
+ unscoped_conditions = build_conditions_without_hobo_scopes
37
37
  combine_conditions(scope_conditions, through_scope_conditions, unscoped_conditions)
38
38
  end
39
- alias_method_chain :conditions, :hobo_scopes
40
- alias_method :sql_conditions, :conditions
41
- public :conditions, :sql_conditions
42
-
39
+ alias_method_chain :build_conditions, :hobo_scopes
40
+ public :conditions
41
+
43
42
  end
44
43
 
45
44
  AssociationCollectionExtensions = classy_module do
@@ -7,9 +7,12 @@ module Hobo
7
7
  def create_automatic_scope(name)
8
8
  ScopeBuilder.new(self, name).create_scope
9
9
  rescue ActiveRecord::StatementInvalid => e
10
- # Problem with the database? Don't try to create automatic scopes
11
- ActiveRecord::Base.logger.warn "!! Database exception during hobo auto-scope creation -- continuing automatic scopes"
12
- ActiveRecord::Base.logger.warn "!! #{e.to_s}"
10
+ # Problem with the database? Don't try to create automatic
11
+ # scopes
12
+ if ActiveRecord::Base.logger
13
+ ActiveRecord::Base.logger.warn "!! Database exception during hobo auto-scope creation -- continuing automatic scopes"
14
+ ActiveRecord::Base.logger.warn "!! #{e.to_s}"
15
+ end
13
16
  false
14
17
  end
15
18
 
@@ -196,7 +199,7 @@ module Hobo
196
199
  end
197
200
 
198
201
  # active (a lifecycle state)
199
- elsif @klass.has_lifecycle? && name.in?(@klass::Lifecycle.state_names)
202
+ elsif @klass.has_lifecycle? && name.to_sym.in?(@klass::Lifecycle.state_names)
200
203
 
201
204
  if @klass::Lifecycle.state_names.length == 1
202
205
  # nothing to check for - create a dummy scope
@@ -0,0 +1,4 @@
1
+ # This file is used to load the Hobo rake tasks when running Hobo as a gem
2
+
3
+ tasks_home = File.join File.dirname(__FILE__), "..", "..", "..", "tasks"
4
+ Dir["#{tasks_home}/**/*.rake"].sort.each { |ext| load ext }
@@ -39,7 +39,6 @@ module Hobo
39
39
  # Virtual attributes for setting and changing the password
40
40
  attr_accessor :current_password, :password, :password_confirmation, :type => :password
41
41
 
42
-
43
42
  before_save :encrypt_password
44
43
 
45
44
  never_show *AUTHENTICATION_FIELDS
@@ -92,7 +92,9 @@ module Hobo
92
92
  flash[:notice] << " You must activate your account before you can log in. Please check your email." unless this.account_active?
93
93
  end
94
94
  response_block(&b) or if valid?
95
- self.current_user = this if this.account_active?
95
+ if this.account_active?
96
+ self.current_user = this if this.account_active?
97
+ end
96
98
  redirect_back_or_default(home_page)
97
99
  end
98
100
  end
@@ -7,16 +7,22 @@ module Hobo
7
7
  end
8
8
 
9
9
  def self.setter(name, default=nil, &block)
10
+ ivname = name.to_s.remove(/\?$/)
10
11
  metaclass.send :define_method, name do |*args|
11
12
  if args.empty?
12
- instance_variable_get("@#{name}") || (default.is_a?(Proc) ? instance_eval(&default) : default)
13
+ val = instance_variable_get("@#{ivname}")
14
+ if val.nil?
15
+ val = default.is_a?(Proc) ? instance_eval(&default) : default
16
+ instance_variable_set("@#{ivname}", val)
17
+ end
18
+ val
13
19
  else
14
20
  arg = if block
15
21
  block[*args]
16
22
  else
17
23
  args.first
18
24
  end
19
- instance_variable_set("@#{name}", arg)
25
+ instance_variable_set("@#{ivname}", arg)
20
26
  end
21
27
  end
22
28
  end
@@ -31,13 +37,21 @@ module Hobo
31
37
  args
32
38
  end
33
39
 
40
+ setter :paginate?, proc { !sortable? }
41
+
42
+ setter :sortable?, proc { defined?(ActiveRecord::Acts::List::InstanceMethods) &&
43
+ model < ActiveRecord::Acts::List::InstanceMethods &&
44
+ model.new.try.scope_condition == "1 = 1" }
45
+
46
+
34
47
  # Accessors
35
48
 
36
49
  class << self
37
50
 
38
51
  def model
39
- model_name.constantize
52
+ @model ||= name.sub(/Hints$/, "").constantize
40
53
  end
54
+
41
55
 
42
56
  def field_name(field)
43
57
  field_names.fetch(field.to_sym, field.to_s.titleize)
@@ -3,6 +3,7 @@ class HoboGenerator < Rails::Generator::Base
3
3
  def manifest
4
4
  if options[:add_gem]
5
5
  add_to_file "config/environment.rb", "Rails::Initializer.run do |config|", " config.gem 'hobo'\n"
6
+ add_to_file "Rakefile", "require 'tasks/rails'", "\nrequire 'hobo/tasks/rails'"
6
7
  end
7
8
 
8
9
  if options[:add_routes]
@@ -1,16 +1,6 @@
1
1
  require File.dirname(__FILE__) + '<%= '/..' * class_nesting_depth %>/../test_helper'
2
- require '<%= file_path %>_controller'
3
-
4
- # Re-raise errors caught by the controller.
5
- class <%= class_name %>Controller; def rescue_action(e) raise e end; end
6
-
7
- class <%= class_name %>ControllerTest < Test::Unit::TestCase
8
- def setup
9
- @controller = <%= class_name %>Controller.new
10
- @request = ActionController::TestRequest.new
11
- @response = ActionController::TestResponse.new
12
- end
13
2
 
3
+ class <%= class_name %>ControllerTest < ActionController::TestCase
14
4
  # Replace this with your real tests.
15
5
  def test_truth
16
6
  assert true
@@ -13,12 +13,7 @@
13
13
  </section>
14
14
  </header>
15
15
 
16
- <section class="content-body" repeat="&front_models">
17
- <div class="model">
18
- <h3><type-name plural/></h3>
19
- <collection:recent/>
20
- <p if="&can_create? && linkable?(:new)">Create a <a to="&this" action="new"/>.</p>
21
- </div>
16
+ <section class="content-body">
22
17
  </section>
23
18
  </content:>
24
19
 
@@ -13,6 +13,7 @@ class HoboRapidGenerator < Hobo::Generator
13
13
  m.file "hobo-rapid.js", "public/javascripts/hobo-rapid.js"
14
14
  m.file "lowpro.js", "public/javascripts/lowpro.js"
15
15
  m.file "IE7.js", "public/javascripts/IE7.js"
16
+ m.file "ie7-recalc.js", "public/javascripts/ie7-recalc.js"
16
17
  m.file "blank.gif", "public/javascripts/blank.gif"
17
18
  m.file "reset.css", "public/stylesheets/reset.css"
18
19
  m.file "hobo-rapid.css", "public/stylesheets/hobo-rapid.css"
@@ -1,12 +1,12 @@
1
1
  /**** Default styling for Rapid ****/
2
2
 
3
3
  #ajax_progress {
4
- color: grey;
4
+ color: gray;
5
5
  float: right;
6
6
  margin: 20px;
7
7
  position: fixed;
8
8
  background: white;
9
- font-family: Tahoma "sans serif";
9
+ font-family: tahoma, sans-serif;
10
10
  display: none;
11
11
  z-index: 10;
12
12
  }
@@ -32,6 +32,7 @@ div.completions_popup {
32
32
  border:1px solid #888;
33
33
  margin:0px;
34
34
  padding:0px;
35
+ z-index:100;
35
36
  }
36
37
  div.completions_popup ul {
37
38
  list-style-type:none;
@@ -380,9 +380,10 @@ var Hobo = {
380
380
  }
381
381
  if (e = $('ajax-progress')) {
382
382
  if (nextTo) {
383
- var pos = $(nextTo).cumulativeOffset()
384
- e.style.top = pos.top - nextTo.offsetHeight + "px"
385
- e.style.left = (pos.left + nextTo.offsetWidth + 5) + "px"
383
+ var e_nextTo = $(nextTo);
384
+ var pos = e_nextTo.cumulativeOffset()
385
+ e.style.top = pos.top - e_nextTo.offsetHeight + "px"
386
+ e.style.left = (pos.left + e_nextTo.offsetWidth + 5) + "px"
386
387
  }
387
388
  e.style.display = "block";
388
389
  }
@@ -569,13 +570,16 @@ new HoboBehavior("ul.input-many", {
569
570
  this.updateButtons()
570
571
  this.updateInputNames()
571
572
 
573
+ ul.fire("rapid:add", { element: newItem })
574
+ ul.fire("rapid:change", { element: newItem })
575
+
572
576
  new Effect.BlindDown(newItem, {duration: 0.3})
573
577
  },
574
578
 
575
579
  removeOne: function(ev, el) {
576
580
  Event.stop(ev)
577
581
  var self = this;
578
- var li = el.up('li')
582
+ var ul = el.up('ul'), li = el.up('li')
579
583
  if (li.parentNode.childElements().length == 1) {
580
584
  // It's the last one - don't remove it, just clear it
581
585
  this.clearInputs(li)
@@ -586,11 +590,15 @@ new HoboBehavior("ul.input-many", {
586
590
  self.updateInputNames()
587
591
  } });
588
592
  }
593
+ ul.fire("rapid:remove")
594
+ ul.fire("rapid:change")
589
595
  },
596
+
590
597
 
591
598
  clearInputs: function(item) {
592
- $(item).select('input').each(function(input){
593
- if (input.getAttribute('type').toLowerCase() == 'hidden') {
599
+ $(item).select('input,select,textarea').each(function(input){
600
+ t = input.getAttribute('type')
601
+ if (t && t.match(/hidden/i)) {
594
602
  input.remove()
595
603
  } else {
596
604
  input.value = ""
@@ -603,15 +611,15 @@ new HoboBehavior("ul.input-many", {
603
611
  var addButton = "<button class='add-item'>+</button>"
604
612
 
605
613
  var ul = this.element
606
- if (ul.childElements().length == 1) {
607
- ul.down('li').down('div.buttons').innerHTML = removeButton + ' ' + addButton
608
- } else {
609
- var add = ul.selectChildren('li').selectChildren('div.buttons').down('button.add-item')
610
- if (add) add.remove()
611
- ul.selectChildren('li:first-child').child('div.buttons').innerHTML = removeButton
612
- ul.selectChildren('li:last-child').child('div.buttons').innerHTML = removeButton + ' ' + addButton
614
+ var children = ul.childElements();
615
+ // assumption: only get here after add or remove, so only second last button needs the "+" removed
616
+ if(children.length > 1) {
617
+ // cannot use .down() because that's a depth-first search. Did I mention that I hate Prototype?
618
+ children[children.length-2].childElements().last().innerHTML = removeButton;
619
+ }
620
+ if(children.length > 0) {
621
+ children[children.length-1].childElements().last().innerHTML = removeButton + ' ' + addButton;
613
622
  }
614
-
615
623
  Event.addBehavior.reload()
616
624
  },
617
625
 
@@ -720,6 +728,7 @@ AutocompleteBehavior = Behavior.create({
720
728
 
721
729
 
722
730
 
731
+ Event.addBehavior.reassignAfterAjax = true;
723
732
  Event.addBehavior({
724
733
 
725
734
  'div.section-group' : function() {
@@ -746,7 +755,7 @@ Event.addBehavior({
746
755
 
747
756
  '.autocompleter' : AutocompleteBehavior(),
748
757
 
749
- '.string.in-place-edit, .datetime.in-place-edit, .date.in-place-edit, .integer.in-place-edit, .float.in-place.edit, big-integer.in-place-edit' :
758
+ '.string.in-place-edit, .datetime.in-place-edit, .date.in-place-edit, .integer.in-place-edit, .float.in-place-edit, big-integer.in-place-edit' :
750
759
  function (ev) {
751
760
 
752
761
  var ipe = Hobo._makeInPlaceEditor(this)
@@ -56,6 +56,10 @@ a:hover {
56
56
  }
57
57
  h1 a, h2 a, h3 a {border: none; background: none;}
58
58
 
59
+ pre, code {
60
+ font-family: "Courier New", Courier, monospace;
61
+ }
62
+
59
63
  input.text, input.string, input.email-address, input.password, input.search, input.integer, input.float, textarea {
60
64
  border-top:1px solid #7c7c7c;
61
65
  border-left:1px solid #c3c3c3;
@@ -77,7 +81,7 @@ input.file_upload {
77
81
  margin-top: 10px;
78
82
  }
79
83
  .button:hover {cursor: pointer;}
80
- form .actions {height: 100%; overflow: hidden; font-size: 11px;}
84
+ form .actions {_zoom: 1; overflow: hidden; font-size: 11px;}
81
85
  form .actions input { margin: 0; }
82
86
 
83
87
  .flash {
@@ -107,7 +111,7 @@ form .actions input { margin: 0; }
107
111
  padding: 8px 20px 8px 40px;
108
112
  border: 1px solid #444;
109
113
  background: black url(../images/spinner.gif) no-repeat 10px 8px;
110
-
114
+ color: white;
111
115
  }
112
116
 
113
117
  .article {margin: 20px 0; border-top: 1px dotted #ccc;}
@@ -121,9 +125,9 @@ form .actions input { margin: 0; }
121
125
  .content-body {padding: 15px 0;}
122
126
  .content-footer {padding-bottom: 20px;}
123
127
 
124
- .page-header {position: relative; margin-top: 25px; padding: 20px 0 0;}
128
+ .page-header {margin-top: 25px; padding: 0 0 0;}
125
129
  .page-header h1 {
126
- margin: 0; padding: 0 30px 30px;
130
+ margin: 0; padding: 20px 30px 30px;
127
131
  font-family: "Arial Black", Tahoma, Arial, sans-serif; font-size: 36px; letter-spacing: -1.5pt;
128
132
  }
129
133
  .page-header ul {zoom: 1; overflow: hidden;}
@@ -136,9 +140,9 @@ form .actions input { margin: 0; }
136
140
  {border: none; color: white; background: none;}
137
141
 
138
142
  .page-header div.search {
139
- position: absolute; top: 10px; right: 5px;
140
- padding: 6px 30px 8px 15px;
141
- }
143
+ float: right;
144
+ padding: 0 30px 8px 15px;
145
+ }
142
146
  .page-header div.search label {
143
147
  padding-right: 10px;
144
148
  font: bold 9px Arial, sans-serif; text-transform: uppercase; letter-spacing: 1.0pt;
@@ -164,7 +168,8 @@ form .actions input { margin: 0; }
164
168
  }
165
169
 
166
170
  .account-nav {
167
- position: absolute; top: -20px; right: 35px;
171
+ float:right;
172
+ margin: -22px 5px 0 0;
168
173
  font-size: 11px;
169
174
  }
170
175
  .account-nav li {
@@ -196,7 +201,7 @@ form .actions input { margin: 0; }
196
201
  .login-page .content-header { position: relative; }
197
202
  .login-page .forgot-password {font-size: 11px; margin-left: 160px;}
198
203
 
199
- .edit-page .content-header {overflow: hidden; height: 100%;}
204
+ .edit-page .content-header {overflow: hidden; _zoom: 1;}
200
205
  .edit-page .content-header h1 {float: left;}
201
206
  .edit-page .content-header .delete-button {float: right; margin-top: 25px;}
202
207
  form .actions {margin: 30px 0; width: 100%; text-align: center;}
@@ -221,7 +226,7 @@ form .actions {margin: 30px 0; width: 100%; text-align: center;}
221
226
  /* styling of generic elements */
222
227
  .creator {font-weight: bold;}
223
228
  .card {
224
- height: 100%; overflow: hidden;
229
+ overflow: hidden; _zoom: 1;
225
230
  margin: 10px 0; padding: 12px; border: 1px solid #e8e8e8;
226
231
  background: #f5f5f5;
227
232
  position: relative;
@@ -257,7 +262,7 @@ ul.collection > li { margin-left: 0; list-style: none;}
257
262
  padding: 15px 0; margin-bottom: 20px; border-bottom: 1px dotted #888;
258
263
  }
259
264
 
260
- .table-plus .header {height: 100%; overflow: hidden;}
265
+ .table-plus .header {_zoom: 1; overflow: hidden;}
261
266
  .table-plus .header a {float: left; margin-right: 20px;}
262
267
  .table-plus div.search {float: right;}
263
268
  .table-plus div.search span {color: #444;}
@@ -284,7 +289,7 @@ ul.collection > li { margin-left: 0; list-style: none;}
284
289
  div.select-many {border-top: 1px dotted #999;}
285
290
  div.select-many .items {margin-bottom: 10px;}
286
291
  div.select-many .item {
287
- overflow:hidden; height: 100%; font-weight: bold;
292
+ overflow:hidden; _zoom: 1; font-weight: bold;
288
293
  border-bottom: 1px dotted #999; padding: 5px 10px; /*margin: 5px 25px 5px 0;*/
289
294
  }
290
295
  div.select-many .item span { float: left; }
@@ -87,5 +87,9 @@ textarea.tall { height: 350px; }
87
87
 
88
88
  .field-list input.percentage {width: 25px; display: inline; margin-right: 5px; padding: 1px 3px;}
89
89
 
90
- select.dev-user-changer { opacity: 0.3; position: absolute; top: -22px; left: 0; }
91
- select.dev-user-changer:hover { opacity: 1; }
90
+ select.dev-user-changer { opacity: 0.3; }
91
+ select.dev-user-changer:hover { opacity: 1; }
92
+
93
+ .part-wrapper {
94
+ display: inline; /* don't mess up layout when wrapping something */
95
+ }
@@ -4,7 +4,7 @@
4
4
  <stylesheet name="reset"/>
5
5
  <theme-stylesheet/>
6
6
  <theme-stylesheet name="rapid-ui"/>
7
- <stylesheet name="application"/>
8
- </stylesheets>
7
+ <stylesheet name="application" param="app-stylesheet"/>
8
+ </stylesheets:>
9
9
  </old-page>
10
10
  </extend>
@@ -1,10 +1,10 @@
1
1
  <%%= @user %>,
2
2
 
3
- If you have forgotten your password for <%%= @app_name %>, you can chose
3
+ If you have forgotten your password for <%%= @app_name %>, you can choose
4
4
  a new one by clicking on this link:
5
5
 
6
6
  <%%= <%= name -%>_reset_password_url :host => @host, :id => @user, :key => @key %>
7
7
 
8
- Thanks very much,
8
+ Thank you,
9
9
 
10
10
  The <%%= @app_name %> team.
@@ -11,7 +11,7 @@ class <%= class_name %> < ActiveRecord::Base
11
11
 
12
12
  # This gives admin rights to the first sign-up.
13
13
  # Just remove it if you don't want that
14
- before_create { |user| user.administrator = true if count == 0 }
14
+ before_create { |user| user.administrator = true if RAILS_ENV != "test" && count == 0 }
15
15
 
16
16
 
17
17
  # --- Signup lifecycle --- #
@@ -29,7 +29,7 @@ class <%= class_name %> < ActiveRecord::Base
29
29
  end
30
30
 
31
31
  transition :reset_password, { :active => :active }, :available_to => :key_holder,
32
- :update => [ :password, :password_confirmation ]
32
+ :params => [ :password, :password_confirmation ]
33
33
 
34
34
  end
35
35
 
@@ -1,8 +1,9 @@
1
1
  <!--
2
2
 
3
3
  The Rapid tag library makes web development go fast. The Rapid tag library is your friend.
4
-
5
- (This taglib defines no tags - it just includes all the other taglibs. More along. Nothing to see here.)
4
+
5
+ (This taglib defines no tags - it just includes all the other taglibs. Move along. Nothing to see here.)
6
+
6
7
  -->
7
8
 
8
9
  <include module="Hobo::RapidHelper"/>