hobo 0.8 → 0.8.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -55,7 +55,11 @@ module Hobo
55
55
  if force || !@controllers_loaded[subsite]
56
56
  dir = "#{RAILS_ROOT}/app/controllers#{'/' + subsite if subsite}"
57
57
  Dir.entries(dir).each do |f|
58
- f =~ /^[a-zA-Z_][a-zA-Z0-9_]*_controller\.rb$/ and f.sub(/.rb$/, '').camelize.constantize
58
+ if f =~ /^[a-zA-Z_][a-zA-Z0-9_]*_controller\.rb$/
59
+ name = f.sub(/.rb$/, '').camelize
60
+ name = "#{subsite.camelize}::#{name}" if subsite
61
+ name.constantize
62
+ end
59
63
  end
60
64
  @controllers_loaded[subsite] = true
61
65
  end
@@ -32,7 +32,7 @@ module Hobo
32
32
  class ModelRouter
33
33
 
34
34
  class << self
35
-
35
+
36
36
  attr_accessor :reload_routes_on_every_request
37
37
 
38
38
  def reset_linkables
@@ -102,6 +102,8 @@ module Hobo
102
102
 
103
103
  end
104
104
 
105
+ # specify that an id CANNOT be null - needed to disambiguate /models from /models/[nil] - see #251
106
+ ID_REQUIREMENT = { :id => /[^#{ActionController::Routing::SEPARATORS.join}]+/ }
105
107
 
106
108
  def initialize(map, controller, subsite)
107
109
  @map = map
@@ -132,7 +134,7 @@ module Hobo
132
134
  def add_routes
133
135
  # Simple support for composite models, we might later need a CompositeModelController
134
136
  if model < Hobo::CompositeModel
135
- map.connect "#{plural}/:id", :controller => plural, :action => 'show'
137
+ map.connect "#{plural}/:id", :controller => plural, :action => 'show', :requirements => ID_REQUIREMENT
136
138
 
137
139
  elsif controller < Hobo::ModelController
138
140
  # index routes need to be first so the index names don't get
@@ -161,11 +163,11 @@ module Hobo
161
163
  linkable_route("new_#{singular}", "#{plural}/new", :new, :conditions => { :method => :get })
162
164
  linkable_route("edit_#{singular}", "#{plural}/:id/edit", :edit, :conditions => { :method => :get })
163
165
 
164
- linkable_route(singular, "#{plural}/:id", :show, :conditions => { :method => :get })
166
+ linkable_route(singular, "#{plural}/:id", :show, :conditions => { :method => :get }, :requirements => ID_REQUIREMENT)
165
167
 
166
168
  linkable_route("create_#{singular}", plural, :create, :conditions => { :method => :post })
167
- linkable_route("update_#{singular}", "#{plural}/:id", :update, :conditions => { :method => :put })
168
- linkable_route("destroy_#{singular}", "#{plural}/:id", :destroy, :conditions => { :method => :delete })
169
+ linkable_route("update_#{singular}", "#{plural}/:id", :update, :conditions => { :method => :put }, :requirements => ID_REQUIREMENT)
170
+ linkable_route("destroy_#{singular}", "#{plural}/:id", :destroy, :conditions => { :method => :delete }, :requirements => ID_REQUIREMENT)
169
171
  end
170
172
 
171
173
 
@@ -95,7 +95,7 @@ module Hobo::RapidHelper
95
95
  def in_place_editor(attributes)
96
96
  blank_message = attributes.delete(:blank_message) || "(click to edit)"
97
97
 
98
- attributes = add_classes(attributes, behaviour_class, model_id_class(this_parent, this_field))
98
+ attributes = add_classes(attributes, "in-place-edit", model_id_class(this_parent, this_field))
99
99
  attributes.update(:hobo_blank_message => blank_message,
100
100
  :if_blank => blank_message,
101
101
  :no_wrapper => false)
@@ -115,10 +115,6 @@ module Hobo::RapidHelper
115
115
  :reset_form, :refocus_form, :result_update, :spinner_next_to ]
116
116
 
117
117
 
118
- def editor_class
119
- end
120
-
121
-
122
118
  def through_collection_names(object=this)
123
119
  object.class.reflections.values.select do |refl|
124
120
  refl.macro == :has_many && refl.options[:through]
data/lib/hobo/user.rb CHANGED
@@ -97,6 +97,10 @@ module Hobo
97
97
 
98
98
  end
99
99
 
100
+ def account_active?
101
+ state == 'active'
102
+ end
103
+
100
104
  # Encrypts the password with the user salt
101
105
  def encrypt(password)
102
106
  self.class.encrypt(password, salt)
@@ -88,9 +88,9 @@ module Hobo
88
88
 
89
89
  def hobo_do_signup(&b)
90
90
  do_creator_action(:signup) do
91
+ flash[:notice] = "Thanks for signing up!" if valid?
91
92
  response_block(&b) or if valid?
92
- self.current_user = this
93
- flash[:notice] = "Thanks for signing up!"
93
+ self.current_user = this if this.account_active?
94
94
  redirect_back_or_default(home_page)
95
95
  end
96
96
  end
@@ -112,8 +112,6 @@ module Hobo
112
112
  if request.post?
113
113
  user = model.find_by_email_address(params[:email_address])
114
114
  if user && (!block_given? || yield(user))
115
- Hobo::Controller.request_host = request.host_with_port
116
- Hobo::Controller.app_name = call_tag(:app_name)
117
115
  user.lifecycle.request_password_reset(:nobody)
118
116
  end
119
117
  render_tag :forgot_password_email_sent_page
data/lib/hobo.rb CHANGED
@@ -7,7 +7,7 @@ rescue MissingSourceFile
7
7
  # OK, Hobo won't do pagination then
8
8
  end
9
9
 
10
- Dependencies.load_paths |= [ File.dirname(__FILE__) ]
10
+ (defined?(ActiveSupport::Dependencies) ? ActiveSupport::Dependencies : Dependencies).load_paths |= [ File.dirname(__FILE__) ]
11
11
 
12
12
  # Hobo can be installed in /vendor/hobo, /vendor/plugins/hobo, vendor/plugins/hobo/hobo, etc.
13
13
  ::HOBO_ROOT = File.expand_path(File.dirname(__FILE__) + "/..")
@@ -26,7 +26,7 @@ class HoboError < RuntimeError; end
26
26
 
27
27
  module Hobo
28
28
 
29
- VERSION = "0.8"
29
+ VERSION = "0.8.1"
30
30
 
31
31
  class RawJs < String; end
32
32
 
@@ -22,6 +22,7 @@ class HoboGenerator < Rails::Generator::Base
22
22
  m.file "dryml-support.js", File.join("public/javascripts/dryml-support.js")
23
23
  m.file "application.css", File.join("public/stylesheets/application.css")
24
24
  m.file "initializer.rb", File.join("config/initializers/hobo.rb")
25
+ m.file "patch_routing.rb", File.join("config/initializers/patch_routing.rb")
25
26
  end
26
27
  end
27
28
 
@@ -0,0 +1,32 @@
1
+ if Rails::VERSION::STRING.in? ["2.1.0", "2.1.1"]
2
+ module ActionController
3
+ module Routing
4
+ class RouteSet
5
+ def clear_recognize_optimized!
6
+ instance_eval %{
7
+ def recognize_optimized(path, env)
8
+ write_recognize_optimized
9
+ recognize_optimized(path, env)
10
+ end
11
+ }, __FILE__, __LINE__
12
+ end
13
+
14
+ def clear_with_optimization!
15
+ clear_without_optimization!
16
+ clear_recognize_optimized!
17
+ end
18
+ alias_method_chain :clear!, :optimization
19
+
20
+ end
21
+ end
22
+ end
23
+
24
+ ActionController::Routing::Routes.reload!
25
+
26
+ else
27
+ RAILS_DEFAULT_LOGGER.info "****"
28
+ RAILS_DEFAULT_LOGGER.info "**** The file config/initializers/patch_routing.rb is not in use"
29
+ RAILS_DEFAULT_LOGGER.info "**** with this version of Rails and can be removed"
30
+ RAILS_DEFAULT_LOGGER.info "****"
31
+ end
32
+
@@ -617,25 +617,25 @@ Event.addBehavior({
617
617
  '.autocompleter' : AutocompleteBehavior(),
618
618
 
619
619
  '.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' :
620
- function (el) {
621
- var ipe = Hobo._makeInPlaceEditor(el)
620
+ function (e) {
621
+ var ipe = Hobo._makeInPlaceEditor(this)
622
622
  ipe.getText = function() {
623
623
  return this.element.innerHTML.gsub(/<br\s*\/?>/, "\n").unescapeHTML()
624
624
  }
625
625
  },
626
626
 
627
- '.text.in-place-edit' : function (el) {
628
- var ipe = Hobo._makeInPlaceEditor(el, {rows: 2})
627
+ '.text.in-place-edit, .markdown.in-place-edit, .textile.in-place-edit' : function (e) {
628
+ var ipe = Hobo._makeInPlaceEditor(this, {rows: 2})
629
629
  ipe.getText = function() {
630
630
  return this.element.innerHTML.gsub(/<br\s*\/?>/, "\n").unescapeHTML()
631
631
  }
632
632
  },
633
633
 
634
- ".html.in-place-edit" : function (el) {
634
+ ".html.in-place-edit" : function (e) {
635
635
  var nicEditPresent = typeof(nicEditor) != "undefined"
636
636
  var options = { rows: 2, handleLineBreaks: false, okButton: true, cancelLink: true, okText: "Save" }
637
637
  if (nicEditPresent) options["submitOnBlur"] = false
638
- var ipe = Hobo._makeInPlaceEditor(el, options)
638
+ var ipe = Hobo._makeInPlaceEditor(this, options)
639
639
  if (nicEditPresent) {
640
640
  ipe.afterEnterEditMode = function() {
641
641
  var editor = this._controls.editor
@@ -652,7 +652,8 @@ Event.addBehavior({
652
652
  }
653
653
  },
654
654
 
655
- "select.integer.editor" : function(el) {
655
+ "select.integer.editor" : function(e) {
656
+ var el = this
656
657
  el.onchange = function() {
657
658
  Hobo.ajaxSetFieldForElement(el, $F(el))
658
659
  }
@@ -45,7 +45,7 @@ class HoboSubsiteGenerator < Rails::Generator::NamedBase
45
45
  m.directory File.join('app', 'controllers', file_name)
46
46
  m.directory File.join('app', 'views', file_name)
47
47
 
48
- m.template "controller.rb", File.join('app/controllers', file_name, "#{file_name}_site.rb")
48
+ m.template "controller.rb", File.join('app/controllers', file_name, "#{file_name}_site_controller.rb")
49
49
  m.template "site_taglib.dryml", File.join('app/views/taglibs', "#{file_name}_site.dryml")
50
50
  end
51
51
  end
@@ -1,9 +1,9 @@
1
1
  <%%= @user %>,
2
2
 
3
- If you have forgotton your password for <%%= @app_name %>, you can chose
3
+ If you have forgotten your password for <%%= @app_name %>, you can chose
4
4
  a new one by clicking on this link:
5
5
 
6
- <%%= user_reset_password_url :host => @host, :id => @user, :key => @key %>
6
+ <%%= <%= name -%>_reset_password_url :host => @host, :id => @user, :key => @key %>
7
7
 
8
8
  Thanks very much,
9
9
 
@@ -1,4 +1,4 @@
1
- class UserMailer < ActionMailer::Base
1
+ class <%= class_name -%>Mailer < ActionMailer::Base
2
2
 
3
3
  def forgot_password(user, key)
4
4
  host = Hobo::Controller.request_host
@@ -24,8 +24,8 @@ class <%= class_name %> < ActiveRecord::Base
24
24
  :params => [:username, :email_address, :password, :password_confirmation],
25
25
  :become => :active, :if => proc {|_, u| u.guest?}
26
26
 
27
- transition :nobody, :request_password_reset, { :active => :active } do
28
- UserMailer.deliver_forgot_password(self, lifecycle.generate_key)
27
+ transition :nobody, :request_password_reset, { :active => :active }, :new_key => true do
28
+ <%= class_name %>Mailer.deliver_forgot_password(self, lifecycle.key)
29
29
  end
30
30
 
31
31
  transition :with_key, :reset_password, { :active => :active },
@@ -1,4 +1,5 @@
1
1
  <def tag="hidden-fields" attrs="fields, skip, for-query-string"><%=
2
+ skip = comma_split(skip)
2
3
  pairs = if for_query_string
3
4
  query_params.to_a
4
5
  else
@@ -20,7 +21,7 @@
20
21
  %></def>
21
22
 
22
23
 
23
- <def tag="form" polymorphic attrs="update, hidden-fields, action, method, web-method, lifecycle, owner"><%=
24
+ <def tag="form" polymorphic attrs="update, hidden-fields, action, method, web-method, lifecycle, owner, enctype"><%=
24
25
  ajax_attrs, html_attrs = attributes.partition_hash(Hobo::RapidHelper::AJAX_ATTRS)
25
26
 
26
27
  new_record = this.try.new_record?
@@ -94,6 +95,8 @@
94
95
  add_classes!(html_attrs, "#{'new_' if new_record}#{type_id}")
95
96
  end
96
97
  end
98
+
99
+ html_attrs[:enctype] = enctype
97
100
 
98
101
  Hobo::Dryml.last_if = true
99
102
  element("form", html_attrs, body)
@@ -5,7 +5,7 @@
5
5
  <div class="header" param="header">
6
6
  <div class="search">
7
7
  <form param="search-form" method="get" action="">
8
- <hidden-fields for-query-string skip="page, search_form"/>
8
+ <hidden-fields for-query-string skip="page, search"/>
9
9
  <span>Search</span>
10
10
  <input class="search" type="search" name="search" value="&params[:search]"/>
11
11
  <submit label="Go" class="search-button" param="search-submit"/>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hobo
3
3
  version: !ruby/object:Gem::Version
4
- version: "0.8"
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tom Locke
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-09-03 00:00:00 +01:00
12
+ date: 2008-09-08 00:00:00 +01:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -20,7 +20,7 @@ dependencies:
20
20
  requirements:
21
21
  - - ">="
22
22
  - !ruby/object:Gem::Version
23
- version: "0.8"
23
+ version: 0.8.1
24
24
  version:
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: hobofields
@@ -30,7 +30,7 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: "0.8"
33
+ version: 0.8.1
34
34
  version:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: rails
@@ -52,6 +52,16 @@ dependencies:
52
52
  - !ruby/object:Gem::Version
53
53
  version: 2.2.1
54
54
  version:
55
+ - !ruby/object:Gem::Dependency
56
+ name: echoe
57
+ type: :development
58
+ version_requirement:
59
+ version_requirements: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: "0"
64
+ version:
55
65
  description: The web app builder for Rails
56
66
  email: tom@tomlocke.com
57
67
  executables:
@@ -195,6 +205,7 @@ files:
195
205
  - rails_generators/hobo/templates/dryml-support.js
196
206
  - rails_generators/hobo/templates/guest.rb
197
207
  - rails_generators/hobo/templates/initializer.rb
208
+ - rails_generators/hobo/templates/patch_routing.rb
198
209
  - rails_generators/hobo_front_controller/hobo_front_controller_generator.rb
199
210
  - rails_generators/hobo_front_controller/templates/controller.rb
200
211
  - rails_generators/hobo_front_controller/templates/functional_test.rb
@@ -247,6 +258,7 @@ files:
247
258
  - rails_generators/hobo_user_model/templates/model.rb
248
259
  - rails_generators/hobo_user_model/templates/unit_test.rb
249
260
  - rails_generators/hobo_user_model/USAGE
261
+ - Rakefile
250
262
  - README
251
263
  - script/destroy
252
264
  - script/generate
@@ -291,9 +303,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
291
303
  version:
292
304
  required_rubygems_version: !ruby/object:Gem::Requirement
293
305
  requirements:
294
- - - ">="
306
+ - - "="
295
307
  - !ruby/object:Gem::Version
296
- version: "0"
308
+ version: "1.2"
297
309
  version:
298
310
  requirements: []
299
311