Upgrade to Rails 3.2 and move some of the assets to the asset pipeline directories

This commit is contained in:
Alan Bradburne 2012-02-09 23:26:47 +00:00
parent 61c7d2147c
commit bfd5b29a9a
15 changed files with 169 additions and 260 deletions

8
.gitignore vendored Normal file
View File

@ -0,0 +1,8 @@
log/*.log
tmp/**/*
tmp/restart.txt
config/database.yml
.DS_Store
db/*.sqlite3
.bundle
.bundle/*

View File

@ -1,8 +1,9 @@
source 'http://rubygems.org' source 'http://rubygems.org'
gem 'rails', '3.0.4' gem 'rails', '3.2.1'
gem 'mysql2' gem 'mysql2'
gem 'authlogic' gem 'authlogic'
gem 'jquery-rails'
# Bundle gems for the local environment. Make sure to # Bundle gems for the local environment. Make sure to
# put test-only gems in this group so their generators # put test-only gems in this group so their generators

View File

@ -1,90 +1,108 @@
GEM GEM
remote: http://rubygems.org/ remote: http://rubygems.org/
specs: specs:
ZenTest (4.5.0) ZenTest (4.6.2)
abstract (1.0.0) actionmailer (3.2.1)
actionmailer (3.0.4) actionpack (= 3.2.1)
actionpack (= 3.0.4) mail (~> 2.4.0)
mail (~> 2.2.15) actionpack (3.2.1)
actionpack (3.0.4) activemodel (= 3.2.1)
activemodel (= 3.0.4) activesupport (= 3.2.1)
activesupport (= 3.0.4) builder (~> 3.0.0)
builder (~> 2.1.2) erubis (~> 2.7.0)
erubis (~> 2.6.6) journey (~> 1.0.1)
i18n (~> 0.4) rack (~> 1.4.0)
rack (~> 1.2.1) rack-cache (~> 1.1)
rack-mount (~> 0.6.13) rack-test (~> 0.6.1)
rack-test (~> 0.5.7) sprockets (~> 2.1.2)
tzinfo (~> 0.3.23) activemodel (3.2.1)
activemodel (3.0.4) activesupport (= 3.2.1)
activesupport (= 3.0.4) builder (~> 3.0.0)
builder (~> 2.1.2) activerecord (3.2.1)
i18n (~> 0.4) activemodel (= 3.2.1)
activerecord (3.0.4) activesupport (= 3.2.1)
activemodel (= 3.0.4) arel (~> 3.0.0)
activesupport (= 3.0.4) tzinfo (~> 0.3.29)
arel (~> 2.0.2) activeresource (3.2.1)
tzinfo (~> 0.3.23) activemodel (= 3.2.1)
activeresource (3.0.4) activesupport (= 3.2.1)
activemodel (= 3.0.4) activesupport (3.2.1)
activesupport (= 3.0.4) i18n (~> 0.6)
activesupport (3.0.4) multi_json (~> 1.0)
annotate (2.4.0) annotate (2.4.0)
arel (2.0.9) arel (3.0.0)
authlogic (2.1.6) authlogic (3.1.0)
activesupport activerecord (>= 3.0.7)
activerecord (>= 3.0.7)
autotest (4.4.6) autotest (4.4.6)
ZenTest (>= 4.4.1) ZenTest (>= 4.4.1)
builder (2.1.2) builder (3.0.0)
diff-lcs (1.1.2) diff-lcs (1.1.3)
erubis (2.6.6) erubis (2.7.0)
abstract (>= 1.0.0) hike (1.2.1)
i18n (0.5.0) i18n (0.6.0)
mail (2.2.15) journey (1.0.1)
activesupport (>= 2.3.6) jquery-rails (2.0.0)
railties (>= 3.2.0.beta, < 5.0)
thor (~> 0.14)
json (1.6.5)
mail (2.4.1)
i18n (>= 0.4.0) i18n (>= 0.4.0)
mime-types (~> 1.16) mime-types (~> 1.16)
treetop (~> 1.4.8) treetop (~> 1.4.8)
mime-types (1.16) mime-types (1.17.2)
mysql2 (0.2.7) multi_json (1.0.4)
nokogiri (1.4.4) mysql2 (0.3.11)
polyglot (0.3.1) nokogiri (1.5.0)
rack (1.2.2) polyglot (0.3.3)
rack-mount (0.6.14) rack (1.4.1)
rack (>= 1.0.0) rack-cache (1.1)
rack-test (0.5.7) rack (>= 0.4)
rack-ssl (1.3.2)
rack
rack-test (0.6.1)
rack (>= 1.0) rack (>= 1.0)
rails (3.0.4) rails (3.2.1)
actionmailer (= 3.0.4) actionmailer (= 3.2.1)
actionpack (= 3.0.4) actionpack (= 3.2.1)
activerecord (= 3.0.4) activerecord (= 3.2.1)
activeresource (= 3.0.4) activeresource (= 3.2.1)
activesupport (= 3.0.4) activesupport (= 3.2.1)
bundler (~> 1.0) bundler (~> 1.0)
railties (= 3.0.4) railties (= 3.2.1)
railties (3.0.4) railties (3.2.1)
actionpack (= 3.0.4) actionpack (= 3.2.1)
activesupport (= 3.0.4) activesupport (= 3.2.1)
rack-ssl (~> 1.3.2)
rake (>= 0.8.7) rake (>= 0.8.7)
thor (~> 0.14.4) rdoc (~> 3.4)
rake (0.8.7) thor (~> 0.14.6)
rspec (2.5.0) rake (0.9.2.2)
rspec-core (~> 2.5.0) rdoc (3.12)
rspec-expectations (~> 2.5.0) json (~> 1.4)
rspec-mocks (~> 2.5.0) rspec (2.8.0)
rspec-core (2.5.1) rspec-core (~> 2.8.0)
rspec-expectations (2.5.0) rspec-expectations (~> 2.8.0)
rspec-mocks (~> 2.8.0)
rspec-core (2.8.0)
rspec-expectations (2.8.0)
diff-lcs (~> 1.1.2) diff-lcs (~> 1.1.2)
rspec-mocks (2.5.0) rspec-mocks (2.8.0)
rspec-rails (2.5.0) rspec-rails (2.8.1)
actionpack (~> 3.0) actionpack (>= 3.0)
activesupport (~> 3.0) activesupport (>= 3.0)
railties (~> 3.0) railties (>= 3.0)
rspec (~> 2.5.0) rspec (~> 2.8.0)
sprockets (2.1.2)
hike (~> 1.2)
rack (~> 1.0)
tilt (~> 1.1, != 1.3.0)
thor (0.14.6) thor (0.14.6)
treetop (1.4.9) tilt (1.3.3)
treetop (1.4.10)
polyglot
polyglot (>= 0.3.1) polyglot (>= 0.3.1)
tzinfo (0.3.25) tzinfo (0.3.31)
webrat (0.7.3) webrat (0.7.3)
nokogiri (>= 1.2.0) nokogiri (>= 1.2.0)
rack (>= 1.0) rack (>= 1.0)
@ -97,8 +115,9 @@ DEPENDENCIES
annotate annotate
authlogic authlogic
autotest autotest
jquery-rails
mysql2 mysql2
rails (= 3.0.4) rails (= 3.2.1)
rspec (>= 2.0.0.beta.20) rspec (>= 2.0.0.beta.20)
rspec-rails (>= 2.0.0.beta.20) rspec-rails (>= 2.0.0.beta.20)
webrat webrat

View File

@ -0,0 +1,9 @@
// This is a manifest file that'll be compiled into including all the files listed below.
// Add new JavaScript/Coffee code in separate files in this directory and they'll automatically
// be included in the compiled file accessible from http://example.com/assets/application.js
// It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
// the compiled file.
//
//= require jquery
//= require jquery_ujs
//= require_tree .

View File

@ -0,0 +1,7 @@
/*
* This is a manifest file that'll automatically include all the stylesheets available in this directory
* and any sub-directories. You're free to add application-wide styles to this file and they'll appear at
* the top of the compiled file, but it's generally better to create a new file per style scope.
*= require_self
*= require_tree .
*/

