summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGarren Smith <garren.smith@gmail.com>2014-03-14 15:54:27 -0400
committersuelockwood <deathbear@apache.org>2014-03-17 08:23:56 -0400
commit13010ed264582f235825a26a1907952479156163 (patch)
tree770cfeb24101209de487b6436dec713ce226ef74
parentc81f2d470d73051617e0395f771c9f364e3f2e47 (diff)
downloadcouchdb-13010ed264582f235825a26a1907952479156163.tar.gz
Fauxton: remove caching
-rw-r--r--src/fauxton/Gruntfile.js2
-rw-r--r--src/fauxton/app/config.js3
-rw-r--r--src/fauxton/app/core/base.js45
-rw-r--r--src/fauxton/app/core/couchdbSession.js1
-rw-r--r--src/fauxton/assets/js/plugins/backbone.fetch-cache.js311
-rw-r--r--src/fauxton/tasks/couchserver.js4
6 files changed, 18 insertions, 348 deletions
diff --git a/src/fauxton/Gruntfile.js b/src/fauxton/Gruntfile.js
index 348fa450d..49c082e99 100644
--- a/src/fauxton/Gruntfile.js
+++ b/src/fauxton/Gruntfile.js
@@ -170,7 +170,7 @@ module.exports = function(grunt) {
// override inside main.js needs to test for them so as to not accidentally
// route. Settings expr true so we can do `migtBeNullObject && mightBeNullObject.coolFunction()`
jshint: {
- all: ['app/**/*.js', 'Gruntfile.js', "test/core/*.js"],
+ all: ['app/**/*.js', 'Gruntfile.js', "!app/**/assets/js/*.js"],
options: {
scripturl: true,
evil: true,
diff --git a/src/fauxton/app/config.js b/src/fauxton/app/config.js
index a5d764f8c..98be9c6a8 100644
--- a/src/fauxton/app/config.js
+++ b/src/fauxton/app/config.js
@@ -30,8 +30,7 @@ require.config({
spin: "../assets/js/libs/spin.min",
d3: "../assets/js/libs/d3",
"nv.d3": "../assets/js/libs/nv.d3",
- "ace":"../assets/js/libs/ace",
- "backbone.fetch-cache": "../assets/js/plugins/backbone.fetch-cache"
+ "ace":"../assets/js/libs/ace"
},
baseUrl: '/',
diff --git a/src/fauxton/app/core/base.js b/src/fauxton/app/core/base.js
index 7cacf3918..15499b343 100644
--- a/src/fauxton/app/core/base.js
+++ b/src/fauxton/app/core/base.js
@@ -12,11 +12,10 @@
define([
"backbone",
- "plugins/backbone.layoutmanager",
- "backbone.fetch-cache"
+ "plugins/backbone.layoutmanager"
],
-function(Backbone, LayoutManager, BackboneCache) {
+function(Backbone, LayoutManager) {
var FauxtonAPI = {
//add default objects
router: {
@@ -68,44 +67,26 @@ function(Backbone, LayoutManager, BackboneCache) {
}
});
-
- FauxtonAPI.Model = Backbone.Model.extend({
-
- });
-
- FauxtonAPI.Collection = Backbone.Collection.extend({
-
- });
-
var caching = {
- fetchOnce: function (opts) {
- var options = _.defaults(opts || {}, this.cache, {cache: true});
+ fetchOnce: function (opt) {
+ var options = _.extend({}, opt);
- if (opts && !opts.cache) {
- delete options.cache;
+ if (!this._deferred || this._deferred.state() === "rejected" || options.forceFetch ) {
+ this._deferred = this.fetch();
}
- if (!options.prefill) {
- return this.fetch(options);
- }
-
- //With Prefill, the Caching with resolve with whatever is in the cache for that model/collection
- //and at the sametime it will fetch from the server the latest.
- var promise = FauxtonAPI.Deferred(),
- fetchPromise = this.fetch(options);
-
- fetchPromise.progress(promise.resolveWith); // Fires when the cache hit happens
- fetchPromise.then(promise.resolveWith); // Fires after the AJAX call
- promise.fail(fetchPromise.abort);
-
- return promise;
+ return this._deferred;
}
};
- _.each([FauxtonAPI.Collection, FauxtonAPI.Model], function (ctor) {
+ FauxtonAPI.Model = Backbone.Model.extend({ });
+
+ FauxtonAPI.Collection = Backbone.Collection.extend({ });
+
+ _.each([FauxtonAPI.Model, FauxtonAPI.Collection], function (ctor) {
_.extend(ctor.prototype, caching);
});
-
+
var extensions = _.extend({}, Backbone.Events);
// Can look at a remove function later.
FauxtonAPI.registerExtension = function (name, view) {
diff --git a/src/fauxton/app/core/couchdbSession.js b/src/fauxton/app/core/couchdbSession.js
index 747ef3e5f..7482db93d 100644
--- a/src/fauxton/app/core/couchdbSession.js
+++ b/src/fauxton/app/core/couchdbSession.js
@@ -35,7 +35,6 @@ function (FauxtonAPI) {
if (options.forceFetch) {
fetch = _.bind(this.fetch, this);
- Backbone.fetchCache.clearItem(_.result(this, 'url'));
}
return fetch(opt).then(function () {
diff --git a/src/fauxton/assets/js/plugins/backbone.fetch-cache.js b/src/fauxton/assets/js/plugins/backbone.fetch-cache.js
deleted file mode 100644
index 4aa767660..000000000
--- a/src/fauxton/assets/js/plugins/backbone.fetch-cache.js
+++ /dev/null
@@ -1,311 +0,0 @@
-/*!
- backbone.fetch-cache v1.3.0
- by Andy Appleton - https://github.com/mrappleton/backbone-fetch-cache.git
- */
-
-// AMD wrapper from https://github.com/umdjs/umd/blob/master/amdWebGlobal.js
-
-(function (root, factory) {
- if (typeof define === 'function' && define.amd) {
- // AMD. Register as an anonymous module and set browser global
- define(['underscore', 'backbone', 'jquery'], function (_, Backbone, $) {
- return (root.Backbone = factory(_, Backbone, $));
- });
- } else {
- // Browser globals
- root.Backbone = factory(root._, root.Backbone, root.jQuery);
- }
-}(this, function (_, Backbone, $) {
-
- // Setup
- var superMethods = {
- modelFetch: Backbone.Model.prototype.fetch,
- modelSync: Backbone.Model.prototype.sync,
- collectionFetch: Backbone.Collection.prototype.fetch
- },
- supportLocalStorage = (function() {
- var supported = typeof window.localStorage !== 'undefined';
- if (supported) {
- try {
- // impossible to write on some platforms when private browsing is on and
- // throws an exception = local storage not supported.
- localStorage.setItem("test_support", "test_support");
- localStorage.removeItem("test_support");
- } catch (e) {
- supported = false;
- }
- }
- return supported;
- })();
-
- Backbone.fetchCache = (Backbone.fetchCache || {});
- Backbone.fetchCache._cache = (Backbone.fetchCache._cache || {});
-
- Backbone.fetchCache.priorityFn = function(a, b) {
- if (!a || !a.expires || !b || !b.expires) {
- return a;
- }
-
- return a.expires - b.expires;
- };
-
- Backbone.fetchCache._prioritize = function() {
- var sorted = _.values(this._cache).sort(this.priorityFn);
- var index = _.indexOf(_.values(this._cache), sorted[0]);
- return _.keys(this._cache)[index];
- };
-
- Backbone.fetchCache._deleteCacheWithPriority = function() {
- Backbone.fetchCache._cache[this._prioritize()] = null;
- delete Backbone.fetchCache._cache[this._prioritize()];
- Backbone.fetchCache.setLocalStorage();
- };
-
- Backbone.fetchCache.getLocalStorageKey = function() {
- return 'backboneCache';
- };
-
- if (typeof Backbone.fetchCache.localStorage === 'undefined') {
- Backbone.fetchCache.localStorage = true;
- }
-
- // Shared methods
- function getCacheKey(instance, opts) {
- var url;
-
- if(opts && opts.url) {
- url = opts.url;
- } else {
- url = _.isFunction(instance.url) ? instance.url() : instance.url;
- }
-
- // Need url to use as cache key so return if we can't get it
- if(!url) { return; }
-
- if(opts && opts.data) {
- return url + "?" + $.param(opts.data);
- }
- return url;
- }
-
- function setCache(instance, opts, attrs) {
- opts = (opts || {});
- var key = Backbone.fetchCache.getCacheKey(instance, opts),
- expires = false;
-
- // Need url to use as cache key so return if we can't get it
- if (!key) { return; }
-
- // Never set the cache if user has explicitly said not to
- if (opts.cache === false) { return; }
-
- // Don't set the cache unless cache: true or prefill: true option is passed
- if (!(opts.cache || opts.prefill)) { return; }
-
- if (opts.expires !== false) {
- expires = (new Date()).getTime() + ((opts.expires || 5 * 60) * 1000);
- }
-
- Backbone.fetchCache._cache[key] = {
- expires: expires,
- value: attrs
- };
-
- Backbone.fetchCache.setLocalStorage();
- }
-
- function clearItem(key) {
- if (_.isFunction(key)) { key = key(); }
- delete Backbone.fetchCache._cache[key];
- Backbone.fetchCache.setLocalStorage();
- }
-
- function setLocalStorage() {
- if (!supportLocalStorage || !Backbone.fetchCache.localStorage) { return; }
- try {
- localStorage.setItem(Backbone.fetchCache.getLocalStorageKey(), JSON.stringify(Backbone.fetchCache._cache));
- } catch (err) {
- var code = err.code || err.number || err.message;
- if (code === 22) {
- this._deleteCacheWithPriority();
- } else {
- throw(err);
- }
- }
- }
-
- function getLocalStorage() {
- if (!supportLocalStorage || !Backbone.fetchCache.localStorage) { return; }
- var json = localStorage.getItem(Backbone.fetchCache.getLocalStorageKey()) || '{}';
- Backbone.fetchCache._cache = JSON.parse(json);
- }
-
- function nextTick(fn) {
- return window.setTimeout(fn, 0);
- }
-
- // Instance methods
- Backbone.Model.prototype.fetch = function(opts) {
- opts = _.defaults(opts || {}, { parse: true });
- var key = Backbone.fetchCache.getCacheKey(this, opts),
- data = Backbone.fetchCache._cache[key],
- expired = false,
- attributes = false,
- deferred = new $.Deferred(),
- self = this;
-
- function setData() {
- if (opts.parse) {
- attributes = self.parse(attributes, opts);
- }
-
- self.set(attributes, opts);
- if (_.isFunction(opts.prefillSuccess)) { opts.prefillSuccess(self, attributes, opts); }
-
- // Trigger sync events
- self.trigger('cachesync', self, attributes, opts);
- self.trigger('sync', self, attributes, opts);
-
- // Notify progress if we're still waiting for an AJAX call to happen...
- if (opts.prefill) { deferred.notify(self); }
- // ...finish and return if we're not
- else {
- if (_.isFunction(opts.success)) { opts.success(self, attributes, opts); }
- deferred.resolve(self);
- }
- }
-
- if (data) {
- expired = data.expires;
- expired = expired && data.expires < (new Date()).getTime();
- attributes = data.value;
- }
-
- if (!expired && (opts.cache || opts.prefill) && attributes) {
- // Ensure that cache resolution adhers to async option, defaults to true.
- if (opts.async == null) { opts.async = true; }
-
- if (opts.async) {
- nextTick(setData);
- } else {
- setData();
- }
-
- if (!opts.prefill) {
- return deferred;
- }
- }
-
- // Delegate to the actual fetch method and store the attributes in the cache
- superMethods.modelFetch.apply(this, arguments)
- // resolve the returned promise when the AJAX call completes
- .done( _.bind(deferred.resolve, this, this) )
- // Set the new data in the cache
- .done( _.bind(Backbone.fetchCache.setCache, null, this, opts) )
- // Reject the promise on fail
- .fail( _.bind(deferred.reject, this, this) );
-
- // return a promise which provides the same methods as a jqXHR object
- return deferred;
- };
-
- // Override Model.prototype.sync and try to clear cache items if it looks
- // like they are being updated.
- Backbone.Model.prototype.sync = function(method, model, options) {
- // Only empty the cache if we're doing a create, update, patch or delete.
- if (method === 'read') {
- return superMethods.modelSync.apply(this, arguments);
- }
-
- var collection = model.collection,
- keys = [],
- i, len;
-
- // Build up a list of keys to delete from the cache, starting with this
- keys.push(Backbone.fetchCache.getCacheKey(model, options));
-
- // If this model has a collection, also try to delete the cache for that
- if (!!collection) {
- keys.push(Backbone.fetchCache.getCacheKey(collection));
- }
-
- // Empty cache for all found keys
- for (i = 0, len = keys.length; i < len; i++) { clearItem(keys[i]); }
-
- return superMethods.modelSync.apply(this, arguments);
- };
-
- Backbone.Collection.prototype.fetch = function(opts) {
- opts = _.defaults(opts || {}, { parse: true });
- var key = Backbone.fetchCache.getCacheKey(this, opts),
- data = Backbone.fetchCache._cache[key],
- expired = false,
- attributes = false,
- deferred = new $.Deferred(),
- self = this;
-
- function setData() {
- self[opts.reset ? 'reset' : 'set'](attributes, opts);
- if (_.isFunction(opts.prefillSuccess)) { opts.prefillSuccess(self); }
-
- // Trigger sync events
- self.trigger('cachesync', self, attributes, opts);
- self.trigger('sync', self, attributes, opts);
-
- // Notify progress if we're still waiting for an AJAX call to happen...
- if (opts.prefill) { deferred.notify(self); }
- // ...finish and return if we're not
- else {
- if (_.isFunction(opts.success)) { opts.success(self, attributes, opts); }
- deferred.resolve(self);
- }
- }
-
- if (data) {
- expired = data.expires;
- expired = expired && data.expires < (new Date()).getTime();
- attributes = data.value;
- }
-
- if (!expired && (opts.cache || opts.prefill) && attributes) {
- // Ensure that cache resolution adhers to async option, defaults to true.
- if (opts.async == null) { opts.async = true; }
-
- if (opts.async) {
- nextTick(setData);
- } else {
- setData();
- }
-
- if (!opts.prefill) {
- return deferred;
- }
- }
-
- // Delegate to the actual fetch method and store the attributes in the cache
- superMethods.collectionFetch.apply(this, arguments)
- // resolve the returned promise when the AJAX call completes
- .done( _.bind(deferred.resolve, this, this) )
- // Set the new data in the cache
- .done( _.bind(Backbone.fetchCache.setCache, null, this, opts) )
- // Reject the promise on fail
- .fail( _.bind(deferred.reject, this, this) );
-
- // return a promise which provides the same methods as a jqXHR object
- return deferred;
- };
-
- // Prime the cache from localStorage on initialization
- getLocalStorage();
-
- // Exports
-
- Backbone.fetchCache._superMethods = superMethods;
- Backbone.fetchCache.setCache = setCache;
- Backbone.fetchCache.getCacheKey = getCacheKey;
- Backbone.fetchCache.clearItem = clearItem;
- Backbone.fetchCache.setLocalStorage = setLocalStorage;
- Backbone.fetchCache.getLocalStorage = getLocalStorage;
-
- return Backbone;
-}));
diff --git a/src/fauxton/tasks/couchserver.js b/src/fauxton/tasks/couchserver.js
index 21c2fcb23..95b05e860 100644
--- a/src/fauxton/tasks/couchserver.js
+++ b/src/fauxton/tasks/couchserver.js
@@ -47,7 +47,9 @@ module.exports = function (grunt) {
accept = req.headers.accept.split(','),
filePath;
- if (!!url.match(/assets/)) {
+ if (!!url.match(/^\/addons\/.*\/assets\/js/)) {
+ filePath = path.join(app_dir, url.replace('/_utils/fauxton/',''));
+ } else if (!!url.match(/assets/)) {
// serve any javascript or css files from here assets dir
filePath = path.join('./',url);
} else if (!!url.match(/mocha|\/test\/core\/|test\.config/)) {