diff --git a/.project b/.project new file mode 100644 index 0000000..a1368d1 --- /dev/null +++ b/.project @@ -0,0 +1,18 @@ + + + hobocookbook + + + + + + com.aptana.ide.core.unifiedBuilder + + + + + + org.radrails.rails.core.railsnature + com.aptana.ruby.core.rubynature + + diff --git a/Gemfile b/Gemfile index b017f4b..5a3a1ca 100644 --- a/Gemfile +++ b/Gemfile @@ -32,7 +32,21 @@ gem 'yard' # group :development, :test do # gem 'webrat' # end +group :development do + # set to 0.43 due to problem with .45 see https://github.com/rails/rails/pull/1671 + # gem 'ruby-debug' + # gem 'ruby-debug-ide' + # gem 'linecache', '0.43' +end + +gem "maruku" + +#temp workaround for hash_secret issue see https://groups.google.com/forum/#!topic/hobousers/dS4VT_lyVIY +#gem "paperclip", "~> 2.3" +gem 'paperclip', :git => "git://github.com/jeanmartin/paperclip.git", :branch => "master" +#required by paperclip +gem "cocaine" + +gem "hobo", "1.3.0.RC1", :git => "git://github.com/tablatom/hobo.git", :branch => "rails3" -gem 'maruku' -gem "hobo", "1.3.0.RC" diff --git a/Gemfile.lock b/Gemfile.lock index 9167b67..789c5c1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,3 +1,30 @@ +GIT + remote: git://github.com/jeanmartin/paperclip.git + revision: 4095e07adaace2a123cbd031fa268928f3b0ce87 + branch: master + specs: + paperclip (2.3.10) + activerecord (>= 2.3.0) + activesupport (>= 2.3.2) + +GIT + remote: git://github.com/tablatom/hobo.git + revision: 2c604814478baad1557e95a335ee1da0ce9d3b05 + branch: rails3 + specs: + dryml (1.3.0.RC1) + actionpack (~> 3.0.0) + hobo_support (= 1.3.0.RC1) + hobo (1.3.0.RC1) + dryml (= 1.3.0.RC1) + hobo_fields (= 1.3.0.RC1) + hobo_support (= 1.3.0.RC1) + will_paginate (>= 3.0.pre) + hobo_fields (1.3.0.RC1) + hobo_support (= 1.3.0.RC1) + hobo_support (1.3.0.RC1) + rails (~> 3.0.0) + GEM remote: http://rubygems.org/ specs: @@ -30,20 +57,9 @@ GEM activesupport (3.0.8) arel (2.0.10) builder (2.1.2) - dryml (1.3.0.RC) - actionpack (~> 3.0.0) - hobo_support (= 1.3.0.RC) + cocaine (0.1.0) erubis (2.6.6) abstract (>= 1.0.0) - hobo (1.3.0.RC) - dryml (= 1.3.0.RC) - hobo_fields (= 1.3.0.RC) - hobo_support (= 1.3.0.RC) - will_paginate (>= 3.0.pre) - hobo_fields (1.3.0.RC) - hobo_support (= 1.3.0.RC) - hobo_support (1.3.0.RC) - rails (~> 3.0.0) i18n (0.5.0) mail (2.2.19) activesupport (>= 2.3.6) @@ -79,17 +95,19 @@ GEM thor (0.14.6) treetop (1.4.9) polyglot (>= 0.3.1) - tzinfo (0.3.27) + tzinfo (0.3.28) will_paginate (3.0.pre2) - yard (0.7.1) + yard (0.7.2) PLATFORMS ruby DEPENDENCIES - hobo (= 1.3.0.RC) + cocaine + hobo (= 1.3.0.RC1)! maruku mysql + paperclip! rails (= 3.0.8) rake (= 0.8.7) sqlite3 diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 992947a..c55effe 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -9,11 +9,12 @@ class ApplicationController < ActionController::Base private def last_update(filename) - Dir.chdir(File.open("#{RAILS_ROOT}/git-path").read.chomp) do - head = File.open("#{RAILS_ROOT}/git-version").read.chomp + Dir.chdir(File.open("#{Rails.root}/git-path").read.chomp) do + head = File.open("#{Rails.root}/git-version").read.chomp commit = `git rev-list #{head} #{filename} | head -n 1` date_s = `git show --pretty=format:%cD #{commit} | head -n 1` date_s ? Date.parse(date_s) : "" end end end + diff --git a/app/controllers/manual_controller.rb b/app/controllers/manual_controller.rb index 326a226..afa99cf 100644 --- a/app/controllers/manual_controller.rb +++ b/app/controllers/manual_controller.rb @@ -1,7 +1,6 @@ class ManualController < ApplicationController caches_page :manual_section, :manual_subsection - def self.create_ordered_hash(llist) hash = ActiveSupport::OrderedHash.new llist.each do |key, value| @@ -11,59 +10,59 @@ def self.create_ordered_hash(llist) end TITLES = self.create_ordered_hash([# ['to-do', "To Do List"], - ['toc', "Table of Contents"], - ['download', "Download and Install"], - ['hobo_support', 'Hobo Support'], - ['hobo_fields', 'Hobo Fields'], - ['scopes', 'Automatic Named Scopes'], - ['permissions', "The Permission System"], - ['multi_model_forms', 'Accessible Associations'], - ['users_and_authentication', 'Users and Authentication'], - ['model', 'Miscellaneous Model Extensions'], - ['controllers', "Controllers and Routing"], - ['dryml-guide', "The DRYML Guide"], - ['ajax', 'Ajax in Hobo'], - ['lifecycles', 'Lifecycles'], - ['viewhints', 'View Hints'], - ['generators', 'Generators'], - ['i18n', 'Internationalization'], - ]) + ['toc', "Table of Contents"], + ['download', "Download and Install"], + ['hobo_support', 'Hobo Support'], + ['hobo_fields', 'Hobo Fields'], + ['scopes', 'Automatic Named Scopes'], + ['permissions', "The Permission System"], + ['multi_model_forms', 'Accessible Associations'], + ['users_and_authentication', 'Users and Authentication'], + ['model', 'Miscellaneous Model Extensions'], + ['controllers', "Controllers and Routing"], + ['dryml-guide', "The DRYML Guide"], + ['ajax', 'Ajax in Hobo'], + ['lifecycles', 'Lifecycles'], + ['viewhints', 'View Hints'], + ['generators', 'Generators'], + ['i18n', 'Internationalization'], + ]) SUBTITLES = { 'hobo_fields' => self.create_ordered_hash([['rich_types', 'Rich Types'], - ['api', 'API'], - ['migration_generator','Migration Generator'], -# ['generators', 'Generators'], -# ['interactive_primary_key', 'Interactive Primary Key'], - ['migration_generator_comments', 'Migration Generator Comments'] - ]), + ['api', 'API'], + ['migration_generator','Migration Generator'], + # ['generators', 'Generators'], + # ['interactive_primary_key', 'Interactive Primary Key'], + ['migration_generator_comments', 'Migration Generator Comments'] + ]), 'hobo_support' => self.create_ordered_hash([['chronic', 'Chronic'], - ['enumerable', 'Enumerable'], - ['hash', 'Hash'], - ['implies', 'Implies'], - ['metaid', 'Metaid'], - ['methodphitamine', 'Methodphitamine'], - ['module', 'Module'], - ['xss', 'XSS'], - ]), + ['enumerable', 'Enumerable'], + ['hash', 'Hash'], + ['implies', 'Implies'], + ['metaid', 'Metaid'], + ['methodphitamine', 'Methodphitamine'], + ['module', 'Module'], + ['xss', 'XSS'], + ]), 'generators' => self.create_ordered_hash([['admin_subsite', 'admin_subsite'], - ['assets', 'assets'], - ['controller', 'controller'], - ['front_controller', 'front_controller'], - ['i18n', 'i18n'], - ['migration', 'migration'], - ['model', 'model'], - ['rapid', 'rapid'], - ['resource', 'resource'], - ['routes', 'routes'], - ['setup_wizard', 'setup_wizard'], - ['subsite', 'subsite'], - ['subsite_taglib', 'subsite_taglib'], - ['test_framework', 'test_framework'], - ['user_controller', 'user_controller'], - ['user_mailer', 'user_mailer'], - ['user_model', 'user_model'], - ['user_resource', 'user_resource']]) + ['assets', 'assets'], + ['controller', 'controller'], + ['front_controller', 'front_controller'], + ['i18n', 'i18n'], + ['migration', 'migration'], + ['model', 'model'], + ['rapid', 'rapid'], + ['resource', 'resource'], + ['routes', 'routes'], + ['setup_wizard', 'setup_wizard'], + ['subsite', 'subsite'], + ['subsite_taglib', 'subsite_taglib'], + ['test_framework', 'test_framework'], + ['user_controller', 'user_controller'], + ['user_mailer', 'user_mailer'], + ['user_model', 'user_model'], + ['user_resource', 'user_resource']]) } @@ -72,8 +71,9 @@ def manual_section filename = "manual/#{section}.markdown" @title = TITLES[section] @subtitles = SUBTITLES[section] - @content = HoboFields::Types::MarkdownString.new(File.read("#{RAILS_ROOT}/#{filename}")) + @content = HoboFields::Types::MarkdownString.new(File.read("#{Rails.root}/#{filename}")) @last_update = last_update filename + end def manual_subsection @@ -83,7 +83,7 @@ def manual_subsection @title = TITLES[section] @subtitles = SUBTITLES[section] @current_subtitle = SUBTITLES[section][subsection] - @content = HoboFields::Types::MarkdownString.new(File.read("#{RAILS_ROOT}/#{filename}")) + @content = HoboFields::Types::MarkdownString.new(File.read("#{Rails.root}/#{filename}")) @last_update = last_update filename end diff --git a/app/controllers/plugins_controller.rb b/app/controllers/plugins_controller.rb index 3f20c85..d538324 100644 --- a/app/controllers/plugins_controller.rb +++ b/app/controllers/plugins_controller.rb @@ -19,7 +19,7 @@ def show end filename = "#{RAILS_ROOT}/taglibs/#{plugin}/README.markdown" @title = TITLES[plugin] - @content = HoboFields::MarkdownString.new(File.read(filename)) + @content = HoboFields::Types::MarkdownString.new(File.read(filename)) @libs = ApiTaglib.library_is(plugin) @last_update = last_update filename end diff --git a/app/models/api_tag_def.rb b/app/models/api_tag_def.rb index 188a9df..85e83a4 100644 --- a/app/models/api_tag_def.rb +++ b/app/models/api_tag_def.rb @@ -7,50 +7,51 @@ class ApiTagDef < ActiveRecord::Base def to_param to_s end - + fields do tag :string, :name => true extension :boolean polymorphic :boolean for_type :string - + short_description :html description :html tag_attributes :serialized, :class => Array tag_parameters :serialized, :class => Array - + merge_attrs :string merge_params :string - + source :text - + timestamps end - + belongs_to :taglib, :class_name => "ApiTaglib" has_many :comments, :class_name => "ApiTagComment", :dependent => :destroy - - named_scope :no_for_type, :conditions => "for_type is null" + + #named_scope :no_for_type, :conditions => "for_type is null" + scope :no_for_type, where("for_type is null") children :comments def def_line "<#{extension? ? 'extend' : 'def'} tag='#{tag}'#{' polymorphic' if polymorphic?}#{' for=\'' + for_type + '\'' if for_type}>" end - + def short_def_line "<#{tag}#{' for=\'' + for_type + '\'' if for_type}>" end - + def typed_variants return [] if for_type ApiTagDef.find :all, :conditions => ["tag = ? AND (for_type is not null)", tag] end - + def all_attributes tag_attributes | merged_attributes end - + def merge_attrs_tagdef @merged_attrs_tagdef ||= ApiTagDef.find_by_tag(merge_attrs) end @@ -58,7 +59,7 @@ def merge_attrs_tagdef def merge_params_tagdef @merged_attrs_tagdef ||= ApiTagDef.find_by_tag(merge_attrs) end - + def merged_attributes merge_attrs_tagdef._?.all_attributes || [] end @@ -86,3 +87,4 @@ def view_permitted?(attribute) end end + diff --git a/app/models/tag.rb b/app/models/tag.rb index 8994178..11275d5 100644 --- a/app/models/tag.rb +++ b/app/models/tag.rb @@ -1,4 +1,4 @@ -# NOTE- Tagging is not implemnted +# NOTE- Tagging is not implemnted class Tag < ActiveRecord::Base @@ -11,9 +11,10 @@ class Tag < ActiveRecord::Base has_many :taggings has_many :recipes, :through => :taggings - - named_scope :popular, :limit => "20" # To Do! + #named_scope :popular, :limit => "20" # To Do! + + scope :popular, limit(20) # --- Hobo Permissions --- # @@ -34,3 +35,4 @@ def view_permitted?(attribute) end end + diff --git a/app/models/user.rb b/app/models/user.rb index cc8c5a8..b200ba6 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -12,7 +12,7 @@ class User < ActiveRecord::Base # This gives admin rights to the first sign-up. # Just remove it if you don't want that before_create { |user| user.administrator = true if user.class.count == 0 } - + children :recipes, :questions, :answers # --- Signup lifecycle --- # @@ -31,19 +31,19 @@ class User < ActiveRecord::Base transition :reset_password, { :active => :active }, :available_to => :key_holder, :params => [ :password, :password_confirmation ] - + end - - + + has_many :recipes has_many :questions has_many :answers has_many :comments - - named_scope :recently_active, :order => "(select created_at from recipes where recipes.user_id = users.id order by created_at limit 1)", - :limit => 6 - + + #named_scope :recently_active, :order => "(select created_at from recipes where recipes.user_id = users.id order by created_at limit 1)", + # :limit => 6 + scope :recently_active, order("(select created_at from recipes where recipes.user_id = users.id order by created_at limit 1)").limit(6) # --- Hobo Permissions --- # @@ -66,3 +66,4 @@ def view_permitted?(field) end end + diff --git a/app/rich_types/optional_markdown.rb b/app/rich_types/optional_markdown.rb index 688f508..0aa9f46 100644 --- a/app/rich_types/optional_markdown.rb +++ b/app/rich_types/optional_markdown.rb @@ -16,7 +16,7 @@ def to_html(xmldoctype = true) end HoboFields::SanitizeHtml.sanitize(s) end - + end class OptionalMarkdown < HoboFields::Types::Text @@ -28,3 +28,4 @@ def to_html_from_markdown end end + diff --git a/app/views/taglibs/themes/clean b/app/views/taglibs/themes/clean deleted file mode 120000 index af264f3..0000000 --- a/app/views/taglibs/themes/clean +++ /dev/null @@ -1 +0,0 @@ -../../../../vendor/hobo13/hobo/lib/generators/hobo/rapid/templates/themes/clean/views \ No newline at end of file diff --git a/app/views/taglibs/themes/clean-sidemenu b/app/views/taglibs/themes/clean-sidemenu deleted file mode 120000 index b263f69..0000000 --- a/app/views/taglibs/themes/clean-sidemenu +++ /dev/null @@ -1 +0,0 @@ -../../../../vendor/hobo13/hobo/lib/generators/hobo/rapid/templates/themes/clean-sidemenu/views \ No newline at end of file diff --git a/app/views/taglibs/themes/clean-sidemenu/clean-sidemenu.dryml b/app/views/taglibs/themes/clean-sidemenu/clean-sidemenu.dryml new file mode 100644 index 0000000..507a549 --- /dev/null +++ b/app/views/taglibs/themes/clean-sidemenu/clean-sidemenu.dryml @@ -0,0 +1,30 @@ + + + + + + + + + + + + +

