hobo 0.8 → 0.8.1

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.
@@ -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