View File

@ -2,10 +2,9 @@
<html> <html>
<head> <head>
<title><%= @title.nil? ? (@menu.nil? ? t(:application_name) : @menu.capitalize + ' - ' + t(:application_name)) : @title + ' - ' + t(:application_name) %></title> <title><%= @title.nil? ? (@menu.nil? ? t(:application_name) : @menu.capitalize + ' - ' + t(:application_name)) : @title + ' - ' + t(:application_name) %></title>
<%= stylesheet_link_tag :all %> <%= stylesheet_link_tag "application" %>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js"></script> <%= javascript_include_tag "application" %>
<%= csrf_meta_tag %> <%= csrf_meta_tag %>
</head> </head>
<body> <body>
<div id="wrapper"> <div id="wrapper">

View File

@ -2,9 +2,12 @@ require File.expand_path('../boot', __FILE__)
require 'rails/all' require 'rails/all'
# If you have a Gemfile, require the gems listed there, including any gems if defined?(Bundler)
# you've limited to :test, :development, or :production. # If you precompile assets before deploying to production, use this line
Bundler.require(:default, Rails.env) if defined?(Bundler) # Bundler.require *Rails.groups(:assets => %w(development test))
# If you want your assets lazily compiled in production, use this line
Bundler.require(:default, :assets, Rails.env)
end
module Thingspeak module Thingspeak
class Application < Rails::Application class Application < Rails::Application
@ -13,7 +16,7 @@ module Thingspeak
# -- all .rb files in that directory are automatically loaded. # -- all .rb files in that directory are automatically loaded.
# Custom directories with classes and modules you want to be autoloadable. # Custom directories with classes and modules you want to be autoloadable.
# config.autoload_paths += %W(#{config.root}/extras) config.autoload_paths += %W(#{config.root}/lib)
# Only load the plugins named here, in the order given (default is alphabetical). # Only load the plugins named here, in the order given (default is alphabetical).
# :all can be used as a placeholder for all plugins not explicitly named. # :all can be used as a placeholder for all plugins not explicitly named.
@ -38,5 +41,11 @@ module Thingspeak
# Configure sensitive parameters which will be filtered from the log file. # Configure sensitive parameters which will be filtered from the log file.
config.filter_parameters += [:password] config.filter_parameters += [:password]
# Enable the asset pipeline
config.assets.enabled = true
# Version of your assets, change this if you want to expire all your assets
config.assets.version = '1.0'
end end
end end

