Remove burry.js
This commit is contained in:
parent
2500d98ebe
commit
9631c9405c
|
@ -1,23 +0,0 @@
|
||||||
Copyright (c) 2012 Yiorgis Gozadinos, Riot AS
|
|
||||||
Postboks 2236, 3103 Tønsberg, Norway
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person
|
|
||||||
obtaining a copy of this software and associated documentation
|
|
||||||
files (the "Software"), to deal in the Software without
|
|
||||||
restriction, including without limitation the rights to use,
|
|
||||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the
|
|
||||||
Software is furnished to do so, subject to the following
|
|
||||||
conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
|
||||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
|
||||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
||||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
||||||
OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,80 +0,0 @@
|
||||||
# burry.js
|
|
||||||
|
|
||||||
A simple caching layer on the browser's localStorage
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
### Creation
|
|
||||||
|
|
||||||
Create a Burry `Store`, optionally passing a namespace. A default store is always available with no namespace:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var burry = new Burry.Store('mystuff');
|
|
||||||
```
|
|
||||||
|
|
||||||
If you want to also set a default time-to-live on a namespaced store, pass the time-to-live as a second parameter. For instance,
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var burrywithttl = new Burry.Store('mystuff', 10);
|
|
||||||
```
|
|
||||||
|
|
||||||
will create a store where the default time-to-live when you set items is 10 minutes.
|
|
||||||
|
|
||||||
You can obtain all available stores, by invoking `stores()`:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var stores = Burry.stores(); // stores is ['', 'mystuff']
|
|
||||||
```
|
|
||||||
|
|
||||||
### Getting/Setting
|
|
||||||
|
|
||||||
`set` and `get` JSON-serializable javascript objects easily to and from the cache.
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
burry.set('foo', {bar: 'burry'});
|
|
||||||
var foo = burry.get('foo'); // foo is {bar: 'burry'}
|
|
||||||
foo = burry.get('unknown'); // foo is undefined
|
|
||||||
```
|
|
||||||
|
|
||||||
You can specify a time-to-live per key/value. This is expressed in minutes:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
burry.set('foo', {bar: 'burry'}, 10);
|
|
||||||
var foo = burry.get('foo'); // foo is {bar: 'burry'}
|
|
||||||
...
|
|
||||||
// Ten minutes later...
|
|
||||||
foo = burry.get('foo'); // foo is undefined and also removed from localStorage
|
|
||||||
```
|
|
||||||
|
|
||||||
Attempting to `set` when the `localStorage` is full, will try again after flushing expired key/values from the cache. If this does not succeed either, your `set` will be ignored.
|
|
||||||
|
|
||||||
### Counters
|
|
||||||
|
|
||||||
You can increment/decrement persistent counters. If the counter does not exist, it is initialized with the value 0.
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
burry.incr('counter');
|
|
||||||
burry.incr('counter');
|
|
||||||
var counter = burry.get('counter'); // counter === 2
|
|
||||||
burry.decr('counter');
|
|
||||||
counter = burry.get('counter'); // counter === 1
|
|
||||||
```
|
|
||||||
|
|
||||||
### Helpers
|
|
||||||
|
|
||||||
The following more esoteric functions are also exposed:
|
|
||||||
|
|
||||||
* `burry.add(key, value, ttl)`, same as `set` except it will only add the key if it does not already exist, or it has already expired.
|
|
||||||
* `burry.replace(key, value, ttl)`, same as `set` except it will only add the key if it does already exist and has not expired.
|
|
||||||
* `burry.flush()`, removes from `localStorage` all Burry items.
|
|
||||||
* `burry.flushExpired()`, removes from `localStorage` all expired Burry items of the store.
|
|
||||||
* `Burry.flushExpired()`, removes from `localStorage` all expired Burry items of all stores.
|
|
||||||
* `burry.keys()`, returns all stored keys.
|
|
||||||
* `burry.expirableKeys()` return an dictionary of key/values where the values are the TTL of the keys from Epoch.
|
|
||||||
* `burry.hasExpired(key)`, returns whether a key has expired.
|
|
||||||
* `Burry.isSupported()`, returns whether `localStorage` and `JSON` serialization are supported on the browser.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
Backbone.xmpp.storage is Copyright (C) 2012 Yiorgis Gozadinos, Riot AS.
|
|
||||||
It is distributed under the MIT license.
|
|
|
@ -1,292 +0,0 @@
|
||||||
// Burry.js Storage v0.1
|
|
||||||
|
|
||||||
// (c) 2012 Yiorgis Gozadinos, Riot AS.
|
|
||||||
// Burry.js is distributed under the MIT license.
|
|
||||||
// http://github.com/ggozad/burry.js
|
|
||||||
|
|
||||||
// AMD/global registrations
|
|
||||||
(function (root, factory) {
|
|
||||||
if (typeof define === 'function' && define.amd) {
|
|
||||||
// AMD. Register as an anonymous module.
|
|
||||||
define([], function () {
|
|
||||||
return factory();
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
// Browser globals
|
|
||||||
root.Burry = factory();
|
|
||||||
}
|
|
||||||
}(this, function () {
|
|
||||||
|
|
||||||
// Construct a new Burry store with an optional `namespace` and an optional default `ttl`.
|
|
||||||
var Burry = {
|
|
||||||
|
|
||||||
Store: function (ns, default_ttl) {
|
|
||||||
var stores = Burry.stores();
|
|
||||||
if (ns) {
|
|
||||||
this._CACHE_SUFFIX = this._CACHE_SUFFIX + ns;
|
|
||||||
this._EXPIRY_KEY = this._EXPIRY_KEY + ns;
|
|
||||||
if (stores.indexOf(ns) === -1)
|
|
||||||
stores.push(ns);
|
|
||||||
}
|
|
||||||
localStorage.setItem('_burry_stores_', JSON.stringify(stores));
|
|
||||||
this.default_ttl = default_ttl;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Time resolution in minutes
|
|
||||||
_EXPIRY_UNITS: 60 * 1000,
|
|
||||||
|
|
||||||
// Calculate the time since Epoch in minutes
|
|
||||||
_mEpoch: function () {
|
|
||||||
return Math.floor((new Date().getTime())/Burry._EXPIRY_UNITS);
|
|
||||||
},
|
|
||||||
|
|
||||||
stores: function () {
|
|
||||||
var stores = localStorage.getItem('_burry_stores_');
|
|
||||||
if (stores) {
|
|
||||||
stores = JSON.parse(stores);
|
|
||||||
} else {
|
|
||||||
stores = [''];
|
|
||||||
}
|
|
||||||
return stores;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Checks for localStorage & JSON support.
|
|
||||||
isSupported: function () {
|
|
||||||
// If this has been called before we already know.
|
|
||||||
if (Burry._isSupported) return Burry._isSupported;
|
|
||||||
|
|
||||||
try {
|
|
||||||
localStorage.setItem('_burry_', '_burry_');
|
|
||||||
localStorage.removeItem('_burry_');
|
|
||||||
} catch (e) {
|
|
||||||
return Burry._isSupported = false;
|
|
||||||
}
|
|
||||||
if (!JSON) {
|
|
||||||
return Burry._isSupported = false;
|
|
||||||
}
|
|
||||||
return Burry._isSupported = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
flushExpired: function () {
|
|
||||||
var i, match, key, val, ns,
|
|
||||||
remove = [],
|
|
||||||
now = Burry._mEpoch();
|
|
||||||
|
|
||||||
for (i=0; i< localStorage.length; i++) {
|
|
||||||
key = localStorage.key(i);
|
|
||||||
match = key.match(/(.+)-_burry_exp_(.*)/);
|
|
||||||
if (match) {
|
|
||||||
val = localStorage.getItem(key);
|
|
||||||
if (val < now) {
|
|
||||||
key = match[1]; ns = match[2];
|
|
||||||
remove.push(key + Burry.Store.prototype._CACHE_SUFFIX + ns);
|
|
||||||
remove.push(key + Burry.Store.prototype._EXPIRY_KEY + ns);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (i=0; i< remove.length; i++) {
|
|
||||||
localStorage.removeItem(remove[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Instance methods
|
|
||||||
|
|
||||||
Burry.Store.prototype = {
|
|
||||||
|
|
||||||
// Suffix to all keys in the cache
|
|
||||||
_CACHE_SUFFIX: '-_burry_',
|
|
||||||
|
|
||||||
// Key used to store expiration data
|
|
||||||
_EXPIRY_KEY: '-_burry_exp_',
|
|
||||||
|
|
||||||
// Return the internally used suffixed key.
|
|
||||||
_internalKey: function (key) {
|
|
||||||
return key + this._CACHE_SUFFIX;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Return the internally used suffixed expiration key.
|
|
||||||
_expirationKey: function (key) {
|
|
||||||
return key + this._EXPIRY_KEY;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Check if a key is a valid internal key
|
|
||||||
_isInternalKey: function (key) {
|
|
||||||
if (key.slice(-this._CACHE_SUFFIX.length) === this._CACHE_SUFFIX)
|
|
||||||
return key.slice(0, -this._CACHE_SUFFIX.length);
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Check if a key is a valid expiration key
|
|
||||||
_isExpirationKey: function (key) {
|
|
||||||
if (key.slice(-this._EXPIRY_KEY.length) === this._EXPIRY_KEY)
|
|
||||||
return key.slice(0, -this._EXPIRY_KEY.length);
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Returns in how many minutes after Epoch the key expires,
|
|
||||||
// or `undefined` if it does not expire.
|
|
||||||
_expiresOn: function (key) {
|
|
||||||
var expires = localStorage.getItem(this._expirationKey(key));
|
|
||||||
if (expires) {
|
|
||||||
return parseInt(expires, 10);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Parse the value of a key as an integer.
|
|
||||||
_getCounter: function (bkey) {
|
|
||||||
var value = localStorage.getItem(bkey);
|
|
||||||
if (value === null) return 0;
|
|
||||||
|
|
||||||
return parseInt(value, 10);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Returns the value of `key` from the cache, `undefined` if the `key` has
|
|
||||||
// expired or is not stored.
|
|
||||||
get: function (key) {
|
|
||||||
var value = localStorage.getItem(this._internalKey(key));
|
|
||||||
if (value === null) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
if (this.hasExpired(key)) {
|
|
||||||
this.remove(key);
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
value = JSON.parse(value);
|
|
||||||
} catch (e) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Sets a `key`/`value` on the cache. Optionally, sets the expiration in `ttl` minutes.
|
|
||||||
set: function (key, value, ttl) {
|
|
||||||
var i, bkey, expires = {};
|
|
||||||
ttl = ttl || this.default_ttl;
|
|
||||||
if (ttl) ttl = parseInt(ttl, 10);
|
|
||||||
if (typeof key === undefined || typeof value === undefined) return;
|
|
||||||
value = JSON.stringify(value);
|
|
||||||
try {
|
|
||||||
localStorage.setItem(this._internalKey(key), value);
|
|
||||||
if (ttl) {
|
|
||||||
localStorage.setItem(this._expirationKey(key), Burry._mEpoch() + ttl);
|
|
||||||
} else {
|
|
||||||
localStorage.removeItem(this._expirationKey(key));
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
if (e.name === 'QUOTA_EXCEEDED_ERR' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {
|
|
||||||
// No space left on localStorage, let's flush expired items and try agagin.
|
|
||||||
Burry.flushExpired();
|
|
||||||
try {
|
|
||||||
localStorage.setItem(this._internalKey(key), value);
|
|
||||||
if (ttl) {
|
|
||||||
localStorage.setItem(this._expirationKey(key), Burry._mEpoch() + ttl);
|
|
||||||
} else {
|
|
||||||
localStorage.removeItem(this._expirationKey(key));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
// Oh well. Let's forget about it.
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Sets a `key`/`value` on the cache as does **set** but only if the key does not already exist or has expired.
|
|
||||||
add: function (key, value, ttl) {
|
|
||||||
if (localStorage.getItem(this._internalKey(key)) === null || this.hasExpired(key)) {
|
|
||||||
this.set(key, value, ttl);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Sets a `key`/`value` on the cache as does **set** but only if the key already exist and has not expired.
|
|
||||||
replace: function (key, value, ttl) {
|
|
||||||
if (localStorage.getItem(this._internalKey(key)) !== null && !this.hasExpired(key)) {
|
|
||||||
this.set(key, value, ttl);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
// Removes an item from the cache.
|
|
||||||
remove: function (key) {
|
|
||||||
localStorage.removeItem(this._internalKey(key));
|
|
||||||
localStorage.removeItem(this._expirationKey(key));
|
|
||||||
},
|
|
||||||
|
|
||||||
// Increments the integer value of `key` by 1
|
|
||||||
incr: function (key) {
|
|
||||||
var bkey = this._internalKey(key),
|
|
||||||
value = this._getCounter(bkey);
|
|
||||||
value++;
|
|
||||||
localStorage.setItem(bkey, value);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Decrements the integer value of `key` by 1
|
|
||||||
decr: function (key) {
|
|
||||||
var bkey = this._internalKey(key),
|
|
||||||
value = this._getCounter(bkey);
|
|
||||||
value--;
|
|
||||||
localStorage.setItem(bkey, value);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Returns whether `key` has expired.
|
|
||||||
hasExpired: function (key) {
|
|
||||||
var expireson = this._expiresOn(key);
|
|
||||||
if (expireson && (expireson < Burry._mEpoch())) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Returns a list of all the cached keys
|
|
||||||
keys: function () {
|
|
||||||
var i, bkey, key, results = [];
|
|
||||||
for (i=0; i < localStorage.length ; i++) {
|
|
||||||
bkey = localStorage.key(i);
|
|
||||||
key = this._isInternalKey(bkey);
|
|
||||||
if (key) {
|
|
||||||
results.push(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Returns an object with all the expirable keys. The values are the ttl
|
|
||||||
// in minutes since Epoch.
|
|
||||||
expirableKeys: function () {
|
|
||||||
var i, bkey, key, results = {};
|
|
||||||
for (i=0; i < localStorage.length ; i++) {
|
|
||||||
bkey = localStorage.key(i);
|
|
||||||
key = this._isExpirationKey(bkey);
|
|
||||||
if (key) {
|
|
||||||
results[key] = parseInt(localStorage.getItem(bkey), 10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return results;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Removes all Burry items from `localStorage`.
|
|
||||||
flush: function () {
|
|
||||||
var i, key, remove = [];
|
|
||||||
for (i=0; i < localStorage.length ; i++) {
|
|
||||||
key = localStorage.key(i);
|
|
||||||
if (this._isInternalKey(key) || this._isExpirationKey(key)) {
|
|
||||||
remove.push(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (i=0; i<remove.length; i++)
|
|
||||||
localStorage.removeItem(remove[i]);
|
|
||||||
},
|
|
||||||
|
|
||||||
// Removes all expired items.
|
|
||||||
flushExpired: function () {
|
|
||||||
var expirable = this.expirableKeys(), now = Burry._mEpoch(), key, val;
|
|
||||||
for (key in expirable) {
|
|
||||||
val = expirable[key];
|
|
||||||
if (val < now) this.remove(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return Burry;
|
|
||||||
}));
|
|
|
@ -1,601 +0,0 @@
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta http-equiv="content-type" content="text/html;charset=utf-8">
|
|
||||||
<title>burry.js</title>
|
|
||||||
<link rel="stylesheet" href="pycco.css">
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="background"></div>
|
|
||||||
<div id='container'>
|
|
||||||
<div class='section'>
|
|
||||||
<div class='docs'><h1>burry.js</h1></div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'>
|
|
||||||
<div class='section' id='section-0'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-0'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Burry.js Storage v0.1</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-1'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-1'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>(c) 2012 Yiorgis Gozadinos, Riot AS.
|
|
||||||
Burry.js is distributed under the MIT license.
|
|
||||||
http://github.com/ggozad/burry.js</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-2'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-2'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>AMD/global registrations</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre><span class="p">(</span><span class="kd">function</span> <span class="p">(</span><span class="nx">root</span><span class="p">,</span> <span class="nx">factory</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">define</span> <span class="o">===</span> <span class="s1">'function'</span> <span class="o">&&</span> <span class="nx">define</span><span class="p">.</span><span class="nx">amd</span><span class="p">)</span> <span class="p">{</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-3'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-3'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>AMD. Register as an anonymous module.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">define</span><span class="p">([],</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
|
|
||||||
<span class="k">return</span> <span class="nx">factory</span><span class="p">();</span>
|
|
||||||
<span class="p">});</span>
|
|
||||||
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-4'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-4'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Browser globals</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">root</span><span class="p">.</span><span class="nx">Burry</span> <span class="o">=</span> <span class="nx">factory</span><span class="p">();</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">}(</span><span class="k">this</span><span class="p">,</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-5'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-5'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Construct a new Burry store with an optional <code>namespace</code> and an optional default <code>ttl</code>.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="kd">var</span> <span class="nx">Burry</span> <span class="o">=</span> <span class="p">{</span>
|
|
||||||
|
|
||||||
<span class="nx">Store</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">ns</span><span class="p">,</span> <span class="nx">default_ttl</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">stores</span> <span class="o">=</span> <span class="nx">Burry</span><span class="p">.</span><span class="nx">stores</span><span class="p">();</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">ns</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">this</span><span class="p">.</span><span class="nx">_CACHE_SUFFIX</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_CACHE_SUFFIX</span> <span class="o">+</span> <span class="nx">ns</span><span class="p">;</span>
|
|
||||||
<span class="k">this</span><span class="p">.</span><span class="nx">_EXPIRY_KEY</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_EXPIRY_KEY</span> <span class="o">+</span> <span class="nx">ns</span><span class="p">;</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">stores</span><span class="p">.</span><span class="nx">indexOf</span><span class="p">(</span><span class="nx">ns</span><span class="p">)</span> <span class="o">===</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
|
||||||
<span class="nx">stores</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">ns</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">setItem</span><span class="p">(</span><span class="s1">'_burry_stores_'</span><span class="p">,</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">stores</span><span class="p">));</span>
|
|
||||||
<span class="k">this</span><span class="p">.</span><span class="nx">default_ttl</span> <span class="o">=</span> <span class="nx">default_ttl</span><span class="p">;</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-6'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-6'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Time resolution in minutes</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">_EXPIRY_UNITS</span><span class="o">:</span> <span class="mi">60</span> <span class="o">*</span> <span class="mi">1000</span><span class="p">,</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-7'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-7'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Calculate the time since Epoch in minutes</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">_mEpoch</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
|
|
||||||
<span class="k">return</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">floor</span><span class="p">((</span><span class="k">new</span> <span class="nb">Date</span><span class="p">().</span><span class="nx">getTime</span><span class="p">())</span><span class="o">/</span><span class="nx">Burry</span><span class="p">.</span><span class="nx">_EXPIRY_UNITS</span><span class="p">);</span>
|
|
||||||
<span class="p">},</span>
|
|
||||||
|
|
||||||
<span class="nx">stores</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">stores</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">getItem</span><span class="p">(</span><span class="s1">'_burry_stores_'</span><span class="p">);</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">stores</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">stores</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">stores</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
|
||||||
<span class="nx">stores</span> <span class="o">=</span> <span class="p">[</span><span class="s1">''</span><span class="p">];</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="k">return</span> <span class="nx">stores</span><span class="p">;</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-8'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-8'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Checks for localStorage & JSON support.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">isSupported</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
|
|
||||||
<span class="k">try</span> <span class="p">{</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">setItem</span><span class="p">(</span><span class="s1">'_burry_'</span><span class="p">,</span> <span class="s1">'_burry_'</span><span class="p">);</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">removeItem</span><span class="p">(</span><span class="s1">'_burry_'</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="nx">JSON</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
|
|
||||||
<span class="p">},</span>
|
|
||||||
|
|
||||||
<span class="nx">flushExpired</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">match</span><span class="p">,</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span><span class="p">,</span> <span class="nx">ns</span><span class="p">,</span>
|
|
||||||
<span class="nx">remove</span> <span class="o">=</span> <span class="p">[],</span>
|
|
||||||
<span class="nx">now</span> <span class="o">=</span> <span class="nx">Burry</span><span class="p">.</span><span class="nx">_mEpoch</span><span class="p">();</span>
|
|
||||||
|
|
||||||
<span class="k">for</span> <span class="p">(</span><span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span><span class="o"><</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">key</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">key</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>
|
|
||||||
<span class="nx">match</span> <span class="o">=</span> <span class="nx">key</span><span class="p">.</span><span class="nx">match</span><span class="p">(</span><span class="sr">/(.+)-_burry_exp_(.*)/</span><span class="p">);</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">match</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">val</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">getItem</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">val</span> <span class="o"><</span> <span class="nx">now</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">key</span> <span class="o">=</span> <span class="nx">match</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span> <span class="nx">ns</span> <span class="o">=</span> <span class="nx">match</span><span class="p">[</span><span class="mi">2</span><span class="p">];</span>
|
|
||||||
<span class="nx">remove</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">key</span> <span class="o">+</span> <span class="nx">Burry</span><span class="p">.</span><span class="nx">Store</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">_CACHE_SUFFIX</span> <span class="o">+</span> <span class="nx">ns</span><span class="p">);</span>
|
|
||||||
<span class="nx">remove</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">key</span> <span class="o">+</span> <span class="nx">Burry</span><span class="p">.</span><span class="nx">Store</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">_EXPIRY_KEY</span> <span class="o">+</span> <span class="nx">ns</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="k">for</span> <span class="p">(</span><span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span><span class="o"><</span> <span class="nx">remove</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">removeItem</span><span class="p">(</span><span class="nx">remove</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">};</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-9'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-9'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Instance methods</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">Burry</span><span class="p">.</span><span class="nx">Store</span><span class="p">.</span><span class="nx">prototype</span> <span class="o">=</span> <span class="p">{</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-10'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-10'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Suffix to all keys in the cache</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">_CACHE_SUFFIX</span><span class="o">:</span> <span class="s1">'-_burry_'</span><span class="p">,</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-11'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-11'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Key used to store expiration data</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">_EXPIRY_KEY</span><span class="o">:</span> <span class="s1">'-_burry_exp_'</span><span class="p">,</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-12'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-12'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Return the internally used suffixed key.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">_internalKey</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">return</span> <span class="nx">key</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">_CACHE_SUFFIX</span><span class="p">;</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-13'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-13'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Return the internally used suffixed expiration key.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">_expirationKey</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">return</span> <span class="nx">key</span> <span class="o">+</span> <span class="k">this</span><span class="p">.</span><span class="nx">_EXPIRY_KEY</span><span class="p">;</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-14'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-14'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Check if a key is a valid internal key</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">_isInternalKey</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">key</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="o">-</span><span class="k">this</span><span class="p">.</span><span class="nx">_CACHE_SUFFIX</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="o">===</span> <span class="k">this</span><span class="p">.</span><span class="nx">_CACHE_SUFFIX</span><span class="p">)</span>
|
|
||||||
<span class="k">return</span> <span class="nx">key</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="k">this</span><span class="p">.</span><span class="nx">_CACHE_SUFFIX</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
|
|
||||||
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-15'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-15'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Check if a key is a valid expiration key</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">_isExpirationKey</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">key</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="o">-</span><span class="k">this</span><span class="p">.</span><span class="nx">_EXPIRY_KEY</span><span class="p">.</span><span class="nx">length</span><span class="p">)</span> <span class="o">===</span> <span class="k">this</span><span class="p">.</span><span class="nx">_EXPIRY_KEY</span><span class="p">)</span>
|
|
||||||
<span class="k">return</span> <span class="nx">key</span><span class="p">.</span><span class="nx">slice</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="o">-</span><span class="k">this</span><span class="p">.</span><span class="nx">_EXPIRY_KEY</span><span class="p">.</span><span class="nx">length</span><span class="p">);</span>
|
|
||||||
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-16'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-16'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Returns in how many minutes after Epoch the key expires,
|
|
||||||
or <code>undefined</code> if it does not expire.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">_expiresOn</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">expires</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">getItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_expirationKey</span><span class="p">(</span><span class="nx">key</span><span class="p">));</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">expires</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">return</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">expires</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-17'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-17'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Parse the value of a key as an integer.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">_getCounter</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">bkey</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">getItem</span><span class="p">(</span><span class="nx">bkey</span><span class="p">);</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">value</span> <span class="o">===</span> <span class="kc">null</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
|
|
||||||
|
|
||||||
<span class="k">return</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">value</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-18'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-18'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Returns the value of <code>key</code> from the cache, <code>undefined</code> if the <code>key</code> has
|
|
||||||
expired or is not stored.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">get</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">value</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">getItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_internalKey</span><span class="p">(</span><span class="nx">key</span><span class="p">));</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">value</span> <span class="o">===</span> <span class="kc">null</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">return</span> <span class="kc">undefined</span><span class="p">;</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">hasExpired</span><span class="p">(</span><span class="nx">key</span><span class="p">))</span> <span class="p">{</span>
|
|
||||||
<span class="k">this</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
|
|
||||||
<span class="k">return</span> <span class="kc">undefined</span><span class="p">;</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="k">try</span> <span class="p">{</span>
|
|
||||||
<span class="nx">value</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">parse</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">return</span> <span class="kc">undefined</span><span class="p">;</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="k">return</span> <span class="nx">value</span><span class="p">;</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-19'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-19'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Sets a <code>key</code>/<code>value</code> on the cache. Optionally, sets the expiration in <code>ttl</code> minutes.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">set</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">ttl</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">bkey</span><span class="p">,</span> <span class="nx">expires</span> <span class="o">=</span> <span class="p">{};</span>
|
|
||||||
<span class="nx">ttl</span> <span class="o">=</span> <span class="nx">ttl</span> <span class="o">||</span> <span class="k">this</span><span class="p">.</span><span class="nx">default_ttl</span><span class="p">;</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">ttl</span><span class="p">)</span> <span class="nx">ttl</span> <span class="o">=</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">ttl</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="k">typeof</span> <span class="nx">key</span> <span class="o">===</span> <span class="kc">undefined</span> <span class="o">||</span> <span class="k">typeof</span> <span class="nx">value</span> <span class="o">===</span> <span class="kc">undefined</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
|
|
||||||
<span class="nx">value</span> <span class="o">=</span> <span class="nx">JSON</span><span class="p">.</span><span class="nx">stringify</span><span class="p">(</span><span class="nx">value</span><span class="p">);</span>
|
|
||||||
<span class="k">try</span> <span class="p">{</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">setItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_internalKey</span><span class="p">(</span><span class="nx">key</span><span class="p">),</span> <span class="nx">value</span><span class="p">);</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">ttl</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">setItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_expirationKey</span><span class="p">(</span><span class="nx">key</span><span class="p">),</span> <span class="nx">Burry</span><span class="p">.</span><span class="nx">_mEpoch</span><span class="p">()</span> <span class="o">+</span> <span class="nx">ttl</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">removeItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_expirationKey</span><span class="p">(</span><span class="nx">key</span><span class="p">));</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">e</span><span class="p">.</span><span class="nx">name</span> <span class="o">===</span> <span class="s1">'QUOTA_EXCEEDED_ERR'</span> <span class="o">||</span> <span class="nx">e</span><span class="p">.</span><span class="nx">name</span> <span class="o">===</span> <span class="s1">'NS_ERROR_DOM_QUOTA_REACHED'</span><span class="p">)</span> <span class="p">{</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-20'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-20'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>No space left on localStorage, let's flush expired items and try agagin.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">Burry</span><span class="p">.</span><span class="nx">flushExpired</span><span class="p">();</span>
|
|
||||||
<span class="k">try</span> <span class="p">{</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">setItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_internalKey</span><span class="p">(</span><span class="nx">key</span><span class="p">),</span> <span class="nx">value</span><span class="p">);</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">ttl</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">setItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_expirationKey</span><span class="p">(</span><span class="nx">key</span><span class="p">),</span> <span class="nx">Burry</span><span class="p">.</span><span class="nx">_mEpoch</span><span class="p">()</span> <span class="o">+</span> <span class="nx">ttl</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">removeItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_expirationKey</span><span class="p">(</span><span class="nx">key</span><span class="p">));</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="k">catch</span> <span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-21'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-21'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Oh well. Let's forget about it.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="p">}</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-22'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-22'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Sets a <code>key</code>/<code>value</code> on the cache as does <strong>set</strong> but only if the key does not already exist or has expired.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">add</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">ttl</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">localStorage</span><span class="p">.</span><span class="nx">getItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_internalKey</span><span class="p">(</span><span class="nx">key</span><span class="p">))</span> <span class="o">===</span> <span class="kc">null</span> <span class="o">||</span> <span class="k">this</span><span class="p">.</span><span class="nx">hasExpired</span><span class="p">(</span><span class="nx">key</span><span class="p">))</span> <span class="p">{</span>
|
|
||||||
<span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">ttl</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-23'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-23'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Sets a <code>key</code>/<code>value</code> on the cache as does <strong>set</strong> but only if the key already exist and has not expired.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">replace</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">ttl</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">localStorage</span><span class="p">.</span><span class="nx">getItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_internalKey</span><span class="p">(</span><span class="nx">key</span><span class="p">))</span> <span class="o">!==</span> <span class="kc">null</span> <span class="o">&&</span> <span class="o">!</span><span class="k">this</span><span class="p">.</span><span class="nx">hasExpired</span><span class="p">(</span><span class="nx">key</span><span class="p">))</span> <span class="p">{</span>
|
|
||||||
<span class="k">this</span><span class="p">.</span><span class="nx">set</span><span class="p">(</span><span class="nx">key</span><span class="p">,</span> <span class="nx">value</span><span class="p">,</span> <span class="nx">ttl</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-24'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-24'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Removes an item from the cache.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">remove</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">removeItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_internalKey</span><span class="p">(</span><span class="nx">key</span><span class="p">));</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">removeItem</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_expirationKey</span><span class="p">(</span><span class="nx">key</span><span class="p">));</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-25'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-25'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Increments the integer value of <code>key</code> by 1</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">incr</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">bkey</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_internalKey</span><span class="p">(</span><span class="nx">key</span><span class="p">),</span>
|
|
||||||
<span class="nx">value</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_getCounter</span><span class="p">(</span><span class="nx">bkey</span><span class="p">);</span>
|
|
||||||
<span class="nx">value</span><span class="o">++</span><span class="p">;</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">setItem</span><span class="p">(</span><span class="nx">bkey</span><span class="p">,</span> <span class="nx">value</span><span class="p">);</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-26'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-26'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Decrements the integer value of <code>key</code> by 1</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">decr</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">bkey</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_internalKey</span><span class="p">(</span><span class="nx">key</span><span class="p">),</span>
|
|
||||||
<span class="nx">value</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_getCounter</span><span class="p">(</span><span class="nx">bkey</span><span class="p">);</span>
|
|
||||||
<span class="nx">value</span><span class="o">--</span><span class="p">;</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">setItem</span><span class="p">(</span><span class="nx">bkey</span><span class="p">,</span> <span class="nx">value</span><span class="p">);</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-27'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-27'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Returns whether <code>key</code> has expired.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">hasExpired</span><span class="o">:</span> <span class="kd">function</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">expireson</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_expiresOn</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">expireson</span> <span class="o">&&</span> <span class="p">(</span><span class="nx">expireson</span> <span class="o"><</span> <span class="nx">Burry</span><span class="p">.</span><span class="nx">_mEpoch</span><span class="p">()))</span> <span class="p">{</span>
|
|
||||||
<span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-28'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-28'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Returns a list of all the cached keys</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">keys</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">bkey</span><span class="p">,</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">results</span> <span class="o">=</span> <span class="p">[];</span>
|
|
||||||
<span class="k">for</span> <span class="p">(</span><span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">length</span> <span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">bkey</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">key</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>
|
|
||||||
<span class="nx">key</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_isInternalKey</span><span class="p">(</span><span class="nx">bkey</span><span class="p">);</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">results</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="k">return</span> <span class="nx">results</span><span class="p">;</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-29'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-29'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Returns an object with all the expirable keys. The values are the ttl
|
|
||||||
in minutes since Epoch.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">expirableKeys</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">bkey</span><span class="p">,</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">results</span> <span class="o">=</span> <span class="p">{};</span>
|
|
||||||
<span class="k">for</span> <span class="p">(</span><span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">length</span> <span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">bkey</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">key</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>
|
|
||||||
<span class="nx">key</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">_isExpirationKey</span><span class="p">(</span><span class="nx">bkey</span><span class="p">);</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">results</span><span class="p">[</span><span class="nx">key</span><span class="p">]</span> <span class="o">=</span> <span class="nb">parseInt</span><span class="p">(</span><span class="nx">localStorage</span><span class="p">.</span><span class="nx">getItem</span><span class="p">(</span><span class="nx">bkey</span><span class="p">),</span> <span class="mi">10</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="k">return</span> <span class="nx">results</span><span class="p">;</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-30'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-30'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Removes all Burry items from <code>localStorage</code>.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">flush</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">i</span><span class="p">,</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">remove</span> <span class="o">=</span> <span class="p">[];</span>
|
|
||||||
<span class="k">for</span> <span class="p">(</span><span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o"><</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">length</span> <span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">key</span> <span class="o">=</span> <span class="nx">localStorage</span><span class="p">.</span><span class="nx">key</span><span class="p">(</span><span class="nx">i</span><span class="p">);</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_isInternalKey</span><span class="p">(</span><span class="nx">key</span><span class="p">)</span> <span class="o">||</span> <span class="k">this</span><span class="p">.</span><span class="nx">_isExpirationKey</span><span class="p">(</span><span class="nx">key</span><span class="p">))</span> <span class="p">{</span>
|
|
||||||
<span class="nx">remove</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="k">for</span> <span class="p">(</span><span class="nx">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="nx">i</span><span class="o"><</span><span class="nx">remove</span><span class="p">.</span><span class="nx">length</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span>
|
|
||||||
<span class="nx">localStorage</span><span class="p">.</span><span class="nx">removeItem</span><span class="p">(</span><span class="nx">remove</span><span class="p">[</span><span class="nx">i</span><span class="p">]);</span>
|
|
||||||
<span class="p">},</span></pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
<div class='section' id='section-31'>
|
|
||||||
<div class='docs'>
|
|
||||||
<div class='octowrap'>
|
|
||||||
<a class='octothorpe' href='#section-31'>#</a>
|
|
||||||
</div>
|
|
||||||
<p>Removes all expired items.</p>
|
|
||||||
</div>
|
|
||||||
<div class='code'>
|
|
||||||
<div class="highlight"><pre> <span class="nx">flushExpired</span><span class="o">:</span> <span class="kd">function</span> <span class="p">()</span> <span class="p">{</span>
|
|
||||||
<span class="kd">var</span> <span class="nx">expirable</span> <span class="o">=</span> <span class="k">this</span><span class="p">.</span><span class="nx">expirableKeys</span><span class="p">(),</span> <span class="nx">now</span> <span class="o">=</span> <span class="nx">Burry</span><span class="p">.</span><span class="nx">_mEpoch</span><span class="p">(),</span> <span class="nx">key</span><span class="p">,</span> <span class="nx">val</span><span class="p">;</span>
|
|
||||||
<span class="k">for</span> <span class="p">(</span><span class="nx">key</span> <span class="k">in</span> <span class="nx">expirable</span><span class="p">)</span> <span class="p">{</span>
|
|
||||||
<span class="nx">val</span> <span class="o">=</span> <span class="nx">expirable</span><span class="p">[</span><span class="nx">key</span><span class="p">];</span>
|
|
||||||
<span class="k">if</span> <span class="p">(</span><span class="nx">val</span> <span class="o"><</span> <span class="nx">now</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">remove</span><span class="p">(</span><span class="nx">key</span><span class="p">);</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">}</span>
|
|
||||||
<span class="p">};</span>
|
|
||||||
|
|
||||||
<span class="k">return</span> <span class="nx">Burry</span><span class="p">;</span>
|
|
||||||
<span class="p">}));</span>
|
|
||||||
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class='clearall'></div>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
|
@ -1,186 +0,0 @@
|
||||||
/*--------------------- Layout and Typography ----------------------------*/
|
|
||||||
body {
|
|
||||||
font-family: 'Palatino Linotype', 'Book Antiqua', Palatino, FreeSerif, serif;
|
|
||||||
font-size: 16px;
|
|
||||||
line-height: 24px;
|
|
||||||
color: #252519;
|
|
||||||
margin: 0; padding: 0;
|
|
||||||
}
|
|
||||||
a {
|
|
||||||
color: #261a3b;
|
|
||||||
}
|
|
||||||
a:visited {
|
|
||||||
color: #261a3b;
|
|
||||||
}
|
|
||||||
p {
|
|
||||||
margin: 0 0 15px 0;
|
|
||||||
}
|
|
||||||
h1, h2, h3, h4, h5, h6 {
|
|
||||||
margin: 40px 0 15px 0;
|
|
||||||
}
|
|
||||||
h2, h3, h4, h5, h6 {
|
|
||||||
margin-top: 0;
|
|
||||||
}
|
|
||||||
#container, div.section {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
#background {
|
|
||||||
position: fixed;
|
|
||||||
top: 0; left: 580px; right: 0; bottom: 0;
|
|
||||||
background: #f5f5ff;
|
|
||||||
border-left: 1px solid #e5e5ee;
|
|
||||||
z-index: -1;
|
|
||||||
}
|
|
||||||
#jump_to, #jump_page {
|
|
||||||
background: white;
|
|
||||||
-webkit-box-shadow: 0 0 25px #777; -moz-box-shadow: 0 0 25px #777;
|
|
||||||
-webkit-border-bottom-left-radius: 5px; -moz-border-radius-bottomleft: 5px;
|
|
||||||
font: 10px Arial;
|
|
||||||
text-transform: uppercase;
|
|
||||||
cursor: pointer;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
#jump_to, #jump_wrapper {
|
|
||||||
position: fixed;
|
|
||||||
right: 0; top: 0;
|
|
||||||
padding: 5px 10px;
|
|
||||||
}
|
|
||||||
#jump_wrapper {
|
|
||||||
padding: 0;
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
#jump_to:hover #jump_wrapper {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
#jump_page {
|
|
||||||
padding: 5px 0 3px;
|
|
||||||
margin: 0 0 25px 25px;
|
|
||||||
}
|
|
||||||
#jump_page .source {
|
|
||||||
display: block;
|
|
||||||
padding: 5px 10px;
|
|
||||||
text-decoration: none;
|
|
||||||
border-top: 1px solid #eee;
|
|
||||||
}
|
|
||||||
#jump_page .source:hover {
|
|
||||||
background: #f5f5ff;
|
|
||||||
}
|
|
||||||
#jump_page .source:first-child {
|
|
||||||
}
|
|
||||||
div.docs {
|
|
||||||
float: left;
|
|
||||||
max-width: 500px;
|
|
||||||
min-width: 500px;
|
|
||||||
min-height: 5px;
|
|
||||||
padding: 10px 25px 1px 50px;
|
|
||||||
vertical-align: top;
|
|
||||||
text-align: left;
|
|
||||||
}
|
|
||||||
.docs pre {
|
|
||||||
margin: 15px 0 15px;
|
|
||||||
padding-left: 15px;
|
|
||||||
}
|
|
||||||
.docs p tt, .docs p code {
|
|
||||||
background: #f8f8ff;
|
|
||||||
border: 1px solid #dedede;
|
|
||||||
font-size: 12px;
|
|
||||||
padding: 0 0.2em;
|
|
||||||
}
|
|
||||||
.octowrap {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.octothorpe {
|
|
||||||
font: 12px Arial;
|
|
||||||
text-decoration: none;
|
|
||||||
color: #454545;
|
|
||||||
position: absolute;
|
|
||||||
top: 3px; left: -20px;
|
|
||||||
padding: 1px 2px;
|
|
||||||
opacity: 0;
|
|
||||||
-webkit-transition: opacity 0.2s linear;
|
|
||||||
}
|
|
||||||
div.docs:hover .octothorpe {
|
|
||||||
opacity: 1;
|
|
||||||
}
|
|
||||||
div.code {
|
|
||||||
margin-left: 580px;
|
|
||||||
padding: 14px 15px 16px 50px;
|
|
||||||
vertical-align: top;
|
|
||||||
}
|
|
||||||
.code pre, .docs p code {
|
|
||||||
font-size: 12px;
|
|
||||||
}
|
|
||||||
pre, tt, code {
|
|
||||||
line-height: 18px;
|
|
||||||
font-family: Monaco, Consolas, "Lucida Console", monospace;
|
|
||||||
margin: 0; padding: 0;
|
|
||||||
}
|
|
||||||
div.clearall {
|
|
||||||
clear: both;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------- Syntax Highlighting -----------------------------*/
|
|
||||||
td.linenos { background-color: #f0f0f0; padding-right: 10px; }
|
|
||||||
span.lineno { background-color: #f0f0f0; padding: 0 5px 0 5px; }
|
|
||||||
body .hll { background-color: #ffffcc }
|
|
||||||
body .c { color: #408080; font-style: italic } /* Comment */
|
|
||||||
body .err { border: 1px solid #FF0000 } /* Error */
|
|
||||||
body .k { color: #954121 } /* Keyword */
|
|
||||||
body .o { color: #666666 } /* Operator */
|
|
||||||
body .cm { color: #408080; font-style: italic } /* Comment.Multiline */
|
|
||||||
body .cp { color: #BC7A00 } /* Comment.Preproc */
|
|
||||||
body .c1 { color: #408080; font-style: italic } /* Comment.Single */
|
|
||||||
body .cs { color: #408080; font-style: italic } /* Comment.Special */
|
|
||||||
body .gd { color: #A00000 } /* Generic.Deleted */
|
|
||||||
body .ge { font-style: italic } /* Generic.Emph */
|
|
||||||
body .gr { color: #FF0000 } /* Generic.Error */
|
|
||||||
body .gh { color: #000080; font-weight: bold } /* Generic.Heading */
|
|
||||||
body .gi { color: #00A000 } /* Generic.Inserted */
|
|
||||||
body .go { color: #808080 } /* Generic.Output */
|
|
||||||
body .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
|
|
||||||
body .gs { font-weight: bold } /* Generic.Strong */
|
|
||||||
body .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
|
|
||||||
body .gt { color: #0040D0 } /* Generic.Traceback */
|
|
||||||
body .kc { color: #954121 } /* Keyword.Constant */
|
|
||||||
body .kd { color: #954121; font-weight: bold } /* Keyword.Declaration */
|
|
||||||
body .kn { color: #954121; font-weight: bold } /* Keyword.Namespace */
|
|
||||||
body .kp { color: #954121 } /* Keyword.Pseudo */
|
|
||||||
body .kr { color: #954121; font-weight: bold } /* Keyword.Reserved */
|
|
||||||
body .kt { color: #B00040 } /* Keyword.Type */
|
|
||||||
body .m { color: #666666 } /* Literal.Number */
|
|
||||||
body .s { color: #219161 } /* Literal.String */
|
|
||||||
body .na { color: #7D9029 } /* Name.Attribute */
|
|
||||||
body .nb { color: #954121 } /* Name.Builtin */
|
|
||||||
body .nc { color: #0000FF; font-weight: bold } /* Name.Class */
|
|
||||||
body .no { color: #880000 } /* Name.Constant */
|
|
||||||
body .nd { color: #AA22FF } /* Name.Decorator */
|
|
||||||
body .ni { color: #999999; font-weight: bold } /* Name.Entity */
|
|
||||||
body .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
|
|
||||||
body .nf { color: #0000FF } /* Name.Function */
|
|
||||||
body .nl { color: #A0A000 } /* Name.Label */
|
|
||||||
body .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
|
|
||||||
body .nt { color: #954121; font-weight: bold } /* Name.Tag */
|
|
||||||
body .nv { color: #19469D } /* Name.Variable */
|
|
||||||
body .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
|
|
||||||
body .w { color: #bbbbbb } /* Text.Whitespace */
|
|
||||||
body .mf { color: #666666 } /* Literal.Number.Float */
|
|
||||||
body .mh { color: #666666 } /* Literal.Number.Hex */
|
|
||||||
body .mi { color: #666666 } /* Literal.Number.Integer */
|
|
||||||
body .mo { color: #666666 } /* Literal.Number.Oct */
|
|
||||||
body .sb { color: #219161 } /* Literal.String.Backtick */
|
|
||||||
body .sc { color: #219161 } /* Literal.String.Char */
|
|
||||||
body .sd { color: #219161; font-style: italic } /* Literal.String.Doc */
|
|
||||||
body .s2 { color: #219161 } /* Literal.String.Double */
|
|
||||||
body .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
|
|
||||||
body .sh { color: #219161 } /* Literal.String.Heredoc */
|
|
||||||
body .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
|
|
||||||
body .sx { color: #954121 } /* Literal.String.Other */
|
|
||||||
body .sr { color: #BB6688 } /* Literal.String.Regex */
|
|
||||||
body .s1 { color: #219161 } /* Literal.String.Single */
|
|
||||||
body .ss { color: #19469D } /* Literal.String.Symbol */
|
|
||||||
body .bp { color: #954121 } /* Name.Builtin.Pseudo */
|
|
||||||
body .vc { color: #19469D } /* Name.Variable.Class */
|
|
||||||
body .vg { color: #19469D } /* Name.Variable.Global */
|
|
||||||
body .vi { color: #19469D } /* Name.Variable.Instance */
|
|
||||||
body .il { color: #666666 } /* Literal.Number.Integer.Long */
|
|
|
@ -1,17 +0,0 @@
|
||||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
||||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" xmlns:tal="http://xml.zope.org/namespaces/tal">
|
|
||||||
<head>
|
|
||||||
<title>Jasmine Spec Runner</title>
|
|
||||||
|
|
||||||
<link rel="stylesheet" type="text/css" href="./vendor/jasmine/jasmine.css"/>
|
|
||||||
<script src="./vendor/jquery.js"></script>
|
|
||||||
<script src="../burry.js"></script>
|
|
||||||
<script src="./vendor/jasmine/jasmine.js"></script>
|
|
||||||
<script src="./vendor/jasmine/jasmine-html.js"></script>
|
|
||||||
<script src="./specs/burry_spec.js"></script>
|
|
||||||
<script type="text/javascript" src="./index.js"></script>
|
|
||||||
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -1,14 +0,0 @@
|
||||||
/*globals jasmine:false */
|
|
||||||
|
|
||||||
(function ($) {
|
|
||||||
$(function () {
|
|
||||||
var jasmineEnv = jasmine.getEnv();
|
|
||||||
jasmineEnv.updateInterval = 1000;
|
|
||||||
var htmlReporter = new jasmine.HtmlReporter();
|
|
||||||
jasmineEnv.addReporter(htmlReporter);
|
|
||||||
jasmineEnv.specFilter = function(spec) {
|
|
||||||
return htmlReporter.specFilter(spec);
|
|
||||||
};
|
|
||||||
jasmineEnv.execute();
|
|
||||||
});
|
|
||||||
})(this.jQuery);
|
|
|
@ -1,244 +0,0 @@
|
||||||
(function (Burry) {
|
|
||||||
|
|
||||||
describe('burry.js Storage', function () {
|
|
||||||
|
|
||||||
afterEach(function () {
|
|
||||||
localStorage.clear();
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Static methods', function () {
|
|
||||||
|
|
||||||
it('returns the stores that have been created', function () {
|
|
||||||
var burryfoo, burrybar;
|
|
||||||
burryfoo = new Burry.Store('foo');
|
|
||||||
burrybar = new Burry.Store('bar');
|
|
||||||
burrybar2 = new Burry.Store('bar');
|
|
||||||
expect(Burry.stores()).toEqual(['', 'foo', 'bar']);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('calculates time elapsed since epoch in minutues', function () {
|
|
||||||
var datea = new Date(10 * 60 * 1000);
|
|
||||||
spyOn(window, 'Date').andReturn(datea);
|
|
||||||
expect(Burry._mEpoch()).toEqual(10);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('supports localStorage', function () {
|
|
||||||
expect(Burry.isSupported()).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('flushes expired key/values from all stores', function () {
|
|
||||||
burryfoo = new Burry.Store('foo');
|
|
||||||
burrybar = new Burry.Store('bar');
|
|
||||||
burryfoo.set('expired1', {foo: 'bar'}, -1);
|
|
||||||
burryfoo.set('expired2', {foo: 'bar'}, -2);
|
|
||||||
burryfoo.set('not-expired', {foo: 'bar'}, 10);
|
|
||||||
burrybar.set('expired1', {foo: 'bar'}, -1);
|
|
||||||
burrybar.set('expired2', {foo: 'bar'}, -2);
|
|
||||||
burrybar.set('not-expired', {foo: 'bar'}, 10);
|
|
||||||
Burry.flushExpired();
|
|
||||||
expect(localStorage.getItem(burryfoo._internalKey('expired1'))).toBeNull();
|
|
||||||
expect(localStorage.getItem(burryfoo._expirationKey('expired1'))).toBeNull();
|
|
||||||
expect(localStorage.getItem(burryfoo._internalKey('expired2'))).toBeNull();
|
|
||||||
expect(localStorage.getItem(burryfoo._expirationKey('expired2'))).toBeNull();
|
|
||||||
expect(burryfoo.get('not-expired')).toBeDefined();
|
|
||||||
expect(localStorage.getItem(burrybar._internalKey('expired1'))).toBeNull();
|
|
||||||
expect(localStorage.getItem(burrybar._expirationKey('expired1'))).toBeNull();
|
|
||||||
expect(localStorage.getItem(burrybar._internalKey('expired2'))).toBeNull();
|
|
||||||
expect(localStorage.getItem(burrybar._expirationKey('expired2'))).toBeNull();
|
|
||||||
expect(burrybar.get('not-expired')).toBeDefined();
|
|
||||||
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Instance methods', function () {
|
|
||||||
|
|
||||||
var burry;
|
|
||||||
|
|
||||||
beforeEach(function () {
|
|
||||||
burry = new Burry.Store('');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('allows to set a default ttl', function () {
|
|
||||||
burry = new Burry.Store('', 10);
|
|
||||||
burry.set('akey', {foo: 'bar'});
|
|
||||||
expect(localStorage.getItem('akey-_burry_')).toEqual('{"foo":"bar"}');
|
|
||||||
expect(parseInt(localStorage.getItem('akey-_burry_exp_'), 10)).toEqual(Burry._mEpoch() + 10);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('calculates the key used internally', function () {
|
|
||||||
expect(burry._internalKey('akey')).toEqual('akey-_burry_');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('calculates the expiration key used internally', function () {
|
|
||||||
expect(burry._expirationKey(12345)).toEqual('12345-_burry_exp_');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('decides whether a key is a "burry" key', function () {
|
|
||||||
expect(burry._isInternalKey('foo-_burry_')).toEqual('foo');
|
|
||||||
expect(burry._isInternalKey('foo-_burry_bar')).toBeFalsy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('decides whether a key is a "burry" expiration key', function () {
|
|
||||||
expect(burry._isExpirationKey('foo-_burry_exp_')).toEqual('foo');
|
|
||||||
expect(burry._isExpirationKey('foo-_burry_exp_bar')).toBeFalsy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('applies correctly the namespace on the keys on construction', function () {
|
|
||||||
var nsburry = new Burry.Store('testing');
|
|
||||||
expect(nsburry._isInternalKey('foo-_burry_testing')).toEqual('foo');
|
|
||||||
expect(nsburry._isInternalKey('foo-_burry_')).toBeFalsy();
|
|
||||||
expect(nsburry._isExpirationKey('foo-_burry_exp_testing')).toEqual('foo');
|
|
||||||
expect(nsburry._isExpirationKey('foo-_burry_exp_')).toBeFalsy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('stores a key/value to localStorage', function () {
|
|
||||||
burry.set('akey', {foo: 'bar'});
|
|
||||||
expect(localStorage.getItem('akey-_burry_')).toEqual('{"foo":"bar"}');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('stores a key/value to localStorage with an expiration time', function () {
|
|
||||||
burry.set('akey', {foo: 'bar'}, 10);
|
|
||||||
expect(localStorage.getItem('akey-_burry_')).toEqual('{"foo":"bar"}');
|
|
||||||
expect(parseInt(localStorage.getItem('akey-_burry_exp_'), 10)).toEqual(Burry._mEpoch() + 10);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('returns the value from a stored key', function () {
|
|
||||||
burry.set('akey', {foo: 'bar'});
|
|
||||||
expect(burry.get('akey')).toEqual({foo: 'bar'});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('returns undefined for a non-existing key', function () {
|
|
||||||
expect(burry.get('akey')).toBeUndefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('returns undefined for an expired key, and removes it from localStorage', function () {
|
|
||||||
burry.set('akey', {foo: 'bar'}, -1);
|
|
||||||
expect(localStorage.getItem('akey-_burry_')).toEqual('{"foo":"bar"}');
|
|
||||||
expect(parseInt(localStorage.getItem('akey-_burry_exp_'), 10)).toEqual(Burry._mEpoch() - 1);
|
|
||||||
expect(burry.get('akey')).toBeUndefined();
|
|
||||||
expect(localStorage.getItem('akey-_burry_')).toBeNull();
|
|
||||||
expect(localStorage.getItem('akey-_burry_exp_')).toBeNull();
|
|
||||||
expect(burry.get('akey')).toBeUndefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('adds a key/value when the key does not already exist or has expired', function () {
|
|
||||||
burry.set('akey', {foo: 'bar'});
|
|
||||||
burry.add('akey', {bar: 'foo'});
|
|
||||||
expect(burry.get('akey')).toEqual({foo: 'bar'});
|
|
||||||
burry.add('otherkey', {foo: 'bar'});
|
|
||||||
expect(burry.get('otherkey')).toEqual({foo: 'bar'});
|
|
||||||
burry.set('akey', {foo: 'bar'}, -10);
|
|
||||||
burry.add('akey', {bar: 'foo'});
|
|
||||||
expect(burry.get('akey')).toEqual({bar: 'foo'});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('replaces a key/value only when the key already exists and has not expired', function () {
|
|
||||||
burry.set('akey', {foo: 'bar'});
|
|
||||||
burry.replace('akey', {bar: 'foo'});
|
|
||||||
expect(burry.get('akey')).toEqual({bar: 'foo'});
|
|
||||||
burry.replace('otherkey', {foo: 'bar'});
|
|
||||||
expect(burry.get('otherkey')).not.toBeDefined();
|
|
||||||
burry.set('akey', {foo: 'bar'}, -10);
|
|
||||||
burry.replace('akey', {bar: 'foo'});
|
|
||||||
expect(burry.get('akey')).not.toBeDefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('removes a key/value', function () {
|
|
||||||
burry.set('akey', {foo: 'bar'});
|
|
||||||
burry.remove('akey');
|
|
||||||
expect(burry.get('akey')).toBeUndefined();
|
|
||||||
expect(localStorage.getItem('akey-_burry_')).toBeNull();
|
|
||||||
expect(localStorage.getItem('akey-_burry_exp_')).toBeNull();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('increments a counter', function () {
|
|
||||||
burry.incr('counter');
|
|
||||||
expect(burry.get('counter')).toEqual(1);
|
|
||||||
burry.set('counter', 0);
|
|
||||||
burry.incr('counter');
|
|
||||||
burry.incr('counter');
|
|
||||||
expect(burry.get('counter')).toEqual(2);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('decrements a counter', function () {
|
|
||||||
burry.decr('counter');
|
|
||||||
expect(burry.get('counter')).toEqual(-1);
|
|
||||||
burry.set('counter', 0);
|
|
||||||
burry.decr('counter');
|
|
||||||
burry.decr('counter');
|
|
||||||
expect(burry.get('counter')).toEqual(-2);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('determines if an item has expired', function () {
|
|
||||||
burry.set('akey', {foo: 'bar'});
|
|
||||||
expect(burry.hasExpired('akey')).toBeFalsy();
|
|
||||||
burry.set('akey', {foo: 'bar'}, 10);
|
|
||||||
expect(burry.hasExpired('akey')).toBeFalsy();
|
|
||||||
burry.set('akey', {foo: 'bar'}, -10);
|
|
||||||
expect(burry.hasExpired('akey')).toBeTruthy();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('returns all cache keys', function () {
|
|
||||||
var keys;
|
|
||||||
burry.set('expirable1', {foo: 'bar'}, 10);
|
|
||||||
burry.set('expirable2', {foo: 'bar'}, -20);
|
|
||||||
burry.set('non-expirable', {foo: 'bar'});
|
|
||||||
expect(burry.keys().indexOf('expirable1')).not.toEqual(-1);
|
|
||||||
expect(burry.keys().indexOf('expirable2')).not.toEqual(-1);
|
|
||||||
expect(burry.keys().indexOf('non-expirable')).not.toEqual(-1);
|
|
||||||
|
|
||||||
});
|
|
||||||
|
|
||||||
it('returns all expirable keys', function () {
|
|
||||||
var expirable, fakedate = new Date(0);
|
|
||||||
spyOn(window, 'Date').andReturn(fakedate);
|
|
||||||
burry.set('expirable1', {foo: 'bar'}, 10);
|
|
||||||
burry.set('expirable2', {foo: 'bar'}, 20);
|
|
||||||
burry.set('non-expirable', {foo: 'bar'});
|
|
||||||
expect(burry.expirableKeys()).toEqual({expirable1: 10, expirable2: 20});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('flushes all Burry items', function () {
|
|
||||||
burry.set('expirable2', {foo: 'bar'}, 20);
|
|
||||||
burry.set('non-expirable', {foo: 'bar'});
|
|
||||||
localStorage.setItem('foo', 'bar');
|
|
||||||
burry.flush();
|
|
||||||
expect(localStorage.length).toEqual(2);
|
|
||||||
expect(localStorage.key(0)).toEqual('_burry_stores_');
|
|
||||||
expect(localStorage.key(1)).toEqual('foo');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('flushes expired key/values', function () {
|
|
||||||
burry.set('expired1', {foo: 'bar'}, -1);
|
|
||||||
burry.set('expired2', {foo: 'bar'}, -2);
|
|
||||||
burry.set('not-expired', {foo: 'bar'}, 10);
|
|
||||||
burry.flushExpired();
|
|
||||||
expect(localStorage.getItem(burry._internalKey('expired1'))).toBeNull();
|
|
||||||
expect(localStorage.getItem(burry._expirationKey('expired1'))).toBeNull();
|
|
||||||
expect(localStorage.getItem(burry._internalKey('expired2'))).toBeNull();
|
|
||||||
expect(localStorage.getItem(burry._expirationKey('expired2'))).toBeNull();
|
|
||||||
expect(burry.get('not-expired')).toBeDefined();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('removes expired objects when setting a value that does not fit in localStorage', function () {
|
|
||||||
var biggie = Array(1024*1024 + 1).join('0'),
|
|
||||||
key = '';
|
|
||||||
while (true) {
|
|
||||||
try {
|
|
||||||
key += 'key';
|
|
||||||
localStorage.setItem(burry._internalKey(key), JSON.stringify(biggie));
|
|
||||||
localStorage.setItem(burry._expirationKey(key), '0');
|
|
||||||
} catch (e) {
|
|
||||||
// The storage is now full.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
expect(localStorage.length > 0).toBeTruthy();
|
|
||||||
burry.set('biggie', biggie);
|
|
||||||
expect(localStorage.length).toEqual(2);
|
|
||||||
expect(burry.get('biggie')).toEqual(biggie);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
})(this.Burry);
|
|
|
@ -1,20 +0,0 @@
|
||||||
Copyright (c) 2008-2011 Pivotal Labs
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
@ -1,616 +0,0 @@
|
||||||
jasmine.HtmlReporterHelpers = {};
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.createDom = function(type, attrs, childrenVarArgs) {
|
|
||||||
var el = document.createElement(type);
|
|
||||||
|
|
||||||
for (var i = 2; i < arguments.length; i++) {
|
|
||||||
var child = arguments[i];
|
|
||||||
|
|
||||||
if (typeof child === 'string') {
|
|
||||||
el.appendChild(document.createTextNode(child));
|
|
||||||
} else {
|
|
||||||
if (child) {
|
|
||||||
el.appendChild(child);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var attr in attrs) {
|
|
||||||
if (attr == "className") {
|
|
||||||
el[attr] = attrs[attr];
|
|
||||||
} else {
|
|
||||||
el.setAttribute(attr, attrs[attr]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return el;
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.getSpecStatus = function(child) {
|
|
||||||
var results = child.results();
|
|
||||||
var status = results.passed() ? 'passed' : 'failed';
|
|
||||||
if (results.skipped) {
|
|
||||||
status = 'skipped';
|
|
||||||
}
|
|
||||||
|
|
||||||
return status;
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.appendToSummary = function(child, childElement) {
|
|
||||||
var parentDiv = this.dom.summary;
|
|
||||||
var parentSuite = (typeof child.parentSuite == 'undefined') ? 'suite' : 'parentSuite';
|
|
||||||
var parent = child[parentSuite];
|
|
||||||
|
|
||||||
if (parent) {
|
|
||||||
if (typeof this.views.suites[parent.id] == 'undefined') {
|
|
||||||
this.views.suites[parent.id] = new jasmine.HtmlReporter.SuiteView(parent, this.dom, this.views);
|
|
||||||
}
|
|
||||||
parentDiv = this.views.suites[parent.id].element;
|
|
||||||
}
|
|
||||||
|
|
||||||
parentDiv.appendChild(childElement);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.addHelpers = function(ctor) {
|
|
||||||
for(var fn in jasmine.HtmlReporterHelpers) {
|
|
||||||
ctor.prototype[fn] = jasmine.HtmlReporterHelpers[fn];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter = function(_doc) {
|
|
||||||
var self = this;
|
|
||||||
var doc = _doc || window.document;
|
|
||||||
|
|
||||||
var reporterView;
|
|
||||||
|
|
||||||
var dom = {};
|
|
||||||
|
|
||||||
// Jasmine Reporter Public Interface
|
|
||||||
self.logRunningSpecs = false;
|
|
||||||
|
|
||||||
self.reportRunnerStarting = function(runner) {
|
|
||||||
var specs = runner.specs() || [];
|
|
||||||
|
|
||||||
if (specs.length == 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
createReporterDom(runner.env.versionString());
|
|
||||||
doc.body.appendChild(dom.reporter);
|
|
||||||
|
|
||||||
reporterView = new jasmine.HtmlReporter.ReporterView(dom);
|
|
||||||
reporterView.addSpecs(specs, self.specFilter);
|
|
||||||
};
|
|
||||||
|
|
||||||
self.reportRunnerResults = function(runner) {
|
|
||||||
reporterView && reporterView.complete();
|
|
||||||
};
|
|
||||||
|
|
||||||
self.reportSuiteResults = function(suite) {
|
|
||||||
reporterView.suiteComplete(suite);
|
|
||||||
};
|
|
||||||
|
|
||||||
self.reportSpecStarting = function(spec) {
|
|
||||||
if (self.logRunningSpecs) {
|
|
||||||
self.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
self.reportSpecResults = function(spec) {
|
|
||||||
reporterView.specComplete(spec);
|
|
||||||
};
|
|
||||||
|
|
||||||
self.log = function() {
|
|
||||||
var console = jasmine.getGlobal().console;
|
|
||||||
if (console && console.log) {
|
|
||||||
if (console.log.apply) {
|
|
||||||
console.log.apply(console, arguments);
|
|
||||||
} else {
|
|
||||||
console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
self.specFilter = function(spec) {
|
|
||||||
if (!focusedSpecName()) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return spec.getFullName().indexOf(focusedSpecName()) === 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
return self;
|
|
||||||
|
|
||||||
function focusedSpecName() {
|
|
||||||
var specName;
|
|
||||||
|
|
||||||
(function memoizeFocusedSpec() {
|
|
||||||
if (specName) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var paramMap = [];
|
|
||||||
var params = doc.location.search.substring(1).split('&');
|
|
||||||
|
|
||||||
for (var i = 0; i < params.length; i++) {
|
|
||||||
var p = params[i].split('=');
|
|
||||||
paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
specName = paramMap.spec;
|
|
||||||
})();
|
|
||||||
|
|
||||||
return specName;
|
|
||||||
}
|
|
||||||
|
|
||||||
function createReporterDom(version) {
|
|
||||||
dom.reporter = self.createDom('div', { id: 'HTMLReporter', className: 'jasmine_reporter' },
|
|
||||||
dom.banner = self.createDom('div', { className: 'banner' },
|
|
||||||
self.createDom('span', { className: 'title' }, "Jasmine "),
|
|
||||||
self.createDom('span', { className: 'version' }, version)),
|
|
||||||
|
|
||||||
dom.symbolSummary = self.createDom('ul', {className: 'symbolSummary'}),
|
|
||||||
dom.alert = self.createDom('div', {className: 'alert'}),
|
|
||||||
dom.results = self.createDom('div', {className: 'results'},
|
|
||||||
dom.summary = self.createDom('div', { className: 'summary' }),
|
|
||||||
dom.details = self.createDom('div', { id: 'details' }))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter);jasmine.HtmlReporter.ReporterView = function(dom) {
|
|
||||||
this.startedAt = new Date();
|
|
||||||
this.runningSpecCount = 0;
|
|
||||||
this.completeSpecCount = 0;
|
|
||||||
this.passedCount = 0;
|
|
||||||
this.failedCount = 0;
|
|
||||||
this.skippedCount = 0;
|
|
||||||
|
|
||||||
this.createResultsMenu = function() {
|
|
||||||
this.resultsMenu = this.createDom('span', {className: 'resultsMenu bar'},
|
|
||||||
this.summaryMenuItem = this.createDom('a', {className: 'summaryMenuItem', href: "#"}, '0 specs'),
|
|
||||||
' | ',
|
|
||||||
this.detailsMenuItem = this.createDom('a', {className: 'detailsMenuItem', href: "#"}, '0 failing'));
|
|
||||||
|
|
||||||
this.summaryMenuItem.onclick = function() {
|
|
||||||
dom.reporter.className = dom.reporter.className.replace(/ showDetails/g, '');
|
|
||||||
};
|
|
||||||
|
|
||||||
this.detailsMenuItem.onclick = function() {
|
|
||||||
showDetails();
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
this.addSpecs = function(specs, specFilter) {
|
|
||||||
this.totalSpecCount = specs.length;
|
|
||||||
|
|
||||||
this.views = {
|
|
||||||
specs: {},
|
|
||||||
suites: {}
|
|
||||||
};
|
|
||||||
|
|
||||||
for (var i = 0; i < specs.length; i++) {
|
|
||||||
var spec = specs[i];
|
|
||||||
this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom, this.views);
|
|
||||||
if (specFilter(spec)) {
|
|
||||||
this.runningSpecCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
this.specComplete = function(spec) {
|
|
||||||
this.completeSpecCount++;
|
|
||||||
|
|
||||||
if (isUndefined(this.views.specs[spec.id])) {
|
|
||||||
this.views.specs[spec.id] = new jasmine.HtmlReporter.SpecView(spec, dom);
|
|
||||||
}
|
|
||||||
|
|
||||||
var specView = this.views.specs[spec.id];
|
|
||||||
|
|
||||||
switch (specView.status()) {
|
|
||||||
case 'passed':
|
|
||||||
this.passedCount++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'failed':
|
|
||||||
this.failedCount++;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'skipped':
|
|
||||||
this.skippedCount++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
specView.refresh();
|
|
||||||
this.refresh();
|
|
||||||
};
|
|
||||||
|
|
||||||
this.suiteComplete = function(suite) {
|
|
||||||
var suiteView = this.views.suites[suite.id];
|
|
||||||
if (isUndefined(suiteView)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
suiteView.refresh();
|
|
||||||
};
|
|
||||||
|
|
||||||
this.refresh = function() {
|
|
||||||
|
|
||||||
if (isUndefined(this.resultsMenu)) {
|
|
||||||
this.createResultsMenu();
|
|
||||||
}
|
|
||||||
|
|
||||||
// currently running UI
|
|
||||||
if (isUndefined(this.runningAlert)) {
|
|
||||||
this.runningAlert = this.createDom('a', {href: "?", className: "runningAlert bar"});
|
|
||||||
dom.alert.appendChild(this.runningAlert);
|
|
||||||
}
|
|
||||||
this.runningAlert.innerHTML = "Running " + this.completeSpecCount + " of " + specPluralizedFor(this.totalSpecCount);
|
|
||||||
|
|
||||||
// skipped specs UI
|
|
||||||
if (isUndefined(this.skippedAlert)) {
|
|
||||||
this.skippedAlert = this.createDom('a', {href: "?", className: "skippedAlert bar"});
|
|
||||||
}
|
|
||||||
|
|
||||||
this.skippedAlert.innerHTML = "Skipping " + this.skippedCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
|
|
||||||
|
|
||||||
if (this.skippedCount === 1 && isDefined(dom.alert)) {
|
|
||||||
dom.alert.appendChild(this.skippedAlert);
|
|
||||||
}
|
|
||||||
|
|
||||||
// passing specs UI
|
|
||||||
if (isUndefined(this.passedAlert)) {
|
|
||||||
this.passedAlert = this.createDom('span', {href: "?", className: "passingAlert bar"});
|
|
||||||
}
|
|
||||||
this.passedAlert.innerHTML = "Passing " + specPluralizedFor(this.passedCount);
|
|
||||||
|
|
||||||
// failing specs UI
|
|
||||||
if (isUndefined(this.failedAlert)) {
|
|
||||||
this.failedAlert = this.createDom('span', {href: "?", className: "failingAlert bar"});
|
|
||||||
}
|
|
||||||
this.failedAlert.innerHTML = "Failing " + specPluralizedFor(this.failedCount);
|
|
||||||
|
|
||||||
if (this.failedCount === 1 && isDefined(dom.alert)) {
|
|
||||||
dom.alert.appendChild(this.failedAlert);
|
|
||||||
dom.alert.appendChild(this.resultsMenu);
|
|
||||||
}
|
|
||||||
|
|
||||||
// summary info
|
|
||||||
this.summaryMenuItem.innerHTML = "" + specPluralizedFor(this.runningSpecCount);
|
|
||||||
this.detailsMenuItem.innerHTML = "" + this.failedCount + " failing";
|
|
||||||
};
|
|
||||||
|
|
||||||
this.complete = function() {
|
|
||||||
dom.alert.removeChild(this.runningAlert);
|
|
||||||
|
|
||||||
this.skippedAlert.innerHTML = "Ran " + this.runningSpecCount + " of " + specPluralizedFor(this.totalSpecCount) + " - run all";
|
|
||||||
|
|
||||||
if (this.failedCount === 0) {
|
|
||||||
dom.alert.appendChild(this.createDom('span', {className: 'passingAlert bar'}, "Passing " + specPluralizedFor(this.passedCount)));
|
|
||||||
} else {
|
|
||||||
showDetails();
|
|
||||||
}
|
|
||||||
|
|
||||||
dom.banner.appendChild(this.createDom('span', {className: 'duration'}, "finished in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s"));
|
|
||||||
};
|
|
||||||
|
|
||||||
return this;
|
|
||||||
|
|
||||||
function showDetails() {
|
|
||||||
if (dom.reporter.className.search(/showDetails/) === -1) {
|
|
||||||
dom.reporter.className += " showDetails";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function isUndefined(obj) {
|
|
||||||
return typeof obj === 'undefined';
|
|
||||||
}
|
|
||||||
|
|
||||||
function isDefined(obj) {
|
|
||||||
return !isUndefined(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
function specPluralizedFor(count) {
|
|
||||||
var str = count + " spec";
|
|
||||||
if (count > 1) {
|
|
||||||
str += "s"
|
|
||||||
}
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.ReporterView);
|
|
||||||
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SpecView = function(spec, dom, views) {
|
|
||||||
this.spec = spec;
|
|
||||||
this.dom = dom;
|
|
||||||
this.views = views;
|
|
||||||
|
|
||||||
this.symbol = this.createDom('li', { className: 'pending' });
|
|
||||||
this.dom.symbolSummary.appendChild(this.symbol);
|
|
||||||
|
|
||||||
this.summary = this.createDom('div', { className: 'specSummary' },
|
|
||||||
this.createDom('a', {
|
|
||||||
className: 'description',
|
|
||||||
href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
|
|
||||||
title: this.spec.getFullName()
|
|
||||||
}, this.spec.description)
|
|
||||||
);
|
|
||||||
|
|
||||||
this.detail = this.createDom('div', { className: 'specDetail' },
|
|
||||||
this.createDom('a', {
|
|
||||||
className: 'description',
|
|
||||||
href: '?spec=' + encodeURIComponent(this.spec.getFullName()),
|
|
||||||
title: this.spec.getFullName()
|
|
||||||
}, this.spec.getFullName())
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SpecView.prototype.status = function() {
|
|
||||||
return this.getSpecStatus(this.spec);
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SpecView.prototype.refresh = function() {
|
|
||||||
this.symbol.className = this.status();
|
|
||||||
|
|
||||||
switch (this.status()) {
|
|
||||||
case 'skipped':
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'passed':
|
|
||||||
this.appendSummaryToSuiteDiv();
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'failed':
|
|
||||||
this.appendSummaryToSuiteDiv();
|
|
||||||
this.appendFailureDetail();
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SpecView.prototype.appendSummaryToSuiteDiv = function() {
|
|
||||||
this.summary.className += ' ' + this.status();
|
|
||||||
this.appendToSummary(this.spec, this.summary);
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SpecView.prototype.appendFailureDetail = function() {
|
|
||||||
this.detail.className += ' ' + this.status();
|
|
||||||
|
|
||||||
var resultItems = this.spec.results().getItems();
|
|
||||||
var messagesDiv = this.createDom('div', { className: 'messages' });
|
|
||||||
|
|
||||||
for (var i = 0; i < resultItems.length; i++) {
|
|
||||||
var result = resultItems[i];
|
|
||||||
|
|
||||||
if (result.type == 'log') {
|
|
||||||
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
|
|
||||||
} else if (result.type == 'expect' && result.passed && !result.passed()) {
|
|
||||||
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
|
|
||||||
|
|
||||||
if (result.trace.stack) {
|
|
||||||
messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (messagesDiv.childNodes.length > 0) {
|
|
||||||
this.detail.appendChild(messagesDiv);
|
|
||||||
this.dom.details.appendChild(this.detail);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SpecView);jasmine.HtmlReporter.SuiteView = function(suite, dom, views) {
|
|
||||||
this.suite = suite;
|
|
||||||
this.dom = dom;
|
|
||||||
this.views = views;
|
|
||||||
|
|
||||||
this.element = this.createDom('div', { className: 'suite' },
|
|
||||||
this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(this.suite.getFullName()) }, this.suite.description)
|
|
||||||
);
|
|
||||||
|
|
||||||
this.appendToSummary(this.suite, this.element);
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SuiteView.prototype.status = function() {
|
|
||||||
return this.getSpecStatus(this.suite);
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporter.SuiteView.prototype.refresh = function() {
|
|
||||||
this.element.className += " " + this.status();
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.HtmlReporterHelpers.addHelpers(jasmine.HtmlReporter.SuiteView);
|
|
||||||
|
|
||||||
/* @deprecated Use jasmine.HtmlReporter instead
|
|
||||||
*/
|
|
||||||
jasmine.TrivialReporter = function(doc) {
|
|
||||||
this.document = doc || document;
|
|
||||||
this.suiteDivs = {};
|
|
||||||
this.logRunningSpecs = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.createDom = function(type, attrs, childrenVarArgs) {
|
|
||||||
var el = document.createElement(type);
|
|
||||||
|
|
||||||
for (var i = 2; i < arguments.length; i++) {
|
|
||||||
var child = arguments[i];
|
|
||||||
|
|
||||||
if (typeof child === 'string') {
|
|
||||||
el.appendChild(document.createTextNode(child));
|
|
||||||
} else {
|
|
||||||
if (child) { el.appendChild(child); }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var attr in attrs) {
|
|
||||||
if (attr == "className") {
|
|
||||||
el[attr] = attrs[attr];
|
|
||||||
} else {
|
|
||||||
el.setAttribute(attr, attrs[attr]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return el;
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.reportRunnerStarting = function(runner) {
|
|
||||||
var showPassed, showSkipped;
|
|
||||||
|
|
||||||
this.outerDiv = this.createDom('div', { id: 'TrivialReporter', className: 'jasmine_reporter' },
|
|
||||||
this.createDom('div', { className: 'banner' },
|
|
||||||
this.createDom('div', { className: 'logo' },
|
|
||||||
this.createDom('span', { className: 'title' }, "Jasmine"),
|
|
||||||
this.createDom('span', { className: 'version' }, runner.env.versionString())),
|
|
||||||
this.createDom('div', { className: 'options' },
|
|
||||||
"Show ",
|
|
||||||
showPassed = this.createDom('input', { id: "__jasmine_TrivialReporter_showPassed__", type: 'checkbox' }),
|
|
||||||
this.createDom('label', { "for": "__jasmine_TrivialReporter_showPassed__" }, " passed "),
|
|
||||||
showSkipped = this.createDom('input', { id: "__jasmine_TrivialReporter_showSkipped__", type: 'checkbox' }),
|
|
||||||
this.createDom('label', { "for": "__jasmine_TrivialReporter_showSkipped__" }, " skipped")
|
|
||||||
)
|
|
||||||
),
|
|
||||||
|
|
||||||
this.runnerDiv = this.createDom('div', { className: 'runner running' },
|
|
||||||
this.createDom('a', { className: 'run_spec', href: '?' }, "run all"),
|
|
||||||
this.runnerMessageSpan = this.createDom('span', {}, "Running..."),
|
|
||||||
this.finishedAtSpan = this.createDom('span', { className: 'finished-at' }, ""))
|
|
||||||
);
|
|
||||||
|
|
||||||
this.document.body.appendChild(this.outerDiv);
|
|
||||||
|
|
||||||
var suites = runner.suites();
|
|
||||||
for (var i = 0; i < suites.length; i++) {
|
|
||||||
var suite = suites[i];
|
|
||||||
var suiteDiv = this.createDom('div', { className: 'suite' },
|
|
||||||
this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, "run"),
|
|
||||||
this.createDom('a', { className: 'description', href: '?spec=' + encodeURIComponent(suite.getFullName()) }, suite.description));
|
|
||||||
this.suiteDivs[suite.id] = suiteDiv;
|
|
||||||
var parentDiv = this.outerDiv;
|
|
||||||
if (suite.parentSuite) {
|
|
||||||
parentDiv = this.suiteDivs[suite.parentSuite.id];
|
|
||||||
}
|
|
||||||
parentDiv.appendChild(suiteDiv);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.startedAt = new Date();
|
|
||||||
|
|
||||||
var self = this;
|
|
||||||
showPassed.onclick = function(evt) {
|
|
||||||
if (showPassed.checked) {
|
|
||||||
self.outerDiv.className += ' show-passed';
|
|
||||||
} else {
|
|
||||||
self.outerDiv.className = self.outerDiv.className.replace(/ show-passed/, '');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
showSkipped.onclick = function(evt) {
|
|
||||||
if (showSkipped.checked) {
|
|
||||||
self.outerDiv.className += ' show-skipped';
|
|
||||||
} else {
|
|
||||||
self.outerDiv.className = self.outerDiv.className.replace(/ show-skipped/, '');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.reportRunnerResults = function(runner) {
|
|
||||||
var results = runner.results();
|
|
||||||
var className = (results.failedCount > 0) ? "runner failed" : "runner passed";
|
|
||||||
this.runnerDiv.setAttribute("class", className);
|
|
||||||
//do it twice for IE
|
|
||||||
this.runnerDiv.setAttribute("className", className);
|
|
||||||
var specs = runner.specs();
|
|
||||||
var specCount = 0;
|
|
||||||
for (var i = 0; i < specs.length; i++) {
|
|
||||||
if (this.specFilter(specs[i])) {
|
|
||||||
specCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var message = "" + specCount + " spec" + (specCount == 1 ? "" : "s" ) + ", " + results.failedCount + " failure" + ((results.failedCount == 1) ? "" : "s");
|
|
||||||
message += " in " + ((new Date().getTime() - this.startedAt.getTime()) / 1000) + "s";
|
|
||||||
this.runnerMessageSpan.replaceChild(this.createDom('a', { className: 'description', href: '?'}, message), this.runnerMessageSpan.firstChild);
|
|
||||||
|
|
||||||
this.finishedAtSpan.appendChild(document.createTextNode("Finished at " + new Date().toString()));
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.reportSuiteResults = function(suite) {
|
|
||||||
var results = suite.results();
|
|
||||||
var status = results.passed() ? 'passed' : 'failed';
|
|
||||||
if (results.totalCount === 0) { // todo: change this to check results.skipped
|
|
||||||
status = 'skipped';
|
|
||||||
}
|
|
||||||
this.suiteDivs[suite.id].className += " " + status;
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.reportSpecStarting = function(spec) {
|
|
||||||
if (this.logRunningSpecs) {
|
|
||||||
this.log('>> Jasmine Running ' + spec.suite.description + ' ' + spec.description + '...');
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.reportSpecResults = function(spec) {
|
|
||||||
var results = spec.results();
|
|
||||||
var status = results.passed() ? 'passed' : 'failed';
|
|
||||||
if (results.skipped) {
|
|
||||||
status = 'skipped';
|
|
||||||
}
|
|
||||||
var specDiv = this.createDom('div', { className: 'spec ' + status },
|
|
||||||
this.createDom('a', { className: 'run_spec', href: '?spec=' + encodeURIComponent(spec.getFullName()) }, "run"),
|
|
||||||
this.createDom('a', {
|
|
||||||
className: 'description',
|
|
||||||
href: '?spec=' + encodeURIComponent(spec.getFullName()),
|
|
||||||
title: spec.getFullName()
|
|
||||||
}, spec.description));
|
|
||||||
|
|
||||||
|
|
||||||
var resultItems = results.getItems();
|
|
||||||
var messagesDiv = this.createDom('div', { className: 'messages' });
|
|
||||||
for (var i = 0; i < resultItems.length; i++) {
|
|
||||||
var result = resultItems[i];
|
|
||||||
|
|
||||||
if (result.type == 'log') {
|
|
||||||
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage log'}, result.toString()));
|
|
||||||
} else if (result.type == 'expect' && result.passed && !result.passed()) {
|
|
||||||
messagesDiv.appendChild(this.createDom('div', {className: 'resultMessage fail'}, result.message));
|
|
||||||
|
|
||||||
if (result.trace.stack) {
|
|
||||||
messagesDiv.appendChild(this.createDom('div', {className: 'stackTrace'}, result.trace.stack));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (messagesDiv.childNodes.length > 0) {
|
|
||||||
specDiv.appendChild(messagesDiv);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.suiteDivs[spec.suite.id].appendChild(specDiv);
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.log = function() {
|
|
||||||
var console = jasmine.getGlobal().console;
|
|
||||||
if (console && console.log) {
|
|
||||||
if (console.log.apply) {
|
|
||||||
console.log.apply(console, arguments);
|
|
||||||
} else {
|
|
||||||
console.log(arguments); // ie fix: console.log.apply doesn't exist on ie
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.getLocation = function() {
|
|
||||||
return this.document.location;
|
|
||||||
};
|
|
||||||
|
|
||||||
jasmine.TrivialReporter.prototype.specFilter = function(spec) {
|
|
||||||
var paramMap = {};
|
|
||||||
var params = this.getLocation().search.substring(1).split('&');
|
|
||||||
for (var i = 0; i < params.length; i++) {
|
|
||||||
var p = params[i].split('=');
|
|
||||||
paramMap[decodeURIComponent(p[0])] = decodeURIComponent(p[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!paramMap.spec) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return spec.getFullName().indexOf(paramMap.spec) === 0;
|
|
||||||
};
|
|
|
@ -1,81 +0,0 @@
|
||||||
body { background-color: #eeeeee; padding: 0; margin: 5px; overflow-y: scroll; }
|
|
||||||
|
|
||||||
#HTMLReporter { font-size: 11px; font-family: Monaco, "Lucida Console", monospace; line-height: 14px; color: #333333; }
|
|
||||||
#HTMLReporter a { text-decoration: none; }
|
|
||||||
#HTMLReporter a:hover { text-decoration: underline; }
|
|
||||||
#HTMLReporter p, #HTMLReporter h1, #HTMLReporter h2, #HTMLReporter h3, #HTMLReporter h4, #HTMLReporter h5, #HTMLReporter h6 { margin: 0; line-height: 14px; }
|
|
||||||
#HTMLReporter .banner, #HTMLReporter .symbolSummary, #HTMLReporter .summary, #HTMLReporter .resultMessage, #HTMLReporter .specDetail .description, #HTMLReporter .alert .bar, #HTMLReporter .stackTrace { padding-left: 9px; padding-right: 9px; }
|
|
||||||
#HTMLReporter #jasmine_content { position: fixed; right: 100%; }
|
|
||||||
#HTMLReporter .version { color: #aaaaaa; }
|
|
||||||
#HTMLReporter .banner { margin-top: 14px; }
|
|
||||||
#HTMLReporter .duration { color: #aaaaaa; float: right; }
|
|
||||||
#HTMLReporter .symbolSummary { overflow: hidden; *zoom: 1; margin: 14px 0; }
|
|
||||||
#HTMLReporter .symbolSummary li { display: block; float: left; height: 7px; width: 14px; margin-bottom: 7px; font-size: 16px; }
|
|
||||||
#HTMLReporter .symbolSummary li.passed { font-size: 14px; }
|
|
||||||
#HTMLReporter .symbolSummary li.passed:before { color: #5e7d00; content: "\02022"; }
|
|
||||||
#HTMLReporter .symbolSummary li.failed { line-height: 9px; }
|
|
||||||
#HTMLReporter .symbolSummary li.failed:before { color: #b03911; content: "x"; font-weight: bold; margin-left: -1px; }
|
|
||||||
#HTMLReporter .symbolSummary li.skipped { font-size: 14px; }
|
|
||||||
#HTMLReporter .symbolSummary li.skipped:before { color: #bababa; content: "\02022"; }
|
|
||||||
#HTMLReporter .symbolSummary li.pending { line-height: 11px; }
|
|
||||||
#HTMLReporter .symbolSummary li.pending:before { color: #aaaaaa; content: "-"; }
|
|
||||||
#HTMLReporter .bar { line-height: 28px; font-size: 14px; display: block; color: #eee; }
|
|
||||||
#HTMLReporter .runningAlert { background-color: #666666; }
|
|
||||||
#HTMLReporter .skippedAlert { background-color: #aaaaaa; }
|
|
||||||
#HTMLReporter .skippedAlert:first-child { background-color: #333333; }
|
|
||||||
#HTMLReporter .skippedAlert:hover { text-decoration: none; color: white; text-decoration: underline; }
|
|
||||||
#HTMLReporter .passingAlert { background-color: #a6b779; }
|
|
||||||
#HTMLReporter .passingAlert:first-child { background-color: #5e7d00; }
|
|
||||||
#HTMLReporter .failingAlert { background-color: #cf867e; }
|
|
||||||
#HTMLReporter .failingAlert:first-child { background-color: #b03911; }
|
|
||||||
#HTMLReporter .results { margin-top: 14px; }
|
|
||||||
#HTMLReporter #details { display: none; }
|
|
||||||
#HTMLReporter .resultsMenu, #HTMLReporter .resultsMenu a { background-color: #fff; color: #333333; }
|
|
||||||
#HTMLReporter.showDetails .summaryMenuItem { font-weight: normal; text-decoration: inherit; }
|
|
||||||
#HTMLReporter.showDetails .summaryMenuItem:hover { text-decoration: underline; }
|
|
||||||
#HTMLReporter.showDetails .detailsMenuItem { font-weight: bold; text-decoration: underline; }
|
|
||||||
#HTMLReporter.showDetails .summary { display: none; }
|
|
||||||
#HTMLReporter.showDetails #details { display: block; }
|
|
||||||
#HTMLReporter .summaryMenuItem { font-weight: bold; text-decoration: underline; }
|
|
||||||
#HTMLReporter .summary { margin-top: 14px; }
|
|
||||||
#HTMLReporter .summary .suite .suite, #HTMLReporter .summary .specSummary { margin-left: 14px; }
|
|
||||||
#HTMLReporter .summary .specSummary.passed a { color: #5e7d00; }
|
|
||||||
#HTMLReporter .summary .specSummary.failed a { color: #b03911; }
|
|
||||||
#HTMLReporter .description + .suite { margin-top: 0; }
|
|
||||||
#HTMLReporter .suite { margin-top: 14px; }
|
|
||||||
#HTMLReporter .suite a { color: #333333; }
|
|
||||||
#HTMLReporter #details .specDetail { margin-bottom: 28px; }
|
|
||||||
#HTMLReporter #details .specDetail .description { display: block; color: white; background-color: #b03911; }
|
|
||||||
#HTMLReporter .resultMessage { padding-top: 14px; color: #333333; }
|
|
||||||
#HTMLReporter .resultMessage span.result { display: block; }
|
|
||||||
#HTMLReporter .stackTrace { margin: 5px 0 0 0; max-height: 224px; overflow: auto; line-height: 18px; color: #666666; border: 1px solid #ddd; background: white; white-space: pre; }
|
|
||||||
|
|
||||||
#TrivialReporter { padding: 8px 13px; position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow-y: scroll; background-color: white; font-family: "Helvetica Neue Light", "Lucida Grande", "Calibri", "Arial", sans-serif; /*.resultMessage {*/ /*white-space: pre;*/ /*}*/ }
|
|
||||||
#TrivialReporter a:visited, #TrivialReporter a { color: #303; }
|
|
||||||
#TrivialReporter a:hover, #TrivialReporter a:active { color: blue; }
|
|
||||||
#TrivialReporter .run_spec { float: right; padding-right: 5px; font-size: .8em; text-decoration: none; }
|
|
||||||
#TrivialReporter .banner { color: #303; background-color: #fef; padding: 5px; }
|
|
||||||
#TrivialReporter .logo { float: left; font-size: 1.1em; padding-left: 5px; }
|
|
||||||
#TrivialReporter .logo .version { font-size: .6em; padding-left: 1em; }
|
|
||||||
#TrivialReporter .runner.running { background-color: yellow; }
|
|
||||||
#TrivialReporter .options { text-align: right; font-size: .8em; }
|
|
||||||
#TrivialReporter .suite { border: 1px outset gray; margin: 5px 0; padding-left: 1em; }
|
|
||||||
#TrivialReporter .suite .suite { margin: 5px; }
|
|
||||||
#TrivialReporter .suite.passed { background-color: #dfd; }
|
|
||||||
#TrivialReporter .suite.failed { background-color: #fdd; }
|
|
||||||
#TrivialReporter .spec { margin: 5px; padding-left: 1em; clear: both; }
|
|
||||||
#TrivialReporter .spec.failed, #TrivialReporter .spec.passed, #TrivialReporter .spec.skipped { padding-bottom: 5px; border: 1px solid gray; }
|
|
||||||
#TrivialReporter .spec.failed { background-color: #fbb; border-color: red; }
|
|
||||||
#TrivialReporter .spec.passed { background-color: #bfb; border-color: green; }
|
|
||||||
#TrivialReporter .spec.skipped { background-color: #bbb; }
|
|
||||||
#TrivialReporter .messages { border-left: 1px dashed gray; padding-left: 1em; padding-right: 1em; }
|
|
||||||
#TrivialReporter .passed { background-color: #cfc; display: none; }
|
|
||||||
#TrivialReporter .failed { background-color: #fbb; }
|
|
||||||
#TrivialReporter .skipped { color: #777; background-color: #eee; display: none; }
|
|
||||||
#TrivialReporter .resultMessage span.result { display: block; line-height: 2em; color: black; }
|
|
||||||
#TrivialReporter .resultMessage .mismatch { color: black; }
|
|
||||||
#TrivialReporter .stackTrace { white-space: pre; font-size: .8em; margin-left: 10px; max-height: 5em; overflow: auto; border: 1px inset red; padding: 1em; background: #eef; }
|
|
||||||
#TrivialReporter .finished-at { padding-left: 1em; font-size: .6em; }
|
|
||||||
#TrivialReporter.show-passed .passed, #TrivialReporter.show-skipped .skipped { display: block; }
|
|
||||||
#TrivialReporter #jasmine_content { position: fixed; right: 100%; }
|
|
||||||
#TrivialReporter .runner { border: 1px solid gray; display: block; margin: 5px 0; padding: 2px 0 2px 10px; }
|
|
2529
Libraries/burry.js/tests/vendor/jasmine/jasmine.js
vendored
2529
Libraries/burry.js/tests/vendor/jasmine/jasmine.js
vendored
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Before Width: | Height: | Size: 905 B |
9404
Libraries/burry.js/tests/vendor/jquery.js
vendored
9404
Libraries/burry.js/tests/vendor/jquery.js
vendored
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user