+
+ + + + + + + +
+
+
+
+ +
+
diff --git a/app/views/taglibs/themes/clean/clean.dryml b/app/views/taglibs/themes/clean/clean.dryml new file mode 100644 index 0000000..4022808 --- /dev/null +++ b/app/views/taglibs/themes/clean/clean.dryml @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/config/environments/development.rb b/config/environments/development.rb index afe07fb..e0d51e2 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -24,3 +24,5 @@ config.action_dispatch.best_standards_support = :builtin end +#Debugger.start + diff --git a/git-path b/git-path new file mode 100644 index 0000000..8a1df0a --- /dev/null +++ b/git-path @@ -0,0 +1 @@ +/home/bsleys/hobocookbook diff --git a/git-version b/git-version new file mode 100644 index 0000000..c856ab7 --- /dev/null +++ b/git-version @@ -0,0 +1 @@ +hobo13doc diff --git a/lib/api_doc_loader.rb b/lib/api_doc_loader.rb index 37022f7..238b2a4 100644 --- a/lib/api_doc_loader.rb +++ b/lib/api_doc_loader.rb @@ -1,7 +1,8 @@ module ApiDocLoader # TAGLIB_HOME = "#{RAILS_ROOT}/vendor/plugins/hobo/hobo/taglibs" - TAGLIB_HOME = "#{Rails.root}/vendor/hobo13/hobo/lib/hobo/rapid/taglibs" +# TAGLIB_HOME = "#{Rails.root}/vendor/hobo13/hobo/lib/hobo/rapid/taglibs" + TAGLIB_HOME = "#{Hobo.root}/lib/hobo/rapid/taglibs" PLUGINS_HOME = "#{Rails.root}/taglibs" class Taglib < Dryml::DrymlDoc::Taglib @@ -18,7 +19,8 @@ class TagDef < Dryml::DrymlDoc::TagDef def load_into_database(owner) return if no_doc? - + #debugger +# puts "owner: #{owner} name: #{name} for_type: #{for_type}" t = ApiTagDef.find_or_create_by_tag_and_for_type(name, for_type) t.taglib = owner t.attributes = { :tag => name, :extension => extension?, :polymorphic => polymorphic?, diff --git a/lib/tasks/cookbook.rake b/lib/tasks/cookbook.rake index 1986e5a..95537b9 100644 --- a/lib/tasks/cookbook.rake +++ b/lib/tasks/cookbook.rake @@ -20,7 +20,8 @@ namespace :cookbook do task :rebuild_generator_docs => :environment do ManualController::SUBTITLES['generators'].each do |gen, title| #raw = `cd rails3app; rvm 1.9.2-p0 exec rails g hobo:#{gen} --help` - raw = `cd rails3app; exec rails g hobo:#{gen} --help` + #raw = `cd rails3app; exec rails g hobo:#{gen} --help` + raw = `bundle exec rails g hobo:#{gen} --help` out = "Generators -- #{title.gsub('_', '\_')}\n{: .document-title}\n\n" + raw.gsub(/^(\w(\w|\s)*):(.*)/) {|s| "\n## #{$1}\n\n #{$3}\n"}. gsub("#{Rails.root}", ".") @@ -37,7 +38,7 @@ namespace :cookbook do sh "cd #{sub} && git fetch origin && git checkout origin/master" } sh 'cd taglibs/hobo-jquery && git fetch origin && git checkout origin/rails3' - sh 'cd vendor/hobo13 && git fetch origin && git checkout origin/rails3' + #sh 'cd vendor/hobo13 && git fetch origin && git checkout origin/rails3' #sh "cd vendor/plugins/hobo && git fetch origin && git checkout origin/1-0-stable" sh "rm -rf gitorials/agility ; git submodule update gitorials/agility ; cd gitorials/agility && git checkout -f origin/master" end diff --git a/manual/generators/admin_subsite.markdown b/manual/generators/admin_subsite.markdown index 0f5a18c..ac08cb6 100644 --- a/manual/generators/admin_subsite.markdown +++ b/manual/generators/admin_subsite.markdown @@ -13,12 +13,12 @@ Generators -- admin\_subsite + --make-front-site # Rename application.dryml to front_site.dryml [--user-resource-name=USER_RESOURCE_NAME] # User Resource Name # Default: user -i, [--invite-only] # Add features for an invite only website -t, [--test-framework=NAME] # Test framework to be invoked # Default: test_unit - [--make-front-site] # Rename application.dryml to front_site.dryml ## Runtime options @@ -35,4 +35,27 @@ Generators -- admin\_subsite - Create hobo files for admin_subsite generator. + + Creates a subsite, a namespaced section of your application. + + Controllers for the subsite are created in + app/controllers// and views are also in their own + subdirectory. This allows you to have two different controllers + and two different sets of views for the same model. + + The subsite will use app/views/taglibs/_site.dryml + as well as app/views/taglibs/application.dryml. This allows you + to customize the look and feel of a portion of your site. The + remaining views of your application that are not under a subsite + load both application.dryml and front_site.dryml. + + It is thus recommended that you ensure that + _site.dryml and application.dryml do not repeat + code, such as the inclusion of rapid or the setting of the theme. + One easy way of ensuring this is to use the --make-front-site + option. If you have already accounted for this, use + --make-front-site=false. + + The difference between hobo:admin_site and hobo:subsite is that + hobo:admin_site limits the subsite to use by administrators only. + diff --git a/manual/generators/assets.markdown b/manual/generators/assets.markdown index 64df3e4..f853887 100644 --- a/manual/generators/assets.markdown +++ b/manual/generators/assets.markdown @@ -23,4 +23,7 @@ Generators -- assets - Create hobo files for assets generator. + + This generator copies the files `application.dryml`, + `application.css`, `dryml-support.js`, + `config/initializers/dryml_taglibs.rb`, `app/models/guest.rb`. diff --git a/manual/generators/controller.markdown b/manual/generators/controller.markdown index 1da6b1e..2d9316f 100644 --- a/manual/generators/controller.markdown +++ b/manual/generators/controller.markdown @@ -33,4 +33,5 @@ Generators -- controller - Create hobo files for controller generator. + + Creates a Hobo model controller. Called from the Hobo `resource` generator. diff --git a/manual/generators/front_controller.markdown b/manual/generators/front_controller.markdown index 5348ce7..625e996 100644 --- a/manual/generators/front_controller.markdown +++ b/manual/generators/front_controller.markdown @@ -13,17 +13,17 @@ Generators -- front\_controller - [--add-routes] # Modify config/routes.rb to support the front controller - # Default: true - -d, [--delete-index] # Delete public/index.html - # Default: true [--user-resource-name=USER_RESOURCE_NAME] # User Resource Name # Default: user -i, [--invite-only] # Add features for an invite only website [--helpers] # Generates helper files # Default: true + [--add-routes] # Modify config/routes.rb to support the front controller + # Default: true -t, [--test-framework=NAME] # Test framework to be invoked # Default: test_unit + -d, [--delete-index] # Delete public/index.html + # Default: true ## Runtime options diff --git a/manual/generators/i18n.markdown b/manual/generators/i18n.markdown index bb619f0..d31a630 100644 --- a/manual/generators/i18n.markdown +++ b/manual/generators/i18n.markdown @@ -23,4 +23,5 @@ Generators -- i18n - Create hobo files for i18n generator. + + Copies the locale files for the specified locales. diff --git a/manual/generators/migration.markdown b/manual/generators/migration.markdown index 86fb31a..42e9009 100644 --- a/manual/generators/migration.markdown +++ b/manual/generators/migration.markdown @@ -13,9 +13,9 @@ Generators -- migration + -m, [--migrate] # Don't prompt for action - generate and migrate -g, [--generate] # Don't prompt for action - generate the migration -n, [--default-name] # Don't prompt for a migration name - just pick one - -m, [--migrate] # Don't prompt for action - generate and migrate -d, [--drop] # Don't prompt with 'drop or rename' - just drop everything diff --git a/manual/generators/setup_wizard.markdown b/manual/generators/setup_wizard.markdown index d49d17d..ba4e975 100644 --- a/manual/generators/setup_wizard.markdown +++ b/manual/generators/setup_wizard.markdown @@ -13,17 +13,22 @@ Generators -- setup\_wizard - [--gitignore-auto-generated-files] # Add the auto-generated files to .gitignore - # Default: true [--admin-subsite-name=ADMIN_SUBSITE_NAME] # Admin Subsite Name # Default: admin - [--dryml-only-templates] # The application uses only dryml templates + [--gitignore-auto-generated-files] # Add the auto-generated files to .gitignore + # Default: true + [--make-front-site] # Rename application.dryml to front_site.dryml + # Default: true + [--main-title] # Shows the main title + # Default: true [--private-site] # Make the site unaccessible to non-members [--fixture-replacement=FIXTURE_REPLACEMENT] # Use a specific fixture replacement [--default-locale=DEFAULT_LOCALE] # Sets the default locale - [--migration-generate] # Generate migration only - [--main-title] # Shows the main title + [--wizard] # Ask instead using options # Default: true + [--migration-generate] # Generate migration only + [--front-controller-name=FRONT_CONTROLLER_NAME] # Front Controller Name + # Default: front [--user-resource-name=USER_RESOURCE_NAME] # User Resource Name # Default: user [--locales=one two three] # Choose the locales @@ -32,16 +37,14 @@ Generators -- setup\_wizard # Default: true [--fixtures] # Add the fixture option to the test framework # Default: true - [--wizard] # Ask instead using options - # Default: true + [--add-admin-subsite] # Add an Admin Subsite + [--update] # Run bundle update to install the missing gems -t, [--test-framework=TEST_FRAMEWORK] # Use a specific test framework # Default: test_unit [--activation-email] # Send an email to activate the account + [--dryml-only-templates] # The application uses only dryml templates [--git-repo] # Create the git repository with the initial commit - [--update] # Run bundle update to install the missing gems -i, [--invite-only] # Add features for an invite only website - [--front-controller-name=FRONT_CONTROLLER_NAME] # Front Controller Name - # Default: front ## Runtime options diff --git a/manual/generators/subsite.markdown b/manual/generators/subsite.markdown index 1e1f5d3..6efa4ba 100644 --- a/manual/generators/subsite.markdown +++ b/manual/generators/subsite.markdown @@ -13,12 +13,12 @@ Generators -- subsite + -i, [--invite-only] # Add features for an invite only website + --make-front-site # Rename application.dryml to front_site.dryml [--user-resource-name=USER_RESOURCE_NAME] # User Resource Name # Default: user - -i, [--invite-only] # Add features for an invite only website -t, [--test-framework=NAME] # Test framework to be invoked # Default: test_unit - [--make-front-site] # Rename application.dryml to front_site.dryml ## Runtime options @@ -35,4 +35,26 @@ Generators -- subsite - Create hobo files for subsite generator. + + Creates a subsite, a namespaced section of your application. + + Controllers for the subsite are created in + app/controllers// and views are also in their own + subdirectory. This allows you to have two different controllers + and two different sets of views for the same model. + + The subsite will use app/views/taglibs/_site.dryml + as well as app/views/taglibs/application.dryml. This allows you + to customize the look and feel of a portion of your site. The + remaining views of your application that are not under a subsite + load both application.dryml and front_site.dryml. + + It is thus recommended that you ensure that + _site.dryml and application.dryml do not repeat + code, such as the inclusion of rapid or the setting of the theme. + One easy way of ensuring this is to use the --make-front-site + option. If you have already accounted for this, use + --make-front-site=false. + + The difference between hobo:admin_site and hobo:subsite is that + hobo:admin_site limits the subsite to use by administrators only. diff --git a/manual/generators/subsite_taglib.markdown b/manual/generators/subsite_taglib.markdown index 307cb8d..3ce4694 100644 --- a/manual/generators/subsite_taglib.markdown +++ b/manual/generators/subsite_taglib.markdown @@ -32,4 +32,6 @@ Generators -- subsite\_taglib - Create hobo files for subsite_taglib generator. + This generator is used to generate + app/views/taglibs/_site.dryml, and is used by the + subsite and admin_site generators. Do not use directly. diff --git a/manual/generators/test_framework.markdown b/manual/generators/test_framework.markdown index d2d4544..9cba58c 100644 --- a/manual/generators/test_framework.markdown +++ b/manual/generators/test_framework.markdown @@ -13,12 +13,12 @@ Generators -- test\_framework + [--fixture-replacement=FIXTURE_REPLACEMENT] # Use a specific fixture replacement + [--update] # Run bundle update to install the missing gems [--fixtures] # Add the fixture option to the test framework # Default: true - [--fixture-replacement=FIXTURE_REPLACEMENT] # Use a specific fixture replacement -t, [--test-framework=TEST_FRAMEWORK] # Use a specific test framework # Default: test_unit - [--update] # Run bundle update to install the missing gems ## Runtime options diff --git a/manual/generators/user_controller.markdown b/manual/generators/user_controller.markdown index ed26a85..afe9624 100644 --- a/manual/generators/user_controller.markdown +++ b/manual/generators/user_controller.markdown @@ -13,11 +13,11 @@ Generators -- user\_controller + -i, [--invite-only] # Add features for an invite only website [--helpers] # Generates helper files # Default: true -t, [--test-framework=NAME] # Test framework to be invoked # Default: test_unit - -i, [--invite-only] # Add features for an invite only website ## Runtime options @@ -30,8 +30,9 @@ Generators -- user\_controller -f, [--force] # Overwrite files that already exist -## Description +## USAGE - Create hobo files for user_controller generator. + This generator is used by the user_resource generator to generate + app/controllers/users_controller.rb diff --git a/manual/generators/user_mailer.markdown b/manual/generators/user_mailer.markdown index ca8c994..0e3ecc7 100644 --- a/manual/generators/user_mailer.markdown +++ b/manual/generators/user_mailer.markdown @@ -13,10 +13,10 @@ Generators -- user\_mailer - [--activation-email] # Send an email to activate the account -i, [--invite-only] # Add features for an invite only website -t, [--test-framework=NAME] # Test framework to be invoked # Default: test_unit + [--activation-email] # Send an email to activate the account ## Runtime options @@ -33,4 +33,4 @@ Generators -- user\_mailer - Create hobo files for user_mailer generator. + This generator is used by the user_resource generator to generate user_mailer.rb. diff --git a/manual/generators/user_model.markdown b/manual/generators/user_model.markdown index b2b7ff4..cbab156 100644 --- a/manual/generators/user_model.markdown +++ b/manual/generators/user_model.markdown @@ -13,11 +13,11 @@ Generators -- user\_model - [--admin-subsite-name=ADMIN_SUBSITE_NAME] # Admin Subsite Name - # Default: admin + [--timestamps] # Indicates when to generate timestamps -i, [--invite-only] # Add features for an invite only website [--activation-email] # Send an email to activate the account - [--timestamps] # Indicates when to generate timestamps + [--admin-subsite-name=ADMIN_SUBSITE_NAME] # Admin Subsite Name + # Default: admin ## Runtime options @@ -34,18 +34,7 @@ Generators -- user\_model - The model generator creates stubs for a new user model. - The generator takes a model name as its argument. The - model name may be given in CamelCase or under_score and - should not be suffixed with 'Model'. - - The generator creates a model class in app/models, invokes - the hobo:user_mailer andgenerator the test framework. - - -## Examples - - + This generator is used by the user_resource generator to generate a + user model file into app/models. - $ rails generate hobo:user_model User diff --git a/public/hobothemes/clean b/public/hobothemes/clean deleted file mode 120000 index 2d4acf3..0000000 --- a/public/hobothemes/clean +++ /dev/null @@ -1 +0,0 @@ -../../vendor/hobo13/hobo/lib/generators/hobo/rapid/templates/themes/clean/public \ No newline at end of file diff --git a/public/hobothemes/clean-sidemenu b/public/hobothemes/clean-sidemenu deleted file mode 120000 index 7e54b58..0000000 --- a/public/hobothemes/clean-sidemenu +++ /dev/null @@ -1 +0,0 @@ -../../vendor/hobo13/hobo/lib/generators/hobo/rapid/templates/themes/clean-sidemenu/public \ No newline at end of file diff --git a/public/hobothemes/clean-sidemenu/images/100-ACD3E6-DBE1E5-H.png b/public/hobothemes/clean-sidemenu/images/100-ACD3E6-DBE1E5-H.png new file mode 100644 index 0000000..a952ba5 Binary files /dev/null and b/public/hobothemes/clean-sidemenu/images/100-ACD3E6-DBE1E5-H.png differ diff --git a/public/hobothemes/clean-sidemenu/images/100-DBE1E5-FCFEF5-H.png b/public/hobothemes/clean-sidemenu/images/100-DBE1E5-FCFEF5-H.png new file mode 100644 index 0000000..4d8d779 Binary files /dev/null and b/public/hobothemes/clean-sidemenu/images/100-DBE1E5-FCFEF5-H.png differ diff --git a/public/hobothemes/clean-sidemenu/images/300-3B5F87-ACD3E6-H.png b/public/hobothemes/clean-sidemenu/images/300-3B5F87-ACD3E6-H.png new file mode 100644 index 0000000..a054913 Binary files /dev/null and b/public/hobothemes/clean-sidemenu/images/300-3B5F87-ACD3E6-H.png differ diff --git a/public/hobothemes/clean-sidemenu/images/spinner.gif b/public/hobothemes/clean-sidemenu/images/spinner.gif new file mode 100644 index 0000000..6da716a Binary files /dev/null and b/public/hobothemes/clean-sidemenu/images/spinner.gif differ diff --git a/public/hobothemes/clean-sidemenu/stylesheets/clean-sidemenu.css b/public/hobothemes/clean-sidemenu/stylesheets/clean-sidemenu.css new file mode 100644 index 0000000..381ee10 --- /dev/null +++ b/public/hobothemes/clean-sidemenu/stylesheets/clean-sidemenu.css @@ -0,0 +1,81 @@ +@import url('/hobothemes/clean/stylesheets/clean.css'); +@import url('/hobothemes/clean/stylesheets/rapid-ui.css'); + +body { + width: 95%; + min-width: 800px; +} + +.page-header div.search { + margin-top: 0; + padding-left:50px; + padding-right:0 +} + +.page-header{ + margin-top: 6px; + background: none; +} + +.account-nav { + margin-top: 0; +} + +.page-header h1 { + padding: 20px 30px 20px 20px; +} + +.page-header h1 a { + color:#3B5F87 +} + +#container{ + width:100%; +} + +#main-nav-container{ + width: 20%; + background: #ACD3E6 url(../images/300-3B5F87-ACD3E6-H.png) repeat-y; + vertical-align:top; +} + +#content-container { + width: 80%; + background-color:#FCFFF5; + vertical-align:top; +} + +.section.with-flash { + background: none; + padding-top: 10px; +} + +.main-nav { + padding: 30px 0; +} + +.main-nav li { + text-align: right; + margin-right: 0; + list-style-type: none; +} + +.main-nav a { + background: none; + border-bottom: 1px dotted #FCFFF5; + display: block; + font-size: 14px; + font-weight: bold; + padding: 7px 20px; + color: #FCFFF5; +} + +.main-nav a:hover { + background: #DBE1E5 url(../images/100-ACD3E6-DBE1E5-H.png) repeat-y; + color:#3B5F87; +} + +.main-nav li.current a { + background: #FCFFF5 url(../images/100-DBE1E5-FCFEF5-H.png) repeat-y; + color: #242E42; +} diff --git a/public/hobothemes/clean/images/101-3B5F87-ACD3E6.png b/public/hobothemes/clean/images/101-3B5F87-ACD3E6.png new file mode 100644 index 0000000..3072b06 Binary files /dev/null and b/public/hobothemes/clean/images/101-3B5F87-ACD3E6.png differ diff --git a/public/hobothemes/clean/images/30-3E547A-242E42.png b/public/hobothemes/clean/images/30-3E547A-242E42.png new file mode 100644 index 0000000..e48e34f Binary files /dev/null and b/public/hobothemes/clean/images/30-3E547A-242E42.png differ diff --git a/public/hobothemes/clean/images/30-DBE1E5-FCFEF5.png b/public/hobothemes/clean/images/30-DBE1E5-FCFEF5.png new file mode 100644 index 0000000..6073aa0 Binary files /dev/null and b/public/hobothemes/clean/images/30-DBE1E5-FCFEF5.png differ diff --git a/public/hobothemes/clean/images/300-ACD3E6-fff.png b/public/hobothemes/clean/images/300-ACD3E6-fff.png new file mode 100644 index 0000000..9997e23 Binary files /dev/null and b/public/hobothemes/clean/images/300-ACD3E6-fff.png differ diff --git a/public/hobothemes/clean/images/50-ACD3E6-fff.png b/public/hobothemes/clean/images/50-ACD3E6-fff.png new file mode 100644 index 0000000..d5c2c84 Binary files /dev/null and b/public/hobothemes/clean/images/50-ACD3E6-fff.png differ diff --git a/public/hobothemes/clean/images/fieldbg.gif b/public/hobothemes/clean/images/fieldbg.gif new file mode 100644 index 0000000..026d52a Binary files /dev/null and b/public/hobothemes/clean/images/fieldbg.gif differ diff --git a/public/hobothemes/clean/images/pencil.png b/public/hobothemes/clean/images/pencil.png new file mode 100644 index 0000000..0bfecd5 Binary files /dev/null and b/public/hobothemes/clean/images/pencil.png differ diff --git a/public/hobothemes/clean/images/small_close.png b/public/hobothemes/clean/images/small_close.png new file mode 100644 index 0000000..c32909e Binary files /dev/null and b/public/hobothemes/clean/images/small_close.png differ diff --git a/public/hobothemes/clean/images/spinner.gif b/public/hobothemes/clean/images/spinner.gif new file mode 100644 index 0000000..6da716a Binary files /dev/null and b/public/hobothemes/clean/images/spinner.gif differ diff --git a/public/hobothemes/clean/stylesheets/clean.css b/public/hobothemes/clean/stylesheets/clean.css new file mode 100644 index 0000000..df77106 --- /dev/null +++ b/public/hobothemes/clean/stylesheets/clean.css @@ -0,0 +1,326 @@ +body {color: #193440; background: url(../images/300-ACD3E6-fff.png) repeat-x #fff; } +.page-header {color: white; background: url(../images/101-3B5F87-ACD3E6.png) repeat-x #3F606E;} +.page-header .navigation.main-nav a { + background: url(../images/30-3E547A-242E42.png) repeat-x #242E42; +} +.page-header .navigation.main-nav li.current a { + color: #222; + background: url(../images/30-DBE1E5-FCFEF5.png) repeat-x #FCFEF5; + border-top: 1px solid white; + border-left: 1px solid white; + border-right: 1px solid white; +} +.page-header .navigation.main-nav a:hover {background: #193440;} +.section.content {background: #FCFFF5;} +.button {color: white; background: #5B8BA0;} +.button:hover {background-color: #193440;} +.add-to-collection {background: #E6E7DE;} +.aside { background: #E5E5E5;} + +/* Column Layout */ + +.section-group {display: table; width: 100%;} +.section-group-inner {display: table-row;} +.section-group-inner > * {display: table-cell; vertical-align: top;} +.aside {width: 210px;} /* works with % too */ +.aside { padding: 20px;} +/* ------ */ + + +body { + width: 960px; + margin: 0 auto 20px; + font: 12px "Lucida Grande", "Trebuchet MS", Arial, sans-serif; line-height: 18px; +} +h1, h2, h3 {font-weight: normal;} +h1 {margin: 20px 0 10px; font-size: 22px; line-height: 22px;} +h2 {margin: 15px 0 10px; font-size: 18px; line-height: 18px;} +h3 {margin: 10px 0 5px; font-size: 16px; line-height: 16px;} +h4 {margin: 10px 0 5px; font-size: 14px; line-height: 14px;} +h5 {margin: 10px 0 5px; font-size: 12px; line-height: 12px;} +h6 {margin: 10px 0 5px; font-size: 10px; line-height: 10px;} + +li {margin-left: 20px;} + +a { + border-bottom: 1px dotted #ccc; + color: #222; background: #fafafa; + text-decoration: none; +} +a:hover { + border-bottom: 1px dotted #aaa; + color: black; background: #f2f2f2; +} +h1 a, h2 a, h3 a {border: none; background: none;} + +pre, code { + font-family: "Courier New", Courier, monospace; +} + +input.text, input.string, input.email-address, input.password, input.search, input.integer, input.float, input.autocompleter, input.decimal, textarea { + border-top:1px solid #7c7c7c; + border-left:1px solid #c3c3c3; + border-right:1px solid #c3c3c3; + border-bottom:1px solid #ddd; + background: #fff url(../images/fieldbg.gif) repeat-x top; + font-size: 1.1em; line-height: 1.3em; +} + +input.file_upload { + border: 1px dotted #666; +} + +.button { + padding: 6px 10px; + border: none; + width: auto; + font-size: 11px; font-weight: bold; + margin-top: 10px; +} +.button:hover {cursor: pointer;} +form .actions {_zoom: 1; overflow: hidden; font-size: 11px;} +form .actions input { margin: 0; } + +.flash { + margin: 0 40px 10px; padding: 10px 30px; border-width: 2px 0; + color: white; +} +.flash.notice {background: #4E6A8F;} +.flash.error {background: #BC1C3D;} +.section.with-flash { padding-top: 20px; } + +/* rails error message */ +.error-messages { + background: #BC1C3D; + border: 1px solid #900024; + padding: 15px 30px; + color: white; + margin-bottom: 20px; +} +.error-messages h2 { + color: white; margin-top: 0; padding-bottom: 0; font-size: 16px; +} +.error-messages li {margin-left: 20px; list-style: square;} + +.field-with-errors input, .field-with-errors textarea, .field-with-errors select {border: 2px solid #BC1C3D;} + +#ajax-progress { + padding: 8px 20px 8px 40px; + border: 1px solid #444; + background: black url(../images/spinner.gif) no-repeat 10px 8px; + color: white; +} + +.field-list th {width: 120px; white-space: nowrap;} +.field-list td {width: auto;} +.field-list .input-help { color: #888;} + +.content-header, .content-body, .content-footer {margin: 0 45px 15px; padding: 0;} +.content-header {padding: 5px 0;} +.content-body {padding: 15px 0;} +.content-footer {padding-bottom: 20px;} + +.page-header {margin-top: 25px; padding: 0 0 0;} +.page-header h1 { + margin: 0; padding: 20px 30px 30px; + font-family: "Arial Black", Tahoma, Arial, sans-serif; font-size: 36px; letter-spacing: -1.5pt; +} +.page-header ul {zoom: 1; overflow: hidden;} +.page-header li {float: left; margin-left: 0; list-style: none;} + +.page-header .navigation a, +.page-header .navigation a:hover, +.page-header h1 a, +.page-header h1 a:hover + {border: none; color: white; background: none;} + +.page-header div.search { + float: right; + padding: 0 30px 8px 15px; + } +.page-header div.search label { + padding-right: 10px; + font: bold 9px Arial, sans-serif; text-transform: uppercase; letter-spacing: 1.0pt; +} +.page-header div.search input { + font-size: 10px; +} +#search-results-panel { + position: absolute; top: 35px; right: 25px; z-index: 50; + width: 350px; height: 500px; overflow: auto; + padding: 0 20px 20px; border: 1px solid #ddd; + color: black; background: #f2f2f2; +} +#search-results-panel .card.linkable a {color: black;} +#search-spinner {background:black;border:1px solid #666666;opacity:0.6;padding:2px;position:absolute;right:4px;top:6px;} + +.main-nav {padding: 0 30px;} +.main-nav li {margin-right: 10px;} +.page-header .main-nav a { + display: block; + padding: 5px 15px 7px; + font-size: 13px; font-weight: bold; +} + +.account-nav { + float:right; + margin: -22px 5px 0 0; + font-size: 11px; +} +.account-nav li { + float: left; + margin-left: 0; padding-left: 20px; + color: #ddd; + list-style: none; +} +.account-nav a {font-weight: bold;} +.account-nav a:hover {border-bottom: 1px dotted #ddd;} + +.user-account-page .change-password {width: 350px;} +.user-account-page .change-password th {width: 150px;} + +.page-footer {text-align: right; color: #ccc; padding: 5px; font-size: 11px;} + +/* pagination nav, needs a more specific class on the wrapper */ +.content-body .nav {margin-bottom: 10px; font-size: 11px;} +.content-body .nav a {margin-right: 5px;} + +.login-page, .forgot-password-page {width: 470px; margin-top: 40px;} +.login-page .content-header {padding-bottom: 0;} +.login-page .field-list {width: 370px;} +.login-page form .actions {text-align: left; margin: 0; padding: 10px 0 10px 160px;} +.signup-page .field-list {width: 370px;} +.signup-page .content-body, .signup-page .content-header { margin-left: 120px; margin-right: 120px;} +.login-page .field-list td, .signup-page .field-list td {width: auto;} +.login-page .field-list th, .signup-page .field-list th {width: 150px !important; width: 150px;} +.login-page .content-header { position: relative; } +.login-page .forgot-password {font-size: 11px; margin-left: 160px;} + +.edit-page .content-header {overflow: hidden; _zoom: 1;} +.edit-page .content-header h1 {float: left;} +.edit-page .content-header .delete-button {float: right; margin-top: 25px;} +form .actions {margin: 30px 0; width: 100%; text-align: center;} + +.show-page .content-header {position: relative; border-bottom: 1px dotted #888;} +.show-page .content-header h1, .new-in-collection-page .content-header h1 {margin-bottom: 2px; margin-right: 70px;} +.show-page .content-header a.edit-link {position: absolute; top: 30px; right: 0;} +.aside-content .collection {padding-bottom: 10px;} + +.content-header .creation-details {font-size: 11px; line-height: 11px;} +.content-header .creator {margin-right: 15px;} +.content-header .created-at {color: #444;} + +.new-in-collection-page .content-header h2 {margin-top: 6px; font-size: 14px;} +.new-in-collection-page .content-header h2, .new-in-collection-page .content-header h2 a {color: #222;} + +.add-to-collection {padding: 20px 30px; margin-top: 20px;} +.collection-section .add-to-collection h3 {margin: 0 0 20px; padding: 0; border-bottom: none;} +.add-to-collection form .submit-button {margin: 20px 130px;} +.add-to-collection .actions {text-align: left; margin-top: 0; margin-bottom: 0;} + +/* styling of generic elements */ +.creator {font-weight: bold;} +.card { + overflow: hidden; _zoom: 1; + margin: 10px 0; padding: 12px; border: 1px solid #e8e8e8; + background: #f5f5f5; + position: relative; +} +.card h4 {margin-top: 0;} +.card a {background: #f5f5f5;} +.card .creation-details { + display: block; color: #333; font-size: 11px; +} +.card .datetime {color: #666;} +.card .actions { position:absolute; right: 10px; top: 10px; } +div.ordering-handle { float: left; background: #ccc; color: white; margin-right: 5px; cursor: move; padding: 0 2px;} + +.card.content.with-owner { + padding: 0; margin: 10px 0 30px; border: none; + background: none; + font-size: 11px; +} +.card.content .creation-details { + float: left; width: 28%; + line-height: 14px; +} +.card.content .creation-details .created-at {display: block;} +.card.content.with-owner .content { + float: right; width: 72%; +} +ul.collection > li { margin-left: 0; list-style: none;} +.empty-collection-message {margin-top: 20px;} + +.new-link {margin-top: 20px;} + +.collection-section h3 { + padding: 15px 0; margin-bottom: 20px; border-bottom: 1px dotted #888; +} + +.table-plus .header {_zoom: 1; overflow: hidden;} +.table-plus .header a {float: left; margin-right: 20px;} +.table-plus div.search {float: right;} +.table-plus div.search span {color: #444;} +.table-plus div.search input.search {margin: 0 5px;} +.table-plus div.search .button {padding: 2px 4px;} + +.table-plus table {width: 100%; margin: 20px 0;} +.table-plus table th { + padding: 2px 10px; + color: white; background: #444; + font-weight: bold; font-size: 10px; +} +.table-plus table th a {color: white;} +.table-plus table td { + padding: 6px 10px; border-bottom: 1px solid #e2e2e2; color: #666; +} +.table-plus table td input.button, .collection .button {padding: 1px 3px; margin-left: 10px; margin-top: 0;} +.table-plus table td.controls {width: 100px;} +.table-plus .even {background: #f8f8f8;} +.table-plus a {background: none;} + +/* */ + +div.select-many {border-top: 1px dotted #999;} +div.select-many .items {margin-bottom: 10px;} +div.select-many .item { + overflow:hidden; _zoom: 1; font-weight: bold; + border-bottom: 1px dotted #999; padding: 5px 10px; /*margin: 5px 25px 5px 0;*/ +} +div.select-many .item span { float: left; } +div.select-many .item .remove-item { float: right; } + +/* */ + +#search-results-panel { postition: relative; } +#search-results-panel .close-button { cursor: pointer; text-decoration: underline; position: absolute; top: 3px; right: 6px;} + +/*******************************************************/ +/* these styles are for the generated front index page */ +/* you can delete them if you over-ride it */ + +.front-page .welcome-message { + padding: 10px 20px 20px; border: 1px solid #e8e8e8; + color: #222; + background: url(../images/50-ACD3E6-fff.png) repeat-x #fff; +} +.front-page .welcome-message h2 { + font-size: 18px; line-height: 27px; +} +.front-page ul.models li {margin-left: 0; list-style: none;} + +ul.input-many {list-style-type: none;} +ul.input-all {list-style-type: none;} + +ul.input-many > li { overflow:hidden; zoom:1;} +ul.input-many .input-many-item {float:left;} +ul.input-many div.buttons {float:left; margin-left:10px;} +li.input-many-template { display:none; } + +ul.check-many { list-style-type: none; margin-left: 0px;} +ul.check-many li input { vertical-align: -20%;} + +/* rapid-summary */ +table.app-summary { border: 1px solid; border-collapse: collapse; } +table.app-summary td { padding: 2px; border: 1px dotted #bbb; } +table.app-summary th { padding: 2px; border-bottom: 1px solid; background: #acd3e6; } diff --git a/public/hobothemes/clean/stylesheets/rapid-ui.css b/public/hobothemes/clean/stylesheets/rapid-ui.css new file mode 100644 index 0000000..f523d7f --- /dev/null +++ b/public/hobothemes/clean/stylesheets/rapid-ui.css @@ -0,0 +1,102 @@ +.hidden {display: none;} + +.in-place-textfield-bhv, .in-place-textarea-bhv, .in-place-html-textarea-bhv { + border: 1px dotted #666; + padding: 0 3px; padding-right: 20px; + background-image: url(../images/pencil.png); + background-position: top right; + background-repeat: no-repeat; +} + +.inplaceeditor-form input, .inplaceeditor-form textarea, +table.new-record textarea, table.new-record input { + border: 1px dotted #666; + padding: 3px; width: 100%; +} +.inplaceeditor-form, .inplaceeditor-form input { + display: inline; +} + +/**** Admin ****/ + +.admin-banner { + background: #9d0018; border-top: 2px solid #7a0013; border-bottom: 2px solid #7a0013; + padding: 2px 0; + margin: 10px 0; +} +.admin-banner p, .admin-banner span { + font: 12px "Lucida Grande", Arial, sans-serif; +} +.admin-banner p, .admin-banner div {margin-bottom: 0;} +.admin-banner a {color: white; text-decoration: none; padding: 1px 5px; font-weight: bold;} +.admin-banner a:hover {color: #9d0018; background: white;} +.admin-banner .logged-in { + float: right; +} + +/********* everything below here came from hobo_rapid.css, needs looking at ********/ + +/**** Default styling for Rapid ***/ + +#ajax-progress { + float: right; margin: 20px; + position: fixed; display: none; z-index: 10; +} + +/* Scriptaculous Autocompleter ---*/ + +div.completions-popup { + position:absolute; + width:250px; + background-color:white; + border:1px solid #888; + margin:0px; + padding:0px; +} +div.completions-popup ul { + list-style-type:none; + margin:0px; + padding:0px; +} +div.completions-popup ul li.selected { background-color: #ffb;} +div.completions-popup ul li { + list-style-type:none; + display:block; + margin:0; + padding:2px; + cursor:pointer; +} + + +.field-list {width:100%;} +.field-list td {vertical-align: middle;} +.field-list th {font-weight: bold;} +.field-list th, .field-list td {padding: 5px 0;} +.field-list th {padding-right: 10px;} + +.field-list td.field-label { + text-align: left; width: 1px; white-space: nowrap; vertical-align: top; + padding-top: 10px; padding-bottom: 10px; +} +.field-list textarea, .field-list input[type=text], .field-list input[type=password] { width: 99%; margin: 0; } + +/*input[type=text].wide { width: 100%; }*/ +textarea { height: 170px; } +textarea.wide { width: 100%; } +textarea.tall { height: 350px; } + +.field-list input.percentage {width: 25px; display: inline; margin-right: 5px; padding: 1px 3px;} + +select.dev-user-changer { opacity: 0.3; } +select.dev-user-changer:hover { opacity: 1; } + +.part-wrapper { + display: inline; /* don't mess up layout when wrapping something */ +} + +optgroup.disabled-option { + color: #ccc; + height: 1em; +} + +input.nil-value { color:grey; } diff --git a/public/javascripts/hobo-rapid.js b/public/javascripts/hobo-rapid.js deleted file mode 120000 index 7d25d97..0000000 --- a/public/javascripts/hobo-rapid.js +++ /dev/null @@ -1 +0,0 @@ -../../vendor/plugins/hobo/hobo/rails_generators/hobo_rapid/templates/hobo-rapid.js \ No newline at end of file diff --git a/public/javascripts/hobo-rapid.js b/public/javascripts/hobo-rapid.js new file mode 100644 index 0000000..e16571f --- /dev/null +++ b/public/javascripts/hobo-rapid.js @@ -0,0 +1,1030 @@ +Object.extend = function(destination) { + $A(arguments).slice(1).each(function (src) { + for (var property in src) { + destination[property] = src[property]; + } + }) + return destination +} + +Object.merge = function() { + return Object.extend.apply(this, [{}].concat($A(arguments))) +} + +var Hobo = { + + searchRequest: null, + uidCounter: 0, + ipeOldValues: {}, + spinnerMinTime: 500, // milliseconds + + uid: function() { + Hobo.uidCounter += 1 + return "uid" + Hobo.uidCounter + }, + + updatesForElement: function(el) { + el = $(el) + var updates = Hobo.getClassData(el, 'update') + return updates ? updates.split(':') : [] + }, + + ajaxSetFieldForElement: function(el, val, options) { + var updates = Hobo.updatesForElement(el) + var params = Hobo.fieldSetParam(el, val) + var p = el.getAttribute("hobo-ajax-params") + if (p) params = params + "&" + p + + var opts = Object.merge(options || {}, { params: params, message: el.getAttribute("hobo-ajax-message")}) + Hobo.ajaxRequest(Hobo.putUrl(el), updates, opts) + }, + + ajaxUpdateParams: function(updates, resultUpdates) { + var params = [] + var i = 0 + if (updates.length > 0) { + updates.each(function(id_or_el) { + var el = $(id_or_el) + if (el) { // ignore update of parts that do not exist + var partDomId = el.id + if (!hoboParts[partDomId]) { throw "Update of dom-id that is not a part: " + partDomId } + params.push("render["+i+"][part_context]=" + encodeURIComponent(hoboParts[partDomId])) + params.push("render["+i+"][id]=" + partDomId) + i += 1 + } + }) + params.push("page_path=" + encodeURIComponent(hoboPagePath)) + } + + if (resultUpdates) { + resultUpdates.each(function (resultUpdate) { + params.push("render["+i+"][id]=" + resultUpdate.id) + params.push("render["+i+"][result]=" + resultUpdate.result) + if (resultUpdate.func) { + params.push("render["+i+"][function]=" + resultUpdate.func) + } + i += 1 + }) + } + return params.join('&') + }, + + ajaxRequest: function(url_or_form, updates, options) { + options = Object.merge({ asynchronous:true, + evalScripts:true, + resetForm: false, + refocusForm: false, + message: "Saving..." + }, options) + if (typeof url_or_form == "string") { + var url = url_or_form + var form = false + } else { + var form = url_or_form + var url = form.action + } + var params = [] + + if (typeof(formAuthToken) != "undefined") { + params.push(formAuthToken.name + "=" + formAuthToken.value) + } + + updateParams = Hobo.ajaxUpdateParams(updates, options.resultUpdate) + if (updateParams != "") { params.push(updateParams) } + + if (options.params) { + params.push(options.params) + delete options.params + } + + if (form) { + params.push(Form.serialize(form)) + } + + if (options.message != false) Hobo.showSpinner(options.message, options.spinnerNextTo) + + var complete = function() { + if (options.message != false) Hobo.hideSpinner(); + if (options.onComplete) options.onComplete.apply(this, arguments) + if (form && options.refocusForm) Form.focusFirstElement(form) + Event.addBehavior.reload() + } + var success = function() { + if (options.onSuccess) options.onSuccess.apply(this, arguments) + if (form && options.resetForm) form.reset(); + } + if (options.method && options.method.toLowerCase() == "put") { + delete options.method + params.push("_method=PUT") + } + + if (!options.onFailure) { + options.onFailure = function(response) { + alert(response.responseText) + } + } + + new Ajax.Request(url, Object.merge(options, { parameters: params.join("&"), onComplete: complete, onSuccess: success })) + }, + + hide: function() { + for (i = 0; i < arguments.length; i++) { + if ($(arguments[i])) { + Element.addClassName(arguments[i], 'hidden') + } + } + }, + + show: function() { + for (i = 0; i < arguments.length; i++) { + if ($(arguments[i])) { + Element.removeClassName(arguments[i], 'hidden') + } + } + }, + + toggle: function() { + for (i = 0; i < arguments.length; i++) { + if ($(arguments[i])) { + if(Element.hasClassName(arguments[i], 'hidden')) { + Element.removeClassName(arguments[i], 'hidden') + } else { + Element.addClassName(arguments[i], 'hidden') + } + } + } + }, + + onFieldEditComplete: function(el, newValue) { + el = $(el) + var oldValue = Hobo.ipeOldValues[el.id] + delete Hobo.ipeOldValues[el.id] + + var blank = el.getAttribute("hobo-blank-message") + if (blank && newValue.strip().length == 0) { + el.update(blank) + } else { + el.update(newValue) + } + + var modelId = Hobo.getModelId(el) + if (oldValue) { + $$(".model:" + modelId).each(function(e) { + if (e != el && e.innerHTML == oldValue) e.update(newValue) + }) + } + }, + + _makeInPlaceEditor: function(el, options) { + var old + var updates = Hobo.updatesForElement(el) + var id = el.id + if (!id) { id = el.id = Hobo.uid() } + var updateParams = Hobo.ajaxUpdateParams(updates, [{id: id, + result: 'new_field_value', + func: "Hobo.onFieldEditComplete"}]) + var opts = {okButton: false, + cancelLink: false, + submitOnBlur: true, + evalScripts: true, + htmlResponse: false, + ajaxOptions: { method: "put" }, + onEnterHover: null, + onLeaveHover: null, + callback: function(form, val) { + old = val + el.setAttribute("hobo-edit-text", val) + return (Hobo.fieldSetParam(el, val) + "&" + updateParams) + }, + onFailure: function(_, resp) { + alert(resp.responseText); el.innerHTML = old + }, + onEnterEditMode: function() { + var blank_message = el.getAttribute("hobo-blank-message") + var editable_text = el.getAttribute("hobo-edit-text") + if (editable_text) { + el.innerHTML = editable_text + } + if (el.innerHTML.gsub(" ", " ") == blank_message) { + el.innerHTML = "" + } else { + Hobo.ipeOldValues[el.id] = el.innerHTML + } + } + } + Object.extend(opts, options) + return new Ajax.InPlaceEditor(el, Hobo.putUrl(el), opts) + }, + + + doSearch: function(el) { + el = $(el) + var spinner = $(el.getAttribute("search-spinner") || "search-spinner") + var search_results = $(el.getAttribute("search-results") || "search-results") + var search_results_panel = $(el.getAttribute("search-results-panel") || "search-results-panel") + var url = el.getAttribute("search-url") || (urlBase + "/search") + + var clear = function() { Hobo.hide(search_results_panel); el.clear() } + + // Close window on [Escape] + Event.observe(el, 'keypress', function(ev) { + if (ev.keyCode == 27) clear() + }); + + Event.observe(search_results_panel.down('.close-button'), 'click', clear) + + var value = $F(el) + if (Hobo.searchRequest) { Hobo.searchRequest.transport.abort() } + if (value.length >= 3) { + if (spinner) Hobo.show(spinner); + Hobo.searchRequest = new Ajax.Updater(search_results, + url, + { asynchronous:true, + evalScripts:true, + onSuccess:function(request) { + if (spinner) Hobo.hide(spinner) + if (search_results_panel) { + Hobo.show(search_results_panel) + } + }, + method: "get", + parameters:"query=" + value }); + } else { + Hobo.updateElement(search_results, '') + Hobo.hide(search_results_panel) + } + }, + + + putUrl: function(el) { + var spec = Hobo.modelSpecForElement(el) + return urlBase + "/" + Hobo.pluralise(spec.name) + "/" + spec.id + "?_method=PUT" + }, + + + urlForId: function(id) { + var spec = Hobo.parseModelSpec(id) + var url = urlBase + "/" + Hobo.pluralise(spec.name) + if (spec.id) { url += "/" + spec.id } + return url + }, + + + fieldSetParam: function(el, val) { + var spec = Hobo.modelSpecForElement(el) + var res = spec.name + '[' + spec.field + ']=' + encodeURIComponent(val) + if (typeof(formAuthToken) != "undefined") { + res = res + "&" + formAuthToken.name + "=" + formAuthToken.value + } + return res + }, + + + fadeObjectElement: function(el) { + var fadeEl = Hobo.objectElementFor(el) + new Effect.Fade(fadeEl, { duration: 0.5, afterFinish: function (ef) { + ef.element.remove() + } }); + Hobo.showEmptyMessageAfterLastRemove(fadeEl) + }, + + + removeButton: function(el, url, updates, options) { + if (options.fade == null) { options.fade = true; } + if (options.confirm == null) { options.confirm = "Are you sure?"; } + + if (options.confirm == false || confirm(options.confirm)) { + var objEl = Hobo.objectElementFor(el) + Hobo.showSpinner('Removing'); + function complete() { + if (options.fade) { Hobo.fadeObjectElement(objEl) } + Hobo.hideSpinner() + } + if (updates && updates.length > 0) { + new Hobo.ajaxRequest(url, updates, { method:'delete', message: "Removing...", onComplete: complete}); + } else { + var ajaxOptions = {asynchronous:true, evalScripts:true, method:'delete', onComplete: complete} + if (typeof(formAuthToken) != "undefined") { + ajaxOptions.parameters = formAuthToken.name + "=" + formAuthToken.value + } + new Ajax.Request(url, ajaxOptions); + } + } + }, + + + ajaxUpdateField: function(element, field, value, updates) { + var objectElement = Hobo.objectElementFor(element) + var url = Hobo.putUrl(objectElement) + var spec = Hobo.modelSpecForElement(objectElement) + var params = spec.name + '[' + field + ']=' + encodeURIComponent(value) + new Hobo.ajaxRequest(url, updates, { method:'put', message: "Saving...", params: params }); + }, + + + showEmptyMessageAfterLastRemove: function(el) { + var empty + var container = $(el.parentNode) + if (container.getElementsByTagName(el.nodeName).length == 1 && + (empty = container.next('.empty-collection-message'))) { + new Effect.Appear(empty, {delay:0.3}) + } + }, + + + getClassData: function(el, name) { + var match = el.className.match(new RegExp("(^| )" + name + "::(\\S+)($| )")) + return match && match[2] + }, + + + getModelId: function(el) { + return Hobo.getClassData(el, 'model') + }, + + + modelSpecForElement: function(el) { + var id = Hobo.getModelId(el) + return id && Hobo.parseModelSpec(id) + }, + + + parseModelSpec: function(id) { + m = id.gsub('-', '_').match(/^([^:]+)(?::([^:]+)(?::([^:]+))?)?$/) + if (m) return { name: m[1], id: m[2], field: m[3] } + }, + + + objectElementFor: function(el) { + var m + while(el.getAttribute) { + id = Hobo.getModelId(el) + if (id) m = id.match(/^[^:]+:[^:]+$/); + if (m) break; + el = el.parentNode; + } + if (m) return el; + }, + + modelIdFor: function(el) { + var e = Hobo.objectElementFor(el) + return e && Hobo.getModelId(e) + }, + + + showSpinner: function(message, nextTo) { + clearTimeout(Hobo.spinnerTimer) + Hobo.spinnerHideAt = new Date().getTime() + Hobo.spinnerMinTime; + if (t = $('ajax-progress-text')) { + if (!message || message.length == 0) { + t.hide() + } else { + Element.update(t, message); + t.show() + } + } + if (e = $('ajax-progress')) { + if (nextTo) { + var e_nextTo = $(nextTo); + var pos = e_nextTo.cumulativeOffset() + e.style.top = pos.top - e_nextTo.offsetHeight + "px" + e.style.left = (pos.left + e_nextTo.offsetWidth + 5) + "px" + } + e.style.display = "block"; + } + }, + + + hideSpinner: function() { + if (e = $('ajax-progress')) { + var remainingTime = Hobo.spinnerHideAt - new Date().getTime() + if (remainingTime <= 0) { + e.visualEffect('Fade') + } else { + Hobo.spinnerTimer = setTimeout(function () { e.visualEffect('Fade') }, remainingTime) + } + } + }, + + + updateElement: function(id, content) { + Element.update(id, content) + Element.fire($(id), "rapid:partupdated") + }, + + getStyle: function(el, styleProp) { + if (el.currentStyle) + var y = el.currentStyle[styleProp]; + else if (window.getComputedStyle) + var y = document.defaultView.getComputedStyle(el, null).getPropertyValue(styleProp); + return y; + }, + + partFor: function(el) { + while (el) { + if (el.id && hoboParts[el.id]) { return el } + el = el.parentNode + } + return null + }, + + pluralise: function(s) { + return pluralisations[s] || s + "s" + }, + + addUrlParams: function(params, options) { + params = $H(window.location.search.toQueryParams()).merge(params) + + if (options.remove) { + var remove = (options.remove instanceof Array) ? options.remove : [options.remove] + remove.each(function(k) { params.unset(k) }) + } + + return window.location.href.sub(/(\?.*|$)/, "?" + params.toQueryString()) + }, + + + fixSectionGroup: function(e) { + rows = e.childElements().map(function(e, i) { + cells = e.childElements().map(function(e, i) { + return e.outerHTML.sub("$/i, "") + }).join('') + + var attrs = e.outerHTML.match(/]+)/)[1] + return "" + cells + "" + }).join("\n") + + var attrs = e.outerHTML.match(/]+)/)[1] + + var table= "" + + rows + "
" + e.outerHTML = table + }, + + makeHtmlEditor: function(textarea) { + // do nothing - plugins can overwrite this method + } + + +} + +Element.findContaining = function(el, tag) { + el = $(el) + tag = tag.toLowerCase() + e = el.parentNode + while (el) { + if (el.nodeName.toLowerCase() == tag) { + return el; + } + e = el.parentNode + } + return null; +} + +Element.Methods.childWithClass = function(el, klass) { + var ret=null; + el.childElements().each(function(el2) { + if(ret==null && el2.hasClassName(klass)) ret=el2; + }); + return ret; +} + +// Add an afterEnterEditMode hook to in-place-editor +origEnterEditMode = Ajax.InPlaceEditor.prototype.enterEditMode +Ajax.InPlaceEditor.prototype.enterEditMode = function(evt) { + origEnterEditMode.bind(this)(evt) + if (this.afterEnterEditMode) this.afterEnterEditMode() + return false +} + +// Fix Safari in-place-editor bug +Ajax.InPlaceEditor.prototype.removeForm = function() { + if (!this._form) return; + + if (this._form.parentNode) { try { Element.remove(this._form); } catch (e) {}} + this._form = null; + this._controls = { }; +} + +// Silence errors from IE :-( +Field.scrollFreeActivate = function(field) { + setTimeout(function() { + try { + Field.activate(field); + } catch(e) {} + }, 1); +} + + +Element.Methods.$$ = function(e, css) { + return new Selector(css).findElements(e) +} + + +HoboBehavior = Class.create({ + + initialize: function(mainSelector, features) { + this.mainSelector = mainSelector + this.features = features + this.addEvents(mainSelector, features.events) + if (features.initialize) { + document.observe("dom:loaded", features.initialize); + } + }, + + addEvents: function(parentSelector, events) { + var self = this + + for (selector in events) { + fullSelector = parentSelector + ' ' + selector + var rhs = events[selector] + if (Object.isString(rhs)) { + this.addBehavior(fullSelector, this.features[rhs]) + } else { + this.addEvents(fullSelector, rhs) + } + } + + }, + + addBehavior: function(selector, handler) { + var self = this + behavior = {} + behavior[selector] = function(ev) { + self.features.element = this.up(self.mainSelector) + handler.call(self.features, ev, this) + } + Event.addBehavior(behavior) + } + +}) + + +HoboInputMany = { + + events: { + "> li > div.buttons": { + ".add-item:click": 'addOne', + ".remove-item:click": 'removeOne' + } + }, + + initialize: function(ev) { + /* the second clause should be sufficient, but it isn't in IE7. See bug 603 */ + Element.select(ev.target, ".input-many-template input:hidden, .input-many-template select:hidden, .input-many-template textarea:hidden, .input-many-template button:hidden").each(function(input) { + if(!input.disabled) { + input.disabled = true; + input.addClassName("input_many_template_input"); + } + }); + + // disable all elements inside our template, and mark them so we can find them later. + Element.select(ev.target, ".input-many-template input:enabled, .input-many-template select:enabled, .input-many-template textarea:enabled, .input-many-template button:enabled").each(function(input) { + input.disabled = true; + input.addClassName("input_many_template_input"); + }); + + Element.select(ev.target, ".sortable-input-many").each(function(el) { + HoboInputMany.createSortable.call(el); + }); + + /* need to reinitialize after every change */ + Event.addBehavior({".sortable-input-many:rapid:change": function(ev) { + HoboInputMany.createSortable.call(this); + }}); + + document.observe("rapid:partupdated", HoboInputMany.initialize); + }, + + createSortable: function() { + Sortable.create(this.id, { + constraint: 'vertical', + handle: 'ordering-handle', + overlap: 'vertical', + scroll: 'window', + onUpdate: function(list) { + HoboInputMany.fixIndices.call(list); + } + }); + }, + + // given this==the input-many, returns a lambda that updates the name & id for an element + getNameUpdater: function(new_index) { + var name_prefix = Hobo.getClassData(this, 'input-many-prefix'); + var id_prefix = name_prefix.replace(/\[/g, "_").replace(/\]/g, ""); + var name_re = RegExp("^" + RegExp.escape(name_prefix)+ "\[\-?[0-9]+\]"); + var name_sub = name_prefix + '[' + new_index.toString() + ']'; + var id_re = RegExp("^" + RegExp.escape(id_prefix)+ "_\-?[0-9]+"); + var id_sub = id_prefix + '_' + new_index.toString(); + var class_re = RegExp(RegExp.escape(name_prefix)+ "\[\-?[0-9]+\]"); + var class_sub = name_sub; + + return function() { + if(this.name) { + this.name = this.name.replace(name_re, name_sub); + } + if (id_prefix==this.id.slice(0, id_prefix.length)) { + this.id = this.id.replace(id_re, id_sub); + } else { + // silly rails. text_area_tag and text_field_tag use different conventions for the id. + if(name_prefix==this.id.slice(0, name_prefix.length)) { + this.id = this.id.replace(name_re, name_sub); + } /* else { + hjq.util.log("hjq.input_many.update_id: id_prefix "+id_prefix+" didn't match input "+this.id); + } */ + } + if (class_re.test(this.className)) { + this.className = this.className.replace(class_re, class_sub); + } + return this; + }; + }, + + // given this==an input-many item, get the submit index + getIndex: function() { + return Number(this.id.match(/_([-0-9]+)$/)[1]); + }, + + /* For some reason, select() and down() and all those useful functions aren't working for us. Roll our own replacement. + + this: element to recurse on. + klass: class to filter on + f: function to invoke + */ + recurse_elements_with_class: function(klass,f ) { + if(klass==null || this.hasClassName(klass)) { + f(this); + } + this.childElements().each(function(el2) {HoboInputMany.recurse_elements_with_class.call(el2, klass, f);}); + }, + +/* fixes the indices on an input-many so they're in order. */ + fixIndices: function() { + var lis = this.immediateDescendants(); + var minimum = parseInt(Hobo.getClassData(this, 'minimum')); + /* first two lis are hidden/disabled on an input-many */ + for(var i=0; i=0 && ul.immediateDescendants().length>2) { + /* if(console) console.log("IE7 messed up again (bug 605)"); */ + return; + } + + var template = ul.down("li.input-many-template"); + var clone = $(template.cloneNode(true)); + clone.removeClassName("input-many-template"); + // length-2 because ignore the template li and the empty li + var name_updater = this.getNameUpdater.call(ul, ul.childElements().length-2); + + function reenable_inputs(el) { + if(el.hasClassName("input_many_template_input")) { + el.disabled = false; + el.removeClassName("input_many_template_input"); + } + el.childElements().each(function(el2) { + if(!el2.hasClassName("input-many-template")) reenable_inputs(el2); + }); + } + reenable_inputs(clone); + + // update id & name + HoboInputMany.recurse_elements_with_class.call(clone, null, function(el) { + name_updater.call(el); + }); + + // do the add with anim + clone.setStyle("display", "none") + li.insert({after: clone}); + new Effect.BlindDown(clone, {duration: 0.3, afterFinish: function(ef) { + Event.addBehavior.reload(); + + ul.fire("rapid:add", { element: clone }); + ul.fire("rapid:change", { element: clone }); + }}); + + // visibility + if(li.hasClassName("empty")) { + li.addClassName("hidden"); + li.childWithClass("empty-input").disabled = true; + } else { + // now that we've added an element after us, we should only have a '-' button + li.childWithClass("buttons").childWithClass("remove-item").removeClassName("hidden"); + li.childWithClass("buttons").childWithClass("add-item").addClassName("hidden"); + } + + return; + }, + + removeOne: function(ev, el) { + Event.stop(ev); + var that = this; + var ul = el.up('ul.input-many'), li = el.up('li.input-many-li') + var minimum = parseInt(Hobo.getClassData(ul, 'minimum')); + + if(li.id.search(/_-1$/)>=0) { + /* if(console) console.log("IE7 messed up again (bug 605)"); */ + return; + } + + if(ul.fire("rapid:remove", { element: li }).stopped) return; + + // rename everybody from me onwards + var i=this.getIndex.call(li) + var n=li.next(); + for(; n; i+=1, n=n.next()) { + var name_updater = this.getNameUpdater.call(ul, i); + HoboInputMany.recurse_elements_with_class.call(n, null, function(el) {name_updater.call(el);}); + } + + // adjust +/- buttons on the button element as appropriate + var last=ul.childElements()[ul.childElements().length-1]; + if(last==li) { + last = last.previous(); + } + + if(last.hasClassName("empty")) { + last.removeClassName("hidden"); + HoboInputMany.recurse_elements_with_class.call(last, "empty-input", function(el) {el.disabled=false;}); + } else { + // if we've reached the minimum, we don't want to add the '-' button + if(ul.childElements().length-3 <= minimum||0) { + last.childWithClass("buttons").childWithClass("remove-item").addClassName("hidden"); + } else { + last.childWithClass("buttons").childWithClass("remove-item").removeClassName("hidden"); + } + last.childWithClass("buttons").childWithClass("add-item").removeClassName("hidden"); + } + + new Effect.BlindUp(li, { duration: 0.3, afterFinish: function (ef) { + ul.fire("rapid:change") + li.remove() + } }); + + } + + + +} + +new HoboBehavior("ul.input-many", HoboInputMany); + + +SelectManyInput = Behavior.create({ + + initialize : function() { + // onchange doesn't bubble in IE6 so... + Event.observe(this.element.down('select'), 'change', this.addOne.bind(this)) + }, + + addOne : function() { + var select = this.element.down('select') + var selected = select.options[select.selectedIndex] + if ($F(select) != "") { + var newItem = $(DOM.Builder.fromHTML(this.element.down('.item-proto').innerHTML.strip())) + this.element.down('.items').appendChild(newItem); + newItem.down('span').innerHTML = selected.innerHTML + this.itemAdded(newItem, selected) + var optgroup = new Element("optgroup", {alt:selected.value, label:selected.text}) + optgroup.addClassName("disabled-option") + selected.replace(optgroup) + select.value = "" + Event.addBehavior.reload() + this.element.fire("rapid:add", { element: newItem }) + this.element.fire("rapid:change", { element: newItem }) + } + }, + + onclick : function(ev) { + var el = Event.element(ev); + if (el.match(".remove-item")) { this.removeOne(el.parentNode) } + }, + + removeOne : function(el) { + var element = this.element + new Effect.BlindUp(el, + { duration: 0.3, + afterFinish: function (ef) { + ef.element.remove() + element.fire("rapid:remove", { element: el }) + element.fire("rapid:change", { element: el }) + } } ) + var label = el.down('span').innerHTML + var optgroup = element.down("optgroup[label="+label+"]") + var option = new Element("option", {value:optgroup.readAttribute("alt")}) + option.innerHTML = optgroup.readAttribute("label") + optgroup.replace(option) + }, + + itemAdded: function(item, option) { + this.hiddenField(item).value = option.value + }, + + hiddenField: function(item) { + return item.down('input[type=hidden]') + //return item.getElementsByClassName("hidden-field")[0] + } + + +}) + +NameManyInput = Object.extend(SelectManyInput, { + addOne : function() { + var select = this.element.down('select') + var selected = select.options[select.selectedIndex] + if (selected.value != "") { + var newItem = $(DOM.Builder.fromHTML(this.element.down('.item-proto').innerHTML.strip())) + this.element.down('.items').appendChild(newItem); + newItem.down('span').innerHTML = selected.innerHTML + this.itemAdded(newItem, selected) + selected.disabled = true + select.value = "" + Event.addBehavior.reload() + } + } +}) + + +AutocompleteBehavior = Behavior.create({ + initialize : function() { + this.minChars = parseInt(Hobo.getClassData(this.element, "min-chars")); + var match = this.element.className.match(/complete-on::([\S]+)/) + var target = match[1].split('::') + var typedId = target[0] + var completer = target[1] + + var spec = Hobo.parseModelSpec(typedId) + var url = urlBase + "/" + Hobo.pluralise(spec.name) + "/complete_" + completer + var parameters = spec.id ? "id=" + spec.id : "" + this.autocompleter = new Ajax.Autocompleter(this.element, + this.element.next('.completions-popup'), + url, + {paramName:'query', method:'get', parameters: parameters, minChars: this.minChars, + afterUpdateElement: this.afterUpdateElement}); + }, + + onfocus: function() { + if(this.element.hasClassName("nil-value")) { + this.element.value = ''; + this.element.removeClassName("nil-value"); + } + if(this.minChars==0) { + this.autocompleter.activate(); + } + }, + + afterUpdateElement: function(input, li) { + input.fire("rapid:autocomplete-assigned"); + } + +}) + + + +Event.addBehavior.reassignAfterAjax = true; +Event.addBehavior({ + + 'div.section-group' : function() { + if (Prototype.Browser.IE) Hobo.fixSectionGroup(this); + }, + + 'div.select-many.input' : SelectManyInput(), + + 'textarea.html' : function() { + Hobo.makeHtmlEditor(this) + }, + + 'form.filter-menu select:change': function(event) { + var paramName = this.getAttribute('name') + var params = {} + var remove = [ 'page' ] + if ($F(this) == '') { + remove.push(paramName) + } else { + params[paramName] = $F(this) + } + location.href = Hobo.addUrlParams(params, {remove: remove}) + }, + + '.autocompleter' : AutocompleteBehavior(), + + '.string.in-place-edit, .datetime.in-place-edit, .date.in-place-edit, .integer.in-place-edit, .float.in-place-edit, .decimal.in-place-edit' : + function (ev) { + + var ipe = Hobo._makeInPlaceEditor(this) + ipe.getText = function() { + return this.element.innerHTML.gsub(//, "\n").unescapeHTML() + } + }, + + '.text.in-place-edit, .markdown.in-place-edit, .textile.in-place-edit' : function (ev) { + var ipe = Hobo._makeInPlaceEditor(this, {rows: 2}) + ipe.getText = function() { + return this.element.innerHTML.gsub(//, "\n").unescapeHTML() + } + }, + + ".html.in-place-edit" : function (ev) { + if (Hobo.makeInPlaceHtmlEditor) { + Hobo.makeInPlaceHtmlEditor(this) + } else { + var options = { + rows: 2, handleLineBreaks: false, okButton: true, cancelLink: true, okText: "Save", submitOnBlur: false + } + var ipe = Hobo._makeInPlaceEditor(this, options) + ipe.getText = function() { + // Be careful! we're not calling unescapeHTML() here! + return this.element.innerHTML + } + } + }, + + "select.integer.editor" : function(e) { + var el = this + el.onchange = function() { + Hobo.ajaxSetFieldForElement(el, $F(el)) + } + }, + + "input.live-search[type=search]" : function(e) { + var element = this + new Form.Element.Observer(element, 1.0, function() { Hobo.doSearch(element) }) + } + + +}); + +ElementSet = Class.create(Enumerable, { + + initialize: function(array) { + this.items = array + }, + + _each: function(fn) { + return this.items.each(fn) + }, + + selectChildren: function(selector) { + return new ElementSet(this.items.invoke('selectChildren', selector).pluck('items').flatten()) + }, + + child: function(selector) { + return this.selectChildren(selector).first() + }, + + select: function(selector) { + return new ElementSet(this.items.invoke('select', selector).flatten()) + }, + + down: function(selector) { + for (var i = 0; i < this.items.length; i++) { + var match = this.items[i].down(selector) + if (match) return match + } + return null + }, + + size: function() { + return this.items.length + }, + + first: function() { + return this.items.first() + }, + + last: function() { + return this.items.last() + } + +}) + +Element.addMethods({ + selectChildren: function(element, selector) { + return new ElementSet(Selector.matchElements(element.childElements(), selector)) + } +}) diff --git a/public/javascripts/ie7-recalc.js b/public/javascripts/ie7-recalc.js new file mode 100644 index 0000000..91e6417 --- /dev/null +++ b/public/javascripts/ie7-recalc.js @@ -0,0 +1,166 @@ + +// ========================================================================= +// ie7-recalc.js +// ========================================================================= + +(function() { + /* --------------------------------------------------------------------- + + This allows refreshing of IE7 style rules. If you modify the DOM + you can update IE7 by calling document.recalc(). + + This should be the LAST module included. + + --------------------------------------------------------------------- */ + + if (!IE7.loaded) return; + + // remove all IE7 classes from an element + CLASSES = /\sie7_class\d+/g; + + IE7.CSS.extend({ + // store for elements that have style properties calculated + elements: {}, + handlers: [], + + // clear IE7 classes and styles + reset: function() { + this.removeEventHandlers(); + // reset IE7 classes here + var elements = this.elements; + for (var i in elements) elements[i].runtimeStyle.cssText = ""; + this.elements = {}; + // reset runtimeStyle here + var elements = IE7.Rule.elements; + for (var i in elements) { + with (elements[i]) className = className.replace(CLASSES, ""); + } + IE7.Rule.elements = {}; + }, + + reload: function() { + this.rules = []; + this.getInlineStyles(); + this.screen.load(); + if (this.print) this.print.load(); + this.refresh(); + this.trash(); + }, + + addRecalc: function(propertyName, test, handler, replacement) { + // call the ancestor method to add a wrapped recalc method + this.base(propertyName, test, function(element) { + // execute the original recalc method + handler(element); + // store a reference to this element so we can clear its style later + IE7.CSS.elements[element.uniqueID] = element; + }, replacement); + }, + + recalc: function() { + // clear IE7 styles and classes + this.reset(); + // execute the ancestor method to perform recalculations + this.base(); + }, + + addEventHandler: function(element, type, handler) { + element.attachEvent(type, handler); + // store the handler so it can be detached later + this.handlers.push(arguments); + }, + + removeEventHandlers: function() { + var handler; + while (handler = this.handlers.pop()) { + handler[0].detachEvent(handler[1], handler[2]); + } + }, + + getInlineStyles: function() { + // load inline styles + var styleSheets = document.getElementsByTagName("style"), styleSheet; + for (var i = styleSheets.length - 1; (styleSheet = styleSheets[i]); i--) { + if (!styleSheet.disabled && !styleSheet.ie7) { + var cssText = styleSheet.cssText || styleSheet.innerHTML; + this.styles.push(cssText); + styleSheet.cssText = cssText; + } + } + }, + + trash: function() { + // trash the old style sheets + var styleSheets = document.styleSheets, styleSheet, i; + for (i = 0; i < styleSheets.length; i++) { + styleSheet = styleSheets[i]; + if (!styleSheet.ie7 && !styleSheet.cssText && styleSheet.cssText != '') { + styleSheet.cssText = styleSheet.cssText; + } + } + this.base(); + }, + + getText: function(styleSheet) { + return styleSheet.cssText || this.base(styleSheet); + } + }); + + // remove event handlers (they eat memory) + IE7.CSS.addEventHandler(window, "onunload", function() { + IE7.CSS.removeEventHandlers(); + }); + + // store all elements with an IE7 class assigned + IE7.Rule.elements = {}; + + IE7.Rule.prototype.extend({ + add: function(element) { + // execute the ancestor "add" method + this.base(element); + // store a reference to this element so we can clear its classes later + IE7.Rule.elements[element.uniqueID] = element; + } + }); + + // store created pseudo elements + if (IE7.PseudoElement) { + IE7.PseudoElement.hash = {}; + + IE7.PseudoElement.prototype.extend({ + create: function(target) { + var key = this.selector + ":" + target.uniqueID; + if (!IE7.PseudoElement.hash[key]) { + IE7.PseudoElement.hash[key] = true; + this.base(target); + } + } + }); + } + + IE7.HTML.extend({ + elements: {}, + + addRecalc: function(selector, handler) { + // call the ancestor method to add a wrapped recalc method + this.base(selector, function(element) { + if (!this.elements[element.uniqueID]) { + // execute the original recalc method + handler(element); + // store a reference to this element so that + // it is not "fixed" again + this.elements[element.uniqueID] = element; + } + }); + } + }); + + // allow refreshing of IE7 fixes + document.recalc = function(reload) { + if (IE7.CSS.screen) { + if (reload) IE7.CSS.reload(); + IE7.recalc(); + } + }; + +})(); diff --git a/script/about b/script/about deleted file mode 100755 index ed8deb0..0000000 --- a/script/about +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -$LOAD_PATH.unshift "#{RAILTIES_PATH}/builtin/rails_info" -require 'commands/about' \ No newline at end of file diff --git a/script/console b/script/console deleted file mode 100755 index 498077a..0000000 --- a/script/console +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/console' diff --git a/script/dbconsole b/script/dbconsole deleted file mode 100755 index caa60ce..0000000 --- a/script/dbconsole +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/dbconsole' diff --git a/script/destroy b/script/destroy deleted file mode 100755 index a4df765..0000000 --- a/script/destroy +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/destroy' diff --git a/script/generate b/script/generate deleted file mode 100755 index 173a9f1..0000000 --- a/script/generate +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/generate' diff --git a/script/performance/benchmarker b/script/performance/benchmarker deleted file mode 100755 index c842d35..0000000 --- a/script/performance/benchmarker +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/performance/benchmarker' diff --git a/script/performance/profiler b/script/performance/profiler deleted file mode 100755 index d855ac8..0000000 --- a/script/performance/profiler +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/performance/profiler' diff --git a/script/performance/request b/script/performance/request deleted file mode 100755 index ae3f38c..0000000 --- a/script/performance/request +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/performance/request' diff --git a/script/plugin b/script/plugin deleted file mode 100755 index 87cd207..0000000 --- a/script/plugin +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/plugin' diff --git a/script/process/inspector b/script/process/inspector deleted file mode 100755 index bf25ad8..0000000 --- a/script/process/inspector +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/process/inspector' diff --git a/script/process/reaper b/script/process/reaper deleted file mode 100755 index c77f045..0000000 --- a/script/process/reaper +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/process/reaper' diff --git a/script/process/spawner b/script/process/spawner deleted file mode 100755 index 7118f39..0000000 --- a/script/process/spawner +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../../config/boot' -require 'commands/process/spawner' diff --git a/script/rails b/script/rails index f138a34..53280b7 100755 --- a/script/rails +++ b/script/rails @@ -1,4 +1,4 @@ -#!/usr/bin/env ruby1.8 +#!~/.rvm/rubies/ruby-1.8.7-p334/bin/ruby # This command will automatically be run when you run "rails" with Rails 3 gems installed from the root of your application. APP_PATH = File.expand_path('../../config/application', __FILE__) diff --git a/script/runner b/script/runner deleted file mode 100755 index a4a7cb2..0000000 --- a/script/runner +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env ruby -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/runner' diff --git a/script/server b/script/server deleted file mode 100755 index 0fb4dff..0000000 --- a/script/server +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env ruby -require 'thread' -require File.dirname(__FILE__) + '/../config/boot' -require 'commands/server' diff --git a/server b/server new file mode 100644 index 0000000..83460e2 --- /dev/null +++ b/server @@ -0,0 +1,916 @@ +Script started on Mon 20 Jun 2011 08:25:10 AM EDT +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ rails server +=> Booting WEBrick +=> Rails 3.0.8 application starting in development on http://0.0.0.0:3000 +=> Call with -d to detach +=> Ctrl-C to shutdown server +[2011-06-20 08:25:29] INFO WEBrick 1.3.1 +[2011-06-20 08:25:29] INFO ruby 1.8.7 (2011-02-18) [i686-linux] +[2011-06-20 08:25:34] INFO WEBrick::HTTPServer#start: pid=2409 port=3000 + + +Started GET "/" for 127.0.0.1 at Mon Jun 20 08:25:51 -0400 2011 + Processing by FrontController#index as HTML + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/dryml-1.3.0.RC/taglibs/core.dryml in 0.06s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_core.dryml in 0.28s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_support.dryml in 0.02s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_document_tags.dryml in 0.16s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_pages.dryml in 0.28s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_editing.dryml in 0.08s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_forms.dryml in 0.63s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_navigation.dryml in 0.17s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_plus.dryml in 0.23s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_generics.dryml in 0.04s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_lifecycles.dryml in 0.02s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_summary.dryml in 0.24s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_user_pages.dryml in 0.42s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid_i18n.dryml in 0.02s + DRYML: Compiled /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/hobo-1.3.0.RC/lib/hobo/rapid/taglibs/rapid.dryml in 2.74s + DRYML: Compiled app/views/taglibs/auto/rapid/cards.dryml in 0.26s + DRYML: Compiled app/views/taglibs/auto/rapid/pages.dryml in 2.65s + DRYML: Compiled app/views/taglibs/auto/rapid/forms.dryml in 0.26s + DRYML: Compiled vendor/plugins/paperclip_with_hobo/taglibs/paperclip.dryml in 0.01s + DRYML: Compiled app/views/taglibs/themes/clean/clean.dryml in 0.02s + DRYML: Compiled app/views/taglibs/application.dryml in 6.50s + DRYML: Compiled app/views/front/index.dryml in 6.71s + User Load (1.0ms) SELECT "users".* FROM "users" LIMIT 30 +Creating scope :recent. Overwriting existing method Recipe.recent. + Recipe Load (0.4ms) SELECT "recipes".* FROM "recipes" ORDER BY recipes.created_at DESC LIMIT 6 + SQL (0.6ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 + SQL (0.3ms) SELECT COUNT(*) FROM "comments" WHERE ("comments".recipe_id = 1) + SQL (0.3ms) SELECT COUNT(*) FROM "recipes" +Creating scope :recent. Overwriting existing method Question.recent. + Question Load (0.3ms) SELECT "questions".* FROM "questions" ORDER BY questions.created_at DESC LIMIT 6 + User Load (0.6ms) SELECT "users".* FROM "users" ORDER BY (select created_at from recipes where recipes.user_id = users.id order by created_at limit 1) LIMIT 6 + SQL (0.3ms) SELECT COUNT(*) FROM "recipes" WHERE ("recipes".user_id = 1) LIMIT 6 + Recipe Load (0.4ms) SELECT "recipes".* FROM "recipes" WHERE ("recipes".user_id = 1) ORDER BY recipes.created_at DESC LIMIT 6 + SQL (0.3ms) SELECT COUNT(*) FROM "recipes" WHERE ("recipes".user_id = 1) + CACHE (0.0ms) SELECT COUNT(*) FROM "recipes" WHERE ("recipes".user_id = 1) + SQL (0.2ms) SELECT COUNT(*) FROM "users" +Rendered front/index.dryml (7458.7ms) +Completed 200 OK in 7478ms (Views: 7457.9ms | ActiveRecord: 4.9ms) + + +Started GET "/javascripts/hobo-rapid.js" for 127.0.0.1 at Mon Jun 20 08:25:59 -0400 2011 + + +Started GET "/javascripts/hobo-rapid.js" for 127.0.0.1 at Mon Jun 20 08:25:59 -0400 2011 + SQL (1.0ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (3.0ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.5ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.9ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.5ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.9ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (2.1ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.5ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.5ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + +ActionController::RoutingError (No route matches "/javascripts/hobo-rapid.js"): + + +Rendered /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/actionpack-3.0.8/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.4ms) + + + + + + + + + + + + + + + + + + + + + + + + + + + +Started GET "/" for 127.0.0.1 at Mon Jun 20 08:31:10 -0400 2011 + SQL (1.0ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.5ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (1.2ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.5ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.6ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (1.1ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (1.1ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.4ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.4ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.4ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + Processing by FrontController#index as HTML + DRYML: Compiled app/views/taglibs/auto/rapid/pages.dryml in 2.81s + User Load (0.4ms) SELECT "users".* FROM "users" LIMIT 30 +Creating scope :recent. Overwriting existing method Recipe.recent. + Recipe Load (0.4ms) SELECT "recipes".* FROM "recipes" ORDER BY recipes.created_at DESC LIMIT 6 + User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 + SQL (0.3ms) SELECT COUNT(*) FROM "comments" WHERE ("comments".recipe_id = 1) + SQL (0.2ms) SELECT COUNT(*) FROM "recipes" +Creating scope :recent. Overwriting existing method Question.recent. + Question Load (0.3ms) SELECT "questions".* FROM "questions" ORDER BY questions.created_at DESC LIMIT 6 + User Load (0.6ms) SELECT "users".* FROM "users" ORDER BY (select created_at from recipes where recipes.user_id = users.id order by created_at limit 1) LIMIT 6 + SQL (0.3ms) SELECT COUNT(*) FROM "recipes" WHERE ("recipes".user_id = 1) LIMIT 6 + Recipe Load (0.3ms) SELECT "recipes".* FROM "recipes" WHERE ("recipes".user_id = 1) ORDER BY recipes.created_at DESC LIMIT 6 + SQL (0.3ms) SELECT COUNT(*) FROM "recipes" WHERE ("recipes".user_id = 1) + CACHE (0.0ms) SELECT COUNT(*) FROM "recipes" WHERE ("recipes".user_id = 1) + SQL (0.2ms) SELECT COUNT(*) FROM "users" +Rendered front/index.dryml (3632.5ms) +Completed 200 OK in 3641ms (Views: 3631.6ms | ActiveRecord: 11.6ms) + + +Started GET "/search?query=test" for 127.0.0.1 at Mon Jun 20 08:31:21 -0400 2011 + SQL (1.1ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (1.1ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.5ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.9ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (1.0ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.4ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.4ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.4ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.5ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + Processing by FrontController#search as JS + Parameters: {"query"=>"test"} + SQL (0.3ms) SELECT COUNT(*) FROM "questions" WHERE ((description LIKE '%test%')) + SQL (0.2ms) SELECT COUNT(*) FROM "recipes" WHERE ((name LIKE '%test%' or body LIKE '%test%')) + SQL (0.2ms) SELECT COUNT(*) FROM "api_taglibs" WHERE ((name LIKE '%test%' or description LIKE '%test%')) + SQL (63.3ms) SELECT COUNT(*) FROM "api_tag_defs" WHERE ((description LIKE '%test%')) + Recipe Load (0.5ms) SELECT "recipes".* FROM "recipes" WHERE ((name LIKE '%test%' or body LIKE '%test%')) + ApiTagDef Load (1.8ms) SELECT "api_tag_defs".* FROM "api_tag_defs" WHERE ((description LIKE '%test%')) + User Load (0.4ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 + SQL (0.3ms) SELECT COUNT(*) FROM "comments" WHERE ("comments".recipe_id = 1) + SQL (0.3ms) SELECT COUNT(*) FROM "api_tag_comments" WHERE ("api_tag_comments".api_tag_def_id = 166) + SQL (0.3ms) SELECT COUNT(*) FROM "api_tag_comments" WHERE ("api_tag_comments".api_tag_def_id = 182) +Rendered text template (0.0ms) +Completed 200 OK in 790ms (Views: 15.4ms | ActiveRecord: 74.9ms) + + +Started GET "/manual" for 127.0.0.1 at Mon Jun 20 08:31:34 -0400 2011 + SQL (1.0ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.6ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (1.2ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.5ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.6ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (1.0ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (1.1ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.4ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.4ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.4ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + Processing by ManualController#index as HTML +Redirected to http://localhost:3000/manual/toc +Completed 302 Found in 7ms +/home/bsleys/hobocookbook/app/controllers/manual_controller.rb:77 +@last_update = last_update filename +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) +(rdb:304) c +sh: Syntax error: "|" unexpected + + +Started GET "/manual/toc" for 127.0.0.1 at Mon Jun 20 08:31:35 -0400 2011 + SQL (1.0ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (1.1ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.6ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (1.1ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (1.0ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.4ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.4ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + SQL (0.5ms) SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + SQL (0.6ms)  SELECT name + FROM sqlite_master + WHERE type = 'table' AND NOT name = 'sqlite_sequence' + + Processing by ManualController#manual_section as HTML + Parameters: {"section"=>"toc"} +Completed 500 Internal Server Error in 26196ms + +TypeError (can't convert nil into Array): + + +Rendered /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/actionpack-3.0.8/lib/action_dispatch/middleware/templates/rescues/_trace.erb (3.9ms) +Rendered /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/actionpack-3.0.8/lib/action_dispatch/middleware/templates/rescues/_request_and_response.erb (16.1ms) +Rendered /home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/actionpack-3.0.8/lib/action_dispatch/middleware/templates/rescues/diagnostics.erb within rescues/layout (47.0ms) +^C[2011-06-20 08:41:25] INFO going to shutdown ... +[2011-06-20 08:41:25] INFO WEBrick::HTTPServer#start done. +Exiting +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ cd vendor/plugins/s/paperclip +]0;bsleys@bob-laptop: ~/hobocookbook/vendor/plugins/paperclipbsleys@bob-laptop:~/hobocookbook/vendor/plugins/paperclip$ git status +# Not currently on any branch. +nothing to commit (working directory clean) +]0;bsleys@bob-laptop: ~/hobocookbook/vendor/plugins/paperclipbsleys@bob-laptop:~/hobocookbook/vendor/plugins/paperclip$ sigit update +git: 'update' is not a git command. See 'git --help'. + +Did you mean this? + update-ref +]0;bsleys@bob-laptop: ~/hobocookbook/vendor/plugins/paperclipbsleys@bob-laptop:~/hobocookbook/vendor/plugins/paperclip$ gitk +]0;bsleys@bob-laptop: ~/hobocookbook/vendor/plugins/paperclipbsleys@bob-laptop:~/hobocookbook/vendor/plugins/paperclip$ spsudo sptapt-get install giggle +[sudo] password for bsleys: + Reading package lists... 0% Reading package lists... 100% Reading package lists... Done + Building dependency tree... 0% Building dependency tree... 0% Building dependency tree... 50% Building dependency tree... 50% Building dependency tree + Reading state information... 0% Reading state information... 0% Reading state information... Done +The following package was automatically installed and is no longer required: + libreadline5 +Use 'apt-get autoremove' to remove them. +The following NEW packages will be installed: + giggle +0 upgraded, 1 newly installed, 0 to remove and 14 not upgraded. +Need to get 233 kB of archives. +After this operation, 1,130 kB of additional disk space will be used. + 0% [Working] Get:1 http://us.archive.ubuntu.com/ubuntu/ natty/universe giggle i386 0.5-1.1 [233 kB] + 0% [1 giggle 0 B/233 kB 0%] 15% [1 giggle 35.9 kB/233 kB 15%] 45% [1 giggle 107 kB/233 kB 45%] 100% [Working] Fetched 233 kB in 1s (134 kB/s) +Selecting previously deselected package giggle. +(Reading database ... (Reading database ... 5% (Reading database ... 10% (Reading database ... 15% (Reading database ... 20% (Reading database ... 25% (Reading database ... 30% (Reading database ... 35% (Reading database ... 40% (Reading database ... 45% (Reading database ... 50% (Reading database ... 55% (Reading database ... 60% (Reading database ... 65% (Reading database ... 70% (Reading database ... 75% (Reading database ... 80% (Reading database ... 85% (Reading database ... 90% (Reading database ... 95% (Reading database ... 100% (Reading database ... 170766 files and directories currently installed.) +Unpacking giggle (from .../giggle_0.5-1.1_i386.deb) ... +Processing triggers for bamfdaemon ... +Rebuilding /usr/share/applications/bamf.index... +Processing triggers for desktop-file-utils ... +Processing triggers for python-gmenu ... +Rebuilding /usr/share/applications/desktop.en_US.utf8.cache... +Processing triggers for hicolor-icon-theme ... +Processing triggers for man-db ... +Processing triggers for python-support ... +Setting up giggle (0.5-1.1) ... +]0;bsleys@bob-laptop: ~/hobocookbook/vendor/plugins/paperclipbsleys@bob-laptop:~/hobocookbook/vendor/plugins/paperclip$ cd ... +]0;bsleys@bob-laptop: ~/hobocookbook/vendor/pluginsbsleys@bob-laptop:~/hobocookbook/vendor/plugins$ cd .. +]0;bsleys@bob-laptop: ~/hobocookbook/vendorbsleys@bob-laptop:~/hobocookbook/vendor$ cd .. +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ giggle +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git-gui +git-gui: command not found +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git-guigglecd ..sudo apt-get install gigglegoitit- +git-all git-cola git-doc git-gui +git-annex git-core git-dpm git-load-dirs +git-arch git-cvs git-el git-man +git-buildpackage git-daemon-run git-email git-svn +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ sudo apt-get install git-gui +E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavailable) +E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it? +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git submodule status + ad18580f9501eaee09bc8eb34d69187a77096e01 gitorials/agility (gitorial-082) + 08732ddbbbaa91e14962df2693c138c3fdef07fa public/patches/agility (heads/master) + eddc0e539c57017a340cc1858ff17daf130c5817 taglibs/hobo-contrib (heads/master) + 4d85b5297c71fb9bf0c63275b4888bda88b69855 taglibs/hobo-jquery (remotes/origin/rails3) + d6ff001c18912a0b5ac1472c81a53ec18a69e9c9 taglibs/hoboyui (heads/master) + d37a712d35d1a8b68d5bb6f28d422b855f7dd953 taglibs/imaginary-dryml (heads/master) +No submodule mapping found in .gitmodules for path 'vendor/hobo' +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git submodule update +No submodule mapping found in .gitmodules for path 'vendor/hobo' +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git rm--cached vendor/hobo[1@ +rm 'vendor/hobo' +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git submodule status + ad18580f9501eaee09bc8eb34d69187a77096e01 gitorials/agility (gitorial-082) + 08732ddbbbaa91e14962df2693c138c3fdef07fa public/patches/agility (heads/master) + eddc0e539c57017a340cc1858ff17daf130c5817 taglibs/hobo-contrib (heads/master) + 4d85b5297c71fb9bf0c63275b4888bda88b69855 taglibs/hobo-jquery (remotes/origin/rails3) + d6ff001c18912a0b5ac1472c81a53ec18a69e9c9 taglibs/hoboyui (heads/master) + d37a712d35d1a8b68d5bb6f28d422b855f7dd953 taglibs/imaginary-dryml (heads/master) +-2c604814478baad1557e95a335ee1da0ce9d3b05 vendor/hobo13 + f301de524bfa029a23765d9780805b2c809d5b04 vendor/plugins/paperclip (v2.1.4-7-gf301de5) + 509686d0ac349b806d9ffad7bbe1450fdc47b4c1 vendor/plugins/paperclip_with_hobo (heads/master) +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git submodule statusrm --cached vendor/hobohobo13 +rm 'vendor/hobo13' +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git rm --cached vendor/hobo13submodule status + ad18580f9501eaee09bc8eb34d69187a77096e01 gitorials/agility (gitorial-082) + 08732ddbbbaa91e14962df2693c138c3fdef07fa public/patches/agility (heads/master) + eddc0e539c57017a340cc1858ff17daf130c5817 taglibs/hobo-contrib (heads/master) + 4d85b5297c71fb9bf0c63275b4888bda88b69855 taglibs/hobo-jquery (remotes/origin/rails3) + d6ff001c18912a0b5ac1472c81a53ec18a69e9c9 taglibs/hoboyui (heads/master) + d37a712d35d1a8b68d5bb6f28d422b855f7dd953 taglibs/imaginary-dryml (heads/master) + f301de524bfa029a23765d9780805b2c809d5b04 vendor/plugins/paperclip (v2.1.4-7-gf301de5) + 509686d0ac349b806d9ffad7bbe1450fdc47b4c1 vendor/plugins/paperclip_with_hobo (heads/master) +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git submodule statusrm --cached vendor/hobo13submodule statusrm --cached vendor/hobosubmodule update +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git submodule updatestatus + ad18580f9501eaee09bc8eb34d69187a77096e01 gitorials/agility (gitorial-082) + 08732ddbbbaa91e14962df2693c138c3fdef07fa public/patches/agility (heads/master) + eddc0e539c57017a340cc1858ff17daf130c5817 taglibs/hobo-contrib (heads/master) + 4d85b5297c71fb9bf0c63275b4888bda88b69855 taglibs/hobo-jquery (remotes/origin/rails3) + d6ff001c18912a0b5ac1472c81a53ec18a69e9c9 taglibs/hoboyui (heads/master) + d37a712d35d1a8b68d5bb6f28d422b855f7dd953 taglibs/imaginary-dryml (heads/master) + f301de524bfa029a23765d9780805b2c809d5b04 vendor/plugins/paperclip (v2.1.4-7-gf301de5) + 509686d0ac349b806d9ffad7bbe1450fdc47b4c1 vendor/plugins/paperclip_with_hobo (heads/master) +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git submodule foreach git pull +Entering 'gitorials/agility' +You are not currently on a branch, so I cannot use any +'branch..merge' in your configuration file. +Please specify which remote branch you want to use on the command +line and try again (e.g. 'git pull '). +See git-pull(1) for details. +Stopping at 'gitorials/agility'; script returned non-zero status. +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git submodule foreach git pull origin master +Entering 'gitorials/agility' +From git://github.com/Hobo/agility-gitorial + * branch master -> FETCH_HEAD +Already up-to-date. +Entering 'public/patches/agility' +From git://github.com/Hobo/agility-gitorial-patches + * branch master -> FETCH_HEAD +Already up-to-date. +Entering 'taglibs/hobo-contrib' +From git://github.com/bryanlarsen/hobo-contrib + * branch master -> FETCH_HEAD +Already up-to-date. +Entering 'taglibs/hobo-jquery' +From git://github.com/bryanlarsen/hobo-jquery + * branch master -> FETCH_HEAD +Already up-to-date. +Entering 'taglibs/hoboyui' +From git://github.com/tablatom/hoboyui + * branch master -> FETCH_HEAD +Already up-to-date. +Entering 'taglibs/imaginary-dryml' +From git://github.com/imaginary-cloud/Imaginary-DRYML + * branch master -> FETCH_HEAD +Already up-to-date. +Entering 'vendor/plugins/paperclip' +remote: Counting objects: 151, done. +remote: Compressing objects: 1% (1/80)  remote: Compressing objects: 2% (2/80)  remote: Compressing objects: 3% (3/80)  remote: Compressing objects: 5% (4/80)  remote: Compressing objects: 6% (5/80)  remote: Compressing objects: 7% (6/80)  remote: Compressing objects: 8% (7/80)  remote: Compressing objects: 10% (8/80)  remote: Compressing objects: 11% (9/80)  remote: Compressing objects: 12% (10/80)  remote: Compressing objects: 13% (11/80)  remote: Compressing objects: 15% (12/80)  remote: Compressing objects: 16% (13/80)  remote: Compressing objects: 17% (14/80)  remote: Compressing objects: 18% (15/80)  remote: Compressing objects: 20% (16/80)  remote: Compressing objects: 21% (17/80)  remote: Compressing objects: 22% (18/80)  remote: Compressing objects: 23% (19/80)  remote: Compressing objects: 25% (20/80)  remote: Compressing objects: 26% (21/80)  remote: Compressing objects: 27% (22/80)  remote: Compressing objects: 28% (23/80)  remote: Compressing objects: 30% (24/80)  remote: Compressing objects: 31% (25/80)  remote: Compressing objects: 32% (26/80)  remote: Compressing objects: 33% (27/80)  remote: Compressing objects: 35% (28/80)  remote: Compressing objects: 36% (29/80)  remote: Compressing objects: 37% (30/80)  remote: Compressing objects: 38% (31/80)  remote: Compressing objects: 40% (32/80)  remote: Compressing objects: 41% (33/80)  remote: Compressing objects: 42% (34/80)  remote: Compressing objects: 43% (35/80)  remote: Compressing objects: 45% (36/80)  remote: Compressing objects: 46% (37/80)  remote: Compressing objects: 47% (38/80)  remote: Compressing objects: 48% (39/80)  remote: Compressing objects: 50% (40/80)  remote: Compressing objects: 51% (41/80)  remote: Compressing objects: 52% (42/80)  remote: Compressing objects: 53% (43/80)  remote: Compressing objects: 55% (44/80)  remote: Compressing objects: 56% (45/80)  remote: Compressing objects: 57% (46/80)  remote: Compressing objects: 58% (47/80)  remote: Compressing objects: 60% (48/80)  remote: Compressing objects: 61% (49/80)  remote: Compressing objects: 62% (50/80)  remote: Compressing objects: 63% (51/80)  remote: Compressing objects: 65% (52/80)  remote: Compressing objects: 66% (53/80)  remote: Compressing objects: 67% (54/80)  remote: Compressing objects: 68% (55/80)  remote: Compressing objects: 70% (56/80)  remote: Compressing objects: 71% (57/80)  remote: Compressing objects: 72% (58/80)  remote: Compressing objects: 73% (59/80)  remote: Compressing objects: 75% (60/80)  remote: Compressing objects: 76% (61/80)  remote: Compressing objects: 77% (62/80)  remote: Compressing objects: 78% (63/80)  remote: Compressing objects: 80% (64/80)  remote: Compressing objects: 81% (65/80)  remote: Compressing objects: 82% (66/80)  remote: Compressing objects: 83% (67/80)  remote: Compressing objects: 85% (68/80)  remote: Compressing objects: 86% (69/80)  remote: Compressing objects: 87% (70/80)  remote: Compressing objects: 88% (71/80)  remote: Compressing objects: 90% (72/80)  remote: Compressing objects: 91% (73/80)  remote: Compressing objects: 92% (74/80)  remote: Compressing objects: 93% (75/80)  remote: Compressing objects: 95% (76/80)  remote: Compressing objects: 96% (77/80)  remote: Compressing objects: 97% (78/80)  remote: Compressing objects: 98% (79/80)  remote: Compressing objects: 100% (80/80)  remote: Compressing objects: 100% (80/80), done. +Receiving objects: 0% (1/111) Receiving objects: 1% (2/111) Receiving objects: 2% (3/111) Receiving objects: 3% (4/111) Receiving objects: 4% (5/111) Receiving objects: 5% (6/111) Receiving objects: 6% (7/111) Receiving objects: 7% (8/111) Receiving objects: 8% (9/111) Receiving objects: 9% (10/111) Receiving objects: 10% (12/111) Receiving objects: 11% (13/111) Receiving objects: 12% (14/111) Receiving objects: 13% (15/111) Receiving objects: 14% (16/111) Receiving objects: 15% (17/111) Receiving objects: 16% (18/111) Receiving objects: 17% (19/111) Receiving objects: 18% (20/111) Receiving objects: 19% (22/111) Receiving objects: 20% (23/111) Receiving objects: 21% (24/111) Receiving objects: 22% (25/111) Receiving objects: 23% (26/111) Receiving objects: 24% (27/111) Receiving objects: 25% (28/111) Receiving objects: 26% (29/111) Receiving objects: 27% (30/111) Receiving objects: 28% (32/111) Receiving objects: 29% (33/111) Receiving objects: 30% (34/111) Receiving objects: 31% (35/111) Receiving objects: 32% (36/111) Receiving objects: 33% (37/111) Receiving objects: 34% (38/111) Receiving objects: 35% (39/111) Receiving objects: 36% (40/111) Receiving objects: 37% (42/111) Receiving objects: 38% (43/111) Receiving objects: 39% (44/111) Receiving objects: 40% (45/111) Receiving objects: 41% (46/111) Receiving objects: 42% (47/111) remote: Total 111 (delta 82), reused 58 (delta 29) +Receiving objects: 43% (48/111) Receiving objects: 44% (49/111) Receiving objects: 45% (50/111) Receiving objects: 46% (52/111) Receiving objects: 47% (53/111) Receiving objects: 48% (54/111) Receiving objects: 49% (55/111) Receiving objects: 50% (56/111) Receiving objects: 51% (57/111) Receiving objects: 52% (58/111) Receiving objects: 53% (59/111) Receiving objects: 54% (60/111) Receiving objects: 55% (62/111) Receiving objects: 56% (63/111) Receiving objects: 57% (64/111) Receiving objects: 58% (65/111) Receiving objects: 59% (66/111) Receiving objects: 60% (67/111) Receiving objects: 61% (68/111) Receiving objects: 62% (69/111) Receiving objects: 63% (70/111) Receiving objects: 64% (72/111) Receiving objects: 65% (73/111) Receiving objects: 66% (74/111) Receiving objects: 67% (75/111) Receiving objects: 68% (76/111) Receiving objects: 69% (77/111) Receiving objects: 70% (78/111) Receiving objects: 71% (79/111) Receiving objects: 72% (80/111) Receiving objects: 73% (82/111) Receiving objects: 74% (83/111) Receiving objects: 75% (84/111) Receiving objects: 76% (85/111) Receiving objects: 77% (86/111) Receiving objects: 78% (87/111) Receiving objects: 79% (88/111) Receiving objects: 80% (89/111) Receiving objects: 81% (90/111) Receiving objects: 82% (92/111) Receiving objects: 83% (93/111) Receiving objects: 84% (94/111) Receiving objects: 85% (95/111) Receiving objects: 86% (96/111) Receiving objects: 87% (97/111) Receiving objects: 88% (98/111) Receiving objects: 89% (99/111) Receiving objects: 90% (100/111) Receiving objects: 91% (102/111) Receiving objects: 92% (103/111) Receiving objects: 93% (104/111) Receiving objects: 94% (105/111) Receiving objects: 95% (106/111) Receiving objects: 96% (107/111) Receiving objects: 97% (108/111) Receiving objects: 98% (109/111) Receiving objects: 99% (110/111) Receiving objects: 100% (111/111) Receiving objects: 100% (111/111), 21.56 KiB, done. +Resolving deltas: 0% (0/82) Resolving deltas: 1% (1/82) Resolving deltas: 17% (14/82) Resolving deltas: 19% (16/82) Resolving deltas: 45% (37/82) Resolving deltas: 47% (39/82) Resolving deltas: 52% (43/82) Resolving deltas: 62% (51/82) Resolving deltas: 63% (52/82) Resolving deltas: 65% (54/82) Resolving deltas: 69% (57/82) Resolving deltas: 70% (58/82) Resolving deltas: 71% (59/82) Resolving deltas: 74% (61/82) Resolving deltas: 85% (70/82) Resolving deltas: 86% (71/82) Resolving deltas: 87% (72/82) Resolving deltas: 89% (73/82) Resolving deltas: 90% (74/82) Resolving deltas: 95% (78/82) Resolving deltas: 96% (79/82) Resolving deltas: 97% (80/82) Resolving deltas: 98% (81/82) Resolving deltas: 100% (82/82) Resolving deltas: 100% (82/82), completed with 20 local objects. +From git://github.com/thoughtbot/paperclip + * branch master -> FETCH_HEAD +Updating f301de5..26ef20e +Fast-forward + .gitignore | 10 +- + Appraisals | 11 + + Gemfile | 12 + + Gemfile.lock | 75 ++ + README.md | 246 +++++++ + README.rdoc | 59 -- + Rakefile | 74 +-- + cucumber/paperclip_steps.rb | 6 + + features/basic.feature | 17 + + features/s3.feature | 27 + + features/step_definitions/html_steps.rb | 14 + + features/step_definitions/rails_steps.rb | 90 +++ + features/step_definitions/s3_steps.rb | 9 + + features/step_definitions/web_steps.rb | 227 ++++++ + features/support/env.rb | 3 + + features/support/paths.rb | 35 + + features/support/rails.rb | 5 + + features/support/s3.rb | 25 + + gemfiles/rails2.gemfile | 15 + + gemfiles/rails2.gemfile.lock | 67 ++ + gemfiles/rails3.gemfile | 15 + + gemfiles/rails3.gemfile.lock | 108 +++ + gemfiles/rails3_1.gemfile | 15 + + gemfiles/rails3_1.gemfile.lock | 123 ++++ + generators/paperclip/USAGE | 4 +- + generators/paperclip/paperclip_generator.rb | 16 +- + init.rb | 3 + + lib/generators/paperclip/USAGE | 8 + + lib/generators/paperclip/paperclip_generator.rb | 31 + + .../paperclip/templates/paperclip_migration.rb.erb | 19 + + lib/paperclip.rb | 337 +++++++--- + lib/paperclip/attachment.rb | 433 +++++++----- + lib/paperclip/callback_compatability.rb | 61 ++ + lib/paperclip/geometry.rb | 24 +- + lib/paperclip/interpolations.rb | 130 ++++ + lib/paperclip/iostream.rb | 42 +- + lib/paperclip/matchers.rb | 33 + + .../matchers/have_attached_file_matcher.rb | 57 ++ + .../validate_attachment_content_type_matcher.rb | 75 ++ + .../validate_attachment_presence_matcher.rb | 54 ++ + .../matchers/validate_attachment_size_matcher.rb | 95 +++ + lib/paperclip/processor.rb | 58 ++ + lib/paperclip/railtie.rb | 24 + + lib/paperclip/storage.rb | 210 +------ + lib/paperclip/storage/filesystem.rb | 73 ++ + lib/paperclip/storage/fog.rb | 129 ++++ + lib/paperclip/storage/s3.rb | 199 ++++++ + lib/paperclip/style.rb | 91 +++ + lib/paperclip/thumbnail.rb | 97 ++-- + lib/paperclip/upfile.rb | 27 +- + lib/paperclip/version.rb | 3 + + lib/tasks/paperclip.rake | 77 ++ + paperclip.gemspec | 35 + + shoulda_macros/paperclip.rb | 136 +++- + tasks/paperclip_tasks.rake | 79 --- + test/attachment_test.rb | 737 +++++++++++++++++--- + test/database.yml | 1 - + test/fixtures/animated.gif | Bin 0 -> 8238 bytes + test/fixtures/s3.yml | 8 + + test/fixtures/twopage.pdf | Bin 0 -> 8775 bytes + test/fixtures/uppercase.PNG | Bin 0 -> 4456 bytes + test/fog_test.rb | 127 ++++ + test/geometry_test.rb | 66 ++- + test/helper.rb | 125 +++- + test/integration_test.rb | 309 +++++++-- + test/interpolations_test.rb | 150 ++++ + test/iostream_test.rb | 77 ++- + test/matchers/have_attached_file_matcher_test.rb | 24 + + ...alidate_attachment_content_type_matcher_test.rb | 47 ++ + .../validate_attachment_presence_matcher_test.rb | 26 + + .../validate_attachment_size_matcher_test.rb | 51 ++ + test/paperclip_test.rb | 244 +++++-- + test/processor_test.rb | 10 + + test/storage_test.rb | 384 +++++++++- + test/style_test.rb | 163 +++++ + test/thumbnail_test.rb | 219 +++++- + test/upfile_test.rb | 37 + + 77 files changed, 5622 insertions(+), 1131 deletions(-) + create mode 100644 Appraisals + create mode 100644 Gemfile + create mode 100644 Gemfile.lock + create mode 100644 README.md + delete mode 100644 README.rdoc + create mode 100644 cucumber/paperclip_steps.rb + create mode 100644 features/basic.feature + create mode 100644 features/s3.feature + create mode 100644 features/step_definitions/html_steps.rb + create mode 100644 features/step_definitions/rails_steps.rb + create mode 100644 features/step_definitions/s3_steps.rb + create mode 100644 features/step_definitions/web_steps.rb + create mode 100644 features/support/env.rb + create mode 100644 features/support/paths.rb + create mode 100644 features/support/rails.rb + create mode 100644 features/support/s3.rb + create mode 100644 gemfiles/rails2.gemfile + create mode 100644 gemfiles/rails2.gemfile.lock + create mode 100644 gemfiles/rails3.gemfile + create mode 100644 gemfiles/rails3.gemfile.lock + create mode 100644 gemfiles/rails3_1.gemfile + create mode 100644 gemfiles/rails3_1.gemfile.lock + create mode 100644 lib/generators/paperclip/USAGE + create mode 100644 lib/generators/paperclip/paperclip_generator.rb + create mode 100644 lib/generators/paperclip/templates/paperclip_migration.rb.erb + create mode 100644 lib/paperclip/callback_compatability.rb + create mode 100644 lib/paperclip/interpolations.rb + create mode 100644 lib/paperclip/matchers.rb + create mode 100644 lib/paperclip/matchers/have_attached_file_matcher.rb + create mode 100644 lib/paperclip/matchers/validate_attachment_content_type_matcher.rb + create mode 100644 lib/paperclip/matchers/validate_attachment_presence_matcher.rb + create mode 100644 lib/paperclip/matchers/validate_attachment_size_matcher.rb + create mode 100644 lib/paperclip/processor.rb + create mode 100644 lib/paperclip/railtie.rb + create mode 100644 lib/paperclip/storage/filesystem.rb + create mode 100644 lib/paperclip/storage/fog.rb + create mode 100644 lib/paperclip/storage/s3.rb + create mode 100644 lib/paperclip/style.rb + create mode 100644 lib/paperclip/version.rb + create mode 100644 lib/tasks/paperclip.rake + create mode 100644 paperclip.gemspec + delete mode 100644 tasks/paperclip_tasks.rake + create mode 100644 test/fixtures/animated.gif + create mode 100644 test/fixtures/s3.yml + create mode 100644 test/fixtures/twopage.pdf + create mode 100644 test/fixtures/uppercase.PNG + create mode 100644 test/fog_test.rb + create mode 100644 test/interpolations_test.rb + create mode 100644 test/matchers/have_attached_file_matcher_test.rb + create mode 100644 test/matchers/validate_attachment_content_type_matcher_test.rb + create mode 100644 test/matchers/validate_attachment_presence_matcher_test.rb + create mode 100644 test/matchers/validate_attachment_size_matcher_test.rb + create mode 100644 test/processor_test.rb + create mode 100644 test/style_test.rb + create mode 100644 test/upfile_test.rb +Entering 'vendor/plugins/paperclip_with_hobo' +From git://github.com/tablatom/paperclip_with_hobo + * branch master -> FETCH_HEAD +Already up-to-date. +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ git submodule status + ad18580f9501eaee09bc8eb34d69187a77096e01 gitorials/agility (gitorial-082) + 08732ddbbbaa91e14962df2693c138c3fdef07fa public/patches/agility (heads/master) + eddc0e539c57017a340cc1858ff17daf130c5817 taglibs/hobo-contrib (heads/master) + 4d85b5297c71fb9bf0c63275b4888bda88b69855 taglibs/hobo-jquery (remotes/origin/rails3) + d6ff001c18912a0b5ac1472c81a53ec18a69e9c9 taglibs/hoboyui (heads/master) + d37a712d35d1a8b68d5bb6f28d422b855f7dd953 taglibs/imaginary-dryml (heads/master) ++26ef20e192f8ff7ed3ed4f9e16b2b1e8782e7ff6 vendor/plugins/paperclip (v2.3.10-49-g26ef20e) + 509686d0ac349b806d9ffad7bbe1450fdc47b4c1 vendor/plugins/paperclip_with_hobo (heads/master) +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ hoborake -T +(in /home/bsleys/hobocookbook) +rake about # List versions of all Rails framewor... +rake cookbook:load_api_docs # Load the api by parsing the taglibs... +rake cookbook:pull_all # git pull all plugins/submodules (ex... +rake cookbook:rebuild_agility # Rebuild agility.markdown +rake cookbook:rebuild_generator_docs # Rebuild generator documentation +rake cookbook:update # do all update tasks +rake db:create # Create the database from config/dat... +rake db:drop # Drops the database for the current ... +rake db:fixtures:load # Load fixtures into the current envi... +rake db:migrate # Migrate the database (options: VERS... +rake db:migrate:status # Display status of migrations +rake db:rollback # Rolls the schema back to the previo... +rake db:schema:dump # Create a db/schema.rb file that can... +rake db:schema:load # Load a schema.rb file into the data... +rake db:seed # Load the seed data from db/seeds.rb +rake db:setup # Create the database, load the schem... +rake db:structure:dump # Dump the database structure to an S... +rake db:version # Retrieves the current schema versio... +rake doc:app # Generate docs for the app -- also a... +rake log:clear # Truncates all *.log files in log/ t... +rake middleware # Prints out your Rack middleware stack +rake notes # Enumerate all annotations (use note... +rake notes:custom # Enumerate a custom annotation, spec... +rake paperclip:clean # Cleans out invalid attachments. +rake paperclip:refresh # Refreshes both metadata and thumbna... +rake paperclip:refresh:metadata # Regenerates content_type/size metad... +rake paperclip:refresh:thumbnails # Regenerates thumbnails for a given ... +rake rails:template # Applies the template supplied by LO... +rake rails:update # Update both configs and public/java... +rake routes # Print out all defined routes in mat... +rake secret # Generate a cryptographically secure... +rake stats # Report code statistics (KLOCs, etc)... +rake test # Runs test:units, test:functionals, ... +rake test:recent # Run tests for recenttest:prepare / ... +rake test:uncommitted # Run tests for uncommittedtest:prepa... +rake time:zones:all # Displays all time zones, also avail... +rake tmp:clear # Clear session, cache, and socket fi... +rake tmp:create # Creates tmp directories for session... +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ rake cookbook:load_api_docs +(in /home/bsleys/hobocookbook) +rake aborted! +no such file to load -- cocaine + +(See full trace by running task with --trace) +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ rake cookbook:load_api_docs --trace +(in /home/bsleys/hobocookbook) +** Invoke cookbook:load_api_docs (first_time) +** Invoke environment (first_time) +** Execute environment +rake aborted! +no such file to load -- cocaine +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:596:in `new_constants_in' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/hobocookbook/vendor/plugins/paperclip/lib/paperclip.rb:43 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:596:in `new_constants_in' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/hobocookbook/vendor/plugins/paperclip/lib/paperclip/railtie.rb:1 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:596:in `new_constants_in' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/hobocookbook/vendor/plugins/paperclip/lib/paperclip.rb:42 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:596:in `new_constants_in' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/hobocookbook/vendor/plugins/paperclip/init.rb:1 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/plugin.rb:81 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/initializable.rb:25:in `instance_exec' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/initializable.rb:25:in `run' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/initializable.rb:50:in `run_initializers' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/initializable.rb:49:in `each' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/initializable.rb:49:in `run_initializers' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/application.rb:134:in `initialize!' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/application.rb:77:in `send' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/application.rb:77:in `method_missing' +/home/bsleys/hobocookbook/config/environment.rb:6 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:596:in `new_constants_in' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/application.rb:103:in `require_environment!' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/application.rb:218:in `initialize_tasks' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:636:in `call' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:636:in `execute' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:631:in `each' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:631:in `execute' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain' +/home/bsleys/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/monitor.rb:242:in `synchronize' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:607:in `invoke_prerequisites' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:604:in `each' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:604:in `invoke_prerequisites' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:596:in `invoke_with_call_chain' +/home/bsleys/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/monitor.rb:242:in `synchronize' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:583:in `invoke' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2029:in `each' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2001:in `run' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:1998:in `run' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/bin/rake:31 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/bin/rake:19:in `load' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/bin/rake:19 +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ ]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ rake cookbook:load_api_docs --trace +(in /home/bsleys/hobocookbook) +** Invoke cookbook:load_api_docs (first_time) +** Invoke environment (first_time) +** Execute environment +rake aborted! +no such file to load -- cocaine +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:596:in `new_constants_in' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/hobocookbook/vendor/plugins/paperclip/lib/paperclip.rb:43 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:596:in `new_constants_in' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/hobocookbook/vendor/plugins/paperclip/lib/paperclip/railtie.rb:1 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:596:in `new_constants_in' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/hobocookbook/vendor/plugins/paperclip/lib/paperclip.rb:42 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:596:in `new_constants_in' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/hobocookbook/vendor/plugins/paperclip/init.rb:1 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/plugin.rb:81 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/initializable.rb:25:in `instance_exec' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/initializable.rb:25:in `run' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/initializable.rb:50:in `run_initializers' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/initializable.rb:49:in `each' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/initializable.rb:49:in `run_initializers' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/application.rb:134:in `initialize!' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/application.rb:77:in `send' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/application.rb:77:in `method_missing' +/home/bsleys/hobocookbook/config/environment.rb:6 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:596:in `new_constants_in' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:225:in `load_dependency' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/activesupport-3.0.8/lib/active_support/dependencies.rb:239:in `require' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/application.rb:103:in `require_environment!' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/railties-3.0.8/lib/rails/application.rb:218:in `initialize_tasks' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:636:in `call' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:636:in `execute' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:631:in `each' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:631:in `execute' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:597:in `invoke_with_call_chain' +/home/bsleys/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/monitor.rb:242:in `synchronize' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:607:in `invoke_prerequisites' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:604:in `each' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:604:in `invoke_prerequisites' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:596:in `invoke_with_call_chain' +/home/bsleys/.rvm/rubies/ruby-1.8.7-p334/lib/ruby/1.8/monitor.rb:242:in `synchronize' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:590:in `invoke_with_call_chain' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:583:in `invoke' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2051:in `invoke_task' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2029:in `each' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2029:in `top_level' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2023:in `top_level' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2001:in `run' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:2068:in `standard_exception_handling' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/lib/rake.rb:1998:in `run' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/gems/rake-0.8.7/bin/rake:31 +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/bin/rake:19:in `load' +/home/bsleys/.rvm/gems/ruby-1.8.7-p334@hobocookbook/bin/rake:19 +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ bundle update +Fetching source index for http://rubygems.org/ +Using rake (0.8.7) +Using abstract (1.0.0) +Using activesupport (3.0.8) +Using builder (2.1.2) +Using i18n (0.5.0) +Using activemodel (3.0.8) +Using erubis (2.6.6) +Using rack (1.2.3) +Using rack-mount (0.6.14) +Using rack-test (0.5.7) +Using tzinfo (0.3.28) +Using actionpack (3.0.8) +Using mime-types (1.16) +Using polyglot (0.3.1) +Using treetop (1.4.9) +Using mail (2.2.19) +Using actionmailer (3.0.8) +Using arel (2.0.10) +Using activerecord (3.0.8) +Using activeresource (3.0.8) +Using bundler (1.0.15) +Using columnize (0.3.3) +Using thor (0.14.6) +Using railties (3.0.8) +Using rails (3.0.8) +Using hobo_support (1.3.0.RC) +Using dryml (1.3.0.RC) +Using hobo_fields (1.3.0.RC) +Using will_paginate (3.0.pre2) +Using hobo (1.3.0.RC) +Using linecache (0.43) +Using syntax (1.0.0) +Using maruku (0.6.0) +Using mysql (2.8.1) +Using ruby-debug-base (0.10.4) +Using ruby-debug (0.10.4) +Using sqlite3 (1.3.3) +Using yard (0.7.2) +Your bundle is updated! Use `bundle show [gemname]` to see where a bundled gem is installed. +]0;bsleys@bob-laptop: ~/hobocookbookbsleys@bob-laptop:~/hobocookbook$ bundle updateexit + +Script done on Mon 20 Jun 2011 09:34:46 AM EDT diff --git a/taglibs/hobo-jquery b/taglibs/hobo-jquery index 4d85b52..4b8f0e2 160000 --- a/taglibs/hobo-jquery +++ b/taglibs/hobo-jquery @@ -1 +1 @@ -Subproject commit 4d85b5297c71fb9bf0c63275b4888bda88b69855 +Subproject commit 4b8f0e2761b3c2382f07463f37523affa897195c diff --git a/vendor/hobo b/vendor/hobo deleted file mode 160000 index d411bbb..0000000 --- a/vendor/hobo +++ /dev/null @@ -1 +0,0 @@ -Subproject commit d411bbbef232419c557b0345feafd75dc6dfdca1 diff --git a/vendor/hobo13 b/vendor/hobo13 deleted file mode 160000 index 2c60481..0000000 --- a/vendor/hobo13 +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 2c604814478baad1557e95a335ee1da0ce9d3b05 diff --git a/vendor/plugins/paperclip b/vendor/plugins/paperclip deleted file mode 160000 index f301de5..0000000 --- a/vendor/plugins/paperclip +++ /dev/null @@ -1 +0,0 @@ -Subproject commit f301de524bfa029a23765d9780805b2c809d5b04