View File

@ -11,7 +11,6 @@ Thingspeak::Application.configure do
# Show full error reports and disable caching # Show full error reports and disable caching
config.consider_all_requests_local = true config.consider_all_requests_local = true
config.action_view.debug_rjs = true
config.action_controller.perform_caching = false config.action_controller.perform_caching = false
# Don't care if the mailer can't send # Don't care if the mailer can't send
@ -22,5 +21,18 @@ Thingspeak::Application.configure do
# Only use best-standards-support built into browsers # Only use best-standards-support built into browsers
config.action_dispatch.best_standards_support = :builtin config.action_dispatch.best_standards_support = :builtin
# Raise exception on mass assignment protection for Active Record models
config.active_record.mass_assignment_sanitizer = :strict
# Log the query plan for queries taking more than this (works
# with SQLite, MySQL, and PostgreSQL)
config.active_record.auto_explain_threshold_in_seconds = 0.5
# Do not compress assets
config.assets.compress = false
# Expands the lines which load the assets
config.assets.debug = true
end end

View File

@ -46,4 +46,19 @@ Thingspeak::Application.configure do
# Send deprecation notices to registered listeners # Send deprecation notices to registered listeners
config.active_support.deprecation = :notify config.active_support.deprecation = :notify
# Compress JavaScripts and CSS
config.assets.compress = true
# Don't fallback to assets pipeline if a precompiled asset is missed
config.assets.compile = false
# Generate digests for assets URLs
config.assets.digest = true
# Defaults to Rails.root.join("public/assets")
# config.assets.manifest = YOUR_PATH
config.assets.js_compressor = :uglifier
config.assets.css_compressor = :scss
end end

View File

@ -32,4 +32,11 @@ Thingspeak::Application.configure do
# Print deprecation notices to the stderr # Print deprecation notices to the stderr
config.active_support.deprecation = :stderr config.active_support.deprecation = :stderr
# Allow pass debug_assets=true as a query parameter to load pages with unpackaged assets
config.assets.allow_debugging = true
# Configure static asset server for tests with Cache-Control for performance
config.serve_static_assets = true
config.static_cache_control = "public, max-age=3600"
end end

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.5 KiB

View File

@ -1,2 +0,0 @@
// Place your application-specific JavaScript functions and classes here
// This file is automatically included by javascript_include_tag :defaults

View File

@ -1,175 +0,0 @@
(function() {
// Technique from Juriy Zaytsev
// http://thinkweb2.com/projects/prototype/detecting-event-support-without-browser-sniffing/
function isEventSupported(eventName) {
var el = document.createElement('div');
eventName = 'on' + eventName;
var isSupported = (eventName in el);
if (!isSupported) {
el.setAttribute(eventName, 'return;');
isSupported = typeof el[eventName] == 'function';
}
el = null;
return isSupported;
}
function isForm(element) {
return Object.isElement(element) && element.nodeName.toUpperCase() == 'FORM'
}
function isInput(element) {
if (Object.isElement(element)) {
var name = element.nodeName.toUpperCase()
return name == 'INPUT' || name == 'SELECT' || name == 'TEXTAREA'
}
else return false
}
var submitBubbles = isEventSupported('submit'),
changeBubbles = isEventSupported('change')
if (!submitBubbles || !changeBubbles) {
// augment the Event.Handler class to observe custom events when needed
Event.Handler.prototype.initialize = Event.Handler.prototype.initialize.wrap(
function(init, element, eventName, selector, callback) {
init(element, eventName, selector, callback)
// is the handler being attached to an element that doesn't support this event?
if ( (!submitBubbles && this.eventName == 'submit' && !isForm(this.element)) ||
(!changeBubbles && this.eventName == 'change' && !isInput(this.element)) ) {
// "submit" => "emulated:submit"
this.eventName = 'emulated:' + this.eventName
}
}
)
}
if (!submitBubbles) {
// discover forms on the page by observing focus events which always bubble
document.on('focusin', 'form', function(focusEvent, form) {
// special handler for the real "submit" event (one-time operation)
if (!form.retrieve('emulated:submit')) {
form.on('submit', function(submitEvent) {
var emulated = form.fire('emulated:submit', submitEvent, true)
// if custom event received preventDefault, cancel the real one too
if (emulated.returnValue === false) submitEvent.preventDefault()
})
form.store('emulated:submit', true)
}
})
}
if (!changeBubbles) {
// discover form inputs on the page
document.on('focusin', 'input, select, texarea', function(focusEvent, input) {
// special handler for real "change" events
if (!input.retrieve('emulated:change')) {
input.on('change', function(changeEvent) {
input.fire('emulated:change', changeEvent, true)
})
input.store('emulated:change', true)
}
})
}
function handleRemote(element) {
var method, url, params;
var event = element.fire("ajax:before");
if (event.stopped) return false;
if (element.tagName.toLowerCase() === 'form') {
method = element.readAttribute('method') || 'post';
url = element.readAttribute('action');
params = element.serialize();
} else {
method = element.readAttribute('data-method') || 'get';
url = element.readAttribute('href');
params = {};
}
new Ajax.Request(url, {
method: method,
parameters: params,
evalScripts: true,
onComplete: function(request) { element.fire("ajax:complete", request); },
onSuccess: function(request) { element.fire("ajax:success", request); },
onFailure: function(request) { element.fire("ajax:failure", request); }
});
element.fire("ajax:after");
}
function handleMethod(element) {
var method = element.readAttribute('data-method'),
url = element.readAttribute('href'),
csrf_param = $$('meta[name=csrf-param]')[0],
csrf_token = $$('meta[name=csrf-token]')[0];
var form = new Element('form', { method: "POST", action: url, style: "display: none;" });
element.parentNode.insert(form);
if (method !== 'post') {
var field = new Element('input', { type: 'hidden', name: '_method', value: method });
form.insert(field);
}
if (csrf_param) {
var param = csrf_param.readAttribute('content'),
token = csrf_token.readAttribute('content'),
field = new Element('input', { type: 'hidden', name: param, value: token });
form.insert(field);
}
form.submit();
}
document.on("click", "*[data-confirm]", function(event, element) {
var message = element.readAttribute('data-confirm');
if (!confirm(message)) event.stop();
});
document.on("click", "a[data-remote]", function(event, element) {
if (event.stopped) return;
handleRemote(element);
event.stop();
});
document.on("click", "a[data-method]", function(event, element) {
if (event.stopped) return;
handleMethod(element);
event.stop();
});
document.on("submit", function(event) {
var element = event.findElement(),
message = element.readAttribute('data-confirm');
if (message && !confirm(message)) {
event.stop();
return false;
}
var inputs = element.select("input[type=submit][data-disable-with]");
inputs.each(function(input) {
input.disabled = true;
input.writeAttribute('data-original-value', input.value);
input.value = input.readAttribute('data-disable-with');
});
var element = event.findElement("form[data-remote]");
if (element) {
handleRemote(element);
event.stop();
}
});
document.on("ajax:after", "form", function(event, element) {
var inputs = element.select("input[type=submit][disabled=true][data-disable-with]");
inputs.each(function(input) {
input.value = input.readAttribute('data-original-value');
input.removeAttribute('data-original-value');
input.disabled = false;
});
});
})();