oojspec 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/assets/javascripts/oojspec/runner.js.coffee +14 -7
- data/lib/oojspec/version.rb +1 -1
- data/vendor/assets/javascripts/buster/all.js.coffee +2 -0
- data/vendor/assets/javascripts/buster/bane.js +174 -0
- data/vendor/assets/javascripts/buster/buster-core.js +6 -5
- data/vendor/assets/javascripts/buster/expect.js +39 -35
- data/vendor/assets/javascripts/buster/formatio.js +215 -0
- data/vendor/assets/javascripts/buster/lodash.js +5163 -0
- data/vendor/assets/javascripts/buster/referee.js +692 -0
- data/vendor/assets/javascripts/buster/samsam.js +399 -0
- metadata +8 -5
- data/vendor/assets/javascripts/buster/buster-assertions.js +0 -782
- data/vendor/assets/javascripts/buster/buster-format.js +0 -199
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3becd6c69bdfbacd5d8986b464ca2a3f89967650
|
4
|
+
data.tar.gz: c46d2342a87bacabdabb0b5903124b852d7b9de0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be7c90618f90c30527b19540ab9c8112048739a59059701b2d81538ac921db278d004e1f19e9d0b4e4b6064b0e078b90b0d1ca911c47349bf68acf91deb6290f
|
7
|
+
data.tar.gz: 488cf3725b34c1fa025d0f34ec626ab70e98f3eff64e5f909fa8d155090b6a322ce3b4935c6caf3a136a842caf4a1c8b268f0c0d9bb23f7e3b4c609ea5e99312
|
@@ -24,9 +24,9 @@ _.extend oojspec, new class OojspecRunner
|
|
24
24
|
@on 'iframe-end', (w)=> @_iframeByWindow[w.location.pathname].style.display = 'none'
|
25
25
|
|
26
26
|
_registerEventHandlers: ->
|
27
|
-
@assertions =
|
28
|
-
|
29
|
-
@assertions.format =
|
27
|
+
@assertions = referee
|
28
|
+
logFormatter = formatio.configure quoteStrings: false
|
29
|
+
@assertions.format = -> logFormatter.ascii.apply logFormatter, arguments
|
30
30
|
@assertions.on 'pass', => @stats.assertions++
|
31
31
|
@assertions.on 'failure', => @stats.failures++
|
32
32
|
#@events.on 'context:start', => @stats.contexts++
|
@@ -90,13 +90,13 @@ RESERVED_FOR_EXAMPLE_DSL = ['assert', 'expect', 'fail', 'refute', 'waitsFor', 'r
|
|
90
90
|
class Description
|
91
91
|
RESERVED = RESERVED_FOR_DESCRIPTION_DSL.concat RESERVED_FOR_EXAMPLE_DSL
|
92
92
|
|
93
|
-
constructor: (@description, @block)->
|
93
|
+
constructor: (@description, @block, @beforeBlocks = [], @afterBlocks = [])->
|
94
94
|
if @description.runSpecs or @description.prototype?.runSpecs
|
95
95
|
@block = @description
|
96
96
|
@description = @block.description or @block.name
|
97
97
|
|
98
98
|
processDsl: (@params, @binding, @bare)->
|
99
|
-
@events = params.events
|
99
|
+
@events = @params.events
|
100
100
|
@dsl = new DescribeDsl
|
101
101
|
(@block.runSpecs or @block.prototype?.runSpecs) and @detectBindingError()
|
102
102
|
|
@@ -126,7 +126,7 @@ class Description
|
|
126
126
|
|
127
127
|
removeDsl: -> delete @binding[p] for p in RESERVED_FOR_DESCRIPTION_DSL; return
|
128
128
|
|
129
|
-
run: (@params, @onFinish
|
129
|
+
run: (@params, @onFinish)->
|
130
130
|
@events.emit 'context:start', name: @description
|
131
131
|
if @bindingError
|
132
132
|
@events.emit 'test:error', name: @description, error: @bindingError
|
@@ -134,7 +134,7 @@ class Description
|
|
134
134
|
else
|
135
135
|
@doRun()
|
136
136
|
|
137
|
-
doRun: -> @runAround
|
137
|
+
doRun: -> @runAround [], [], @onDescriptionFinished, @processDescriptionBlock
|
138
138
|
|
139
139
|
onDescriptionFinished: (error)=>
|
140
140
|
if error and not error.handled
|
@@ -154,6 +154,7 @@ class Description
|
|
154
154
|
(@onExamplesFinished(); return) unless @dsl._examples_.length
|
155
155
|
nextStep = @dsl._examples_.shift()
|
156
156
|
(@reportDeferred(nextStep.description); @runNextStep(); return) if nextStep.pending
|
157
|
+
@prependHooks nextStep
|
157
158
|
nextTick =
|
158
159
|
if nextStep instanceof Description then =>
|
159
160
|
nextStep.run @params, @runNextStep, @dsl._beforeBlocks_, @dsl._afterBlocks_
|
@@ -170,6 +171,12 @@ class Description
|
|
170
171
|
@events.emit 'test:error', { name, error }
|
171
172
|
@onFinish(error)
|
172
173
|
|
174
|
+
prependHooks: (nextStep)->
|
175
|
+
@cloneAndPrepend nextStep, type for type in ['beforeBlocks', 'afterBlocks']
|
176
|
+
|
177
|
+
cloneAndPrepend: (nextStep, type)->
|
178
|
+
(nextStep[type] = nextStep[type].slice 0).unshift this[type]...
|
179
|
+
|
173
180
|
reportDeferred: (description)-> @events.emit 'test:deferred', name: description
|
174
181
|
|
175
182
|
class DescribeDsl
|
data/lib/oojspec/version.rb
CHANGED
@@ -0,0 +1,174 @@
|
|
1
|
+
((typeof define === "function" && define.amd && function (m) { define("bane", m); }) ||
|
2
|
+
(typeof module === "object" && function (m) { module.exports = m(); }) ||
|
3
|
+
function (m) { this.bane = m(); }
|
4
|
+
)(function () {
|
5
|
+
"use strict";
|
6
|
+
var slice = Array.prototype.slice;
|
7
|
+
|
8
|
+
function handleError(event, error, errbacks) {
|
9
|
+
var i, l = errbacks.length;
|
10
|
+
if (l > 0) {
|
11
|
+
for (i = 0; i < l; ++i) { errbacks[i](event, error); }
|
12
|
+
return;
|
13
|
+
}
|
14
|
+
setTimeout(function () {
|
15
|
+
error.message = event + " listener threw error: " + error.message;
|
16
|
+
throw error;
|
17
|
+
}, 0);
|
18
|
+
}
|
19
|
+
|
20
|
+
function assertFunction(fn) {
|
21
|
+
if (typeof fn !== "function") {
|
22
|
+
throw new TypeError("Listener is not function");
|
23
|
+
}
|
24
|
+
return fn;
|
25
|
+
}
|
26
|
+
|
27
|
+
function supervisors(object) {
|
28
|
+
if (!object.supervisors) { object.supervisors = []; }
|
29
|
+
return object.supervisors;
|
30
|
+
}
|
31
|
+
|
32
|
+
function listeners(object, event) {
|
33
|
+
if (!object.listeners) { object.listeners = {}; }
|
34
|
+
if (event && !object.listeners[event]) { object.listeners[event] = []; }
|
35
|
+
return event ? object.listeners[event] : object.listeners;
|
36
|
+
}
|
37
|
+
|
38
|
+
function errbacks(object) {
|
39
|
+
if (!object.errbacks) { object.errbacks = []; }
|
40
|
+
return object.errbacks;
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* @signature var emitter = bane.createEmitter([object]);
|
45
|
+
*
|
46
|
+
* Create a new event emitter. If an object is passed, it will be modified
|
47
|
+
* by adding the event emitter methods (see below).
|
48
|
+
*/
|
49
|
+
function createEventEmitter(object) {
|
50
|
+
object = object || {};
|
51
|
+
|
52
|
+
function notifyListener(event, listener, args) {
|
53
|
+
try {
|
54
|
+
listener.listener.apply(listener.thisp || object, args);
|
55
|
+
} catch (e) {
|
56
|
+
handleError(event, e, errbacks(object));
|
57
|
+
}
|
58
|
+
}
|
59
|
+
|
60
|
+
object.on = function (event, listener, thisp) {
|
61
|
+
if (typeof event === "function") {
|
62
|
+
return supervisors(this).push({
|
63
|
+
listener: event,
|
64
|
+
thisp: listener
|
65
|
+
});
|
66
|
+
}
|
67
|
+
listeners(this, event).push({
|
68
|
+
listener: assertFunction(listener),
|
69
|
+
thisp: thisp
|
70
|
+
});
|
71
|
+
};
|
72
|
+
|
73
|
+
object.off = function (event, listener) {
|
74
|
+
var fns, events, i, l;
|
75
|
+
if (!event) {
|
76
|
+
fns = supervisors(this);
|
77
|
+
fns.splice(0, fns.length);
|
78
|
+
|
79
|
+
events = listeners(this);
|
80
|
+
for (i in events) {
|
81
|
+
if (events.hasOwnProperty(i)) {
|
82
|
+
fns = listeners(this, i);
|
83
|
+
fns.splice(0, fns.length);
|
84
|
+
}
|
85
|
+
}
|
86
|
+
|
87
|
+
fns = errbacks(this);
|
88
|
+
fns.splice(0, fns.length);
|
89
|
+
|
90
|
+
return;
|
91
|
+
}
|
92
|
+
if (typeof event === "function") {
|
93
|
+
fns = supervisors(this);
|
94
|
+
listener = event;
|
95
|
+
} else {
|
96
|
+
fns = listeners(this, event);
|
97
|
+
}
|
98
|
+
if (!listener) {
|
99
|
+
fns.splice(0, fns.length);
|
100
|
+
return;
|
101
|
+
}
|
102
|
+
for (i = 0, l = fns.length; i < l; ++i) {
|
103
|
+
if (fns[i].listener === listener) {
|
104
|
+
fns.splice(i, 1);
|
105
|
+
return;
|
106
|
+
}
|
107
|
+
}
|
108
|
+
};
|
109
|
+
|
110
|
+
object.once = function (event, listener, thisp) {
|
111
|
+
var wrapper = function () {
|
112
|
+
object.off(event, wrapper);
|
113
|
+
listener.apply(this, arguments);
|
114
|
+
};
|
115
|
+
|
116
|
+
object.on(event, wrapper, thisp);
|
117
|
+
};
|
118
|
+
|
119
|
+
object.bind = function (object, events) {
|
120
|
+
var prop, i, l;
|
121
|
+
if (!events) {
|
122
|
+
for (prop in object) {
|
123
|
+
if (typeof object[prop] === "function") {
|
124
|
+
this.on(prop, object[prop], object);
|
125
|
+
}
|
126
|
+
}
|
127
|
+
} else {
|
128
|
+
for (i = 0, l = events.length; i < l; ++i) {
|
129
|
+
if (typeof object[events[i]] === "function") {
|
130
|
+
this.on(events[i], object[events[i]], object);
|
131
|
+
} else {
|
132
|
+
throw new Error("No such method " + events[i]);
|
133
|
+
}
|
134
|
+
}
|
135
|
+
}
|
136
|
+
return object;
|
137
|
+
};
|
138
|
+
|
139
|
+
object.emit = function (event) {
|
140
|
+
var toNotify = supervisors(this);
|
141
|
+
var args = slice.call(arguments), i, l;
|
142
|
+
|
143
|
+
for (i = 0, l = toNotify.length; i < l; ++i) {
|
144
|
+
notifyListener(event, toNotify[i], args);
|
145
|
+
}
|
146
|
+
|
147
|
+
toNotify = listeners(this, event).slice();
|
148
|
+
args = slice.call(arguments, 1);
|
149
|
+
for (i = 0, l = toNotify.length; i < l; ++i) {
|
150
|
+
notifyListener(event, toNotify[i], args);
|
151
|
+
}
|
152
|
+
};
|
153
|
+
|
154
|
+
object.errback = function (listener) {
|
155
|
+
if (!this.errbacks) { this.errbacks = []; }
|
156
|
+
this.errbacks.push(assertFunction(listener));
|
157
|
+
};
|
158
|
+
|
159
|
+
return object;
|
160
|
+
}
|
161
|
+
|
162
|
+
return {
|
163
|
+
createEventEmitter: createEventEmitter,
|
164
|
+
aggregate: function (emitters) {
|
165
|
+
var aggregate = createEventEmitter();
|
166
|
+
emitters.forEach(function (emitter) {
|
167
|
+
emitter.on(function (event, data) {
|
168
|
+
aggregate.emit(event, data);
|
169
|
+
});
|
170
|
+
});
|
171
|
+
return aggregate;
|
172
|
+
}
|
173
|
+
};
|
174
|
+
});
|
@@ -142,7 +142,8 @@ var buster = (function (setTimeout, B) {
|
|
142
142
|
}
|
143
143
|
};
|
144
144
|
|
145
|
-
if (typeof process === "object"
|
145
|
+
if (typeof process === "object" &&
|
146
|
+
typeof require === "function" && typeof module === "object") {
|
146
147
|
var crypto = require("crypto");
|
147
148
|
var path = require("path");
|
148
149
|
|
@@ -188,18 +189,18 @@ var buster = (function (setTimeout, B) {
|
|
188
189
|
};
|
189
190
|
} else {
|
190
191
|
// https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter
|
191
|
-
buster.filter = function (fn, thisp) {
|
192
|
+
buster.filter = function (arr, fn, thisp) {
|
192
193
|
"use strict";
|
193
|
-
if (
|
194
|
+
if (arr == null) { throw new TypeError(); }
|
194
195
|
|
195
|
-
var t = Object(
|
196
|
+
var t = Object(arr);
|
196
197
|
var len = t.length >>> 0;
|
197
198
|
if (typeof fn != "function") { throw new TypeError(); }
|
198
199
|
|
199
200
|
var res = [];
|
200
201
|
for (var i = 0; i < len; i++) {
|
201
202
|
if (i in t) {
|
202
|
-
var val = t[i];
|
203
|
+
var val = t[i];
|
203
204
|
if (fn.call(thisp, val, i, t)) { res.push(val); }
|
204
205
|
}
|
205
206
|
}
|
@@ -1,63 +1,67 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
((typeof define === "function" && define.amd && function (m) {
|
2
|
+
define("expect", ["lodash"], m);
|
3
|
+
}) || (typeof module === "object" && function (m) {
|
4
|
+
module.exports = m(require("lodash"));
|
5
|
+
}) || function (m) { this.expect = m(this._); }
|
6
|
+
)(function (_) {
|
7
|
+
var expectation = {};
|
8
|
+
function F() {}
|
9
|
+
var create = function (object) { F.prototype = object; return new F(); };
|
5
10
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
ba.expect = function (actual) {
|
10
|
-
var expectation = buster.extend(buster.create(ba.expectation), {
|
11
|
+
var expect = function (actual) {
|
12
|
+
var expectation = _.extend(create(expect.expectation), {
|
11
13
|
actual: actual,
|
12
14
|
assertMode: true
|
13
15
|
});
|
14
|
-
expectation.not =
|
16
|
+
expectation.not = create(expectation);
|
15
17
|
expectation.not.assertMode = false;
|
16
18
|
return expectation;
|
17
19
|
};
|
18
20
|
|
19
|
-
|
20
|
-
|
21
|
-
|
21
|
+
expect.expectation = expectation;
|
22
|
+
|
23
|
+
expect.wrapAssertion = function (assertion, expectation, referee) {
|
24
|
+
expect.expectation[expectation] = function () {
|
25
|
+
var args = [this.actual].concat(_.toArray(arguments));
|
22
26
|
var type = this.assertMode ? "assert" : "refute";
|
23
27
|
var callFunc;
|
24
28
|
|
25
29
|
if (assertion === "assert") {
|
26
|
-
callFunc = this.assertMode ?
|
30
|
+
callFunc = this.assertMode ? referee.assert : referee.refute;
|
27
31
|
} else if (assertion === "refute") {
|
28
|
-
callFunc = this.assertMode ?
|
32
|
+
callFunc = this.assertMode ? referee.refute : referee.assert;
|
29
33
|
} else {
|
30
|
-
callFunc =
|
34
|
+
callFunc = referee[type][assertion];
|
31
35
|
}
|
32
36
|
|
33
37
|
try {
|
34
|
-
return callFunc.apply(
|
38
|
+
return callFunc.apply(referee.expect, args);
|
35
39
|
} catch (e) {
|
36
40
|
e.message = (e.message || "").replace(
|
37
41
|
"[" + type + "." + assertion + "]",
|
38
|
-
"[expect." + (this.assertMode ? "" : "not.") +
|
42
|
+
"[expect." + (this.assertMode ? "" : "not.") +
|
43
|
+
expectation + "]"
|
44
|
+
);
|
39
45
|
throw e;
|
40
46
|
}
|
41
47
|
};
|
42
48
|
};
|
43
49
|
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
}
|
51
|
-
}
|
50
|
+
expect.init = function (referee) {
|
51
|
+
_.each(_.keys(referee.assert), function (name) {
|
52
|
+
var expectationName = referee.assert[name].expectationName;
|
53
|
+
if (expectationName) {
|
54
|
+
expect.wrapAssertion(name, expectationName, referee);
|
55
|
+
}
|
56
|
+
});
|
52
57
|
|
53
|
-
|
54
|
-
|
58
|
+
expect.wrapAssertion("assert", "toBeTruthy", referee);
|
59
|
+
expect.wrapAssertion("refute", "toBeFalsy", referee);
|
55
60
|
|
56
|
-
|
57
|
-
|
58
|
-
|
61
|
+
if (expect.expectation.toBeNear) {
|
62
|
+
expect.expectation.toBeCloseTo = expect.expectation.toBeNear;
|
63
|
+
}
|
64
|
+
};
|
59
65
|
|
60
|
-
|
61
|
-
|
62
|
-
}
|
63
|
-
}(buster.assertions));
|
66
|
+
return expect;
|
67
|
+
});
|
@@ -0,0 +1,215 @@
|
|
1
|
+
((typeof define === "function" && define.amd && function (m) {
|
2
|
+
define("formatio", ["samsam"], m);
|
3
|
+
}) || (typeof module === "object" && function (m) {
|
4
|
+
module.exports = m(require("samsam"));
|
5
|
+
}) || function (m) { this.formatio = m(this.samsam); }
|
6
|
+
)(function (samsam) {
|
7
|
+
"use strict";
|
8
|
+
|
9
|
+
var formatio = {
|
10
|
+
excludeConstructors: ["Object", /^.$/],
|
11
|
+
quoteStrings: true,
|
12
|
+
limitChildrenCount: 0
|
13
|
+
};
|
14
|
+
|
15
|
+
var hasOwn = Object.prototype.hasOwnProperty;
|
16
|
+
|
17
|
+
var specialObjects = [];
|
18
|
+
if (typeof global !== "undefined") {
|
19
|
+
specialObjects.push({ object: global, value: "[object global]" });
|
20
|
+
}
|
21
|
+
if (typeof document !== "undefined") {
|
22
|
+
specialObjects.push({
|
23
|
+
object: document,
|
24
|
+
value: "[object HTMLDocument]"
|
25
|
+
});
|
26
|
+
}
|
27
|
+
if (typeof window !== "undefined") {
|
28
|
+
specialObjects.push({ object: window, value: "[object Window]" });
|
29
|
+
}
|
30
|
+
|
31
|
+
function functionName(func) {
|
32
|
+
if (!func) { return ""; }
|
33
|
+
if (func.displayName) { return func.displayName; }
|
34
|
+
if (func.name) { return func.name; }
|
35
|
+
var matches = func.toString().match(/function\s+([^\(]+)/m);
|
36
|
+
return (matches && matches[1]) || "";
|
37
|
+
}
|
38
|
+
|
39
|
+
function constructorName(f, object) {
|
40
|
+
var name = functionName(object && object.constructor);
|
41
|
+
var excludes = f.excludeConstructors ||
|
42
|
+
formatio.excludeConstructors || [];
|
43
|
+
|
44
|
+
var i, l;
|
45
|
+
for (i = 0, l = excludes.length; i < l; ++i) {
|
46
|
+
if (typeof excludes[i] === "string" && excludes[i] === name) {
|
47
|
+
return "";
|
48
|
+
} else if (excludes[i].test && excludes[i].test(name)) {
|
49
|
+
return "";
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
return name;
|
54
|
+
}
|
55
|
+
|
56
|
+
function isCircular(object, objects) {
|
57
|
+
if (typeof object !== "object") { return false; }
|
58
|
+
var i, l;
|
59
|
+
for (i = 0, l = objects.length; i < l; ++i) {
|
60
|
+
if (objects[i] === object) { return true; }
|
61
|
+
}
|
62
|
+
return false;
|
63
|
+
}
|
64
|
+
|
65
|
+
function ascii(f, object, processed, indent) {
|
66
|
+
if (typeof object === "string") {
|
67
|
+
if (object.length === 0) { return "(empty string)"; }
|
68
|
+
var qs = f.quoteStrings;
|
69
|
+
var quote = typeof qs !== "boolean" || qs;
|
70
|
+
return processed || quote ? '"' + object + '"' : object;
|
71
|
+
}
|
72
|
+
|
73
|
+
if (typeof object === "function" && !(object instanceof RegExp)) {
|
74
|
+
return ascii.func(object);
|
75
|
+
}
|
76
|
+
|
77
|
+
processed = processed || [];
|
78
|
+
|
79
|
+
if (isCircular(object, processed)) { return "[Circular]"; }
|
80
|
+
|
81
|
+
if (Object.prototype.toString.call(object) === "[object Array]") {
|
82
|
+
return ascii.array.call(f, object, processed);
|
83
|
+
}
|
84
|
+
|
85
|
+
if (!object) { return String((1/object) === -Infinity ? "-0" : object); }
|
86
|
+
if (samsam.isElement(object)) { return ascii.element(object); }
|
87
|
+
|
88
|
+
if (typeof object.toString === "function" &&
|
89
|
+
object.toString !== Object.prototype.toString) {
|
90
|
+
return object.toString();
|
91
|
+
}
|
92
|
+
|
93
|
+
var i, l;
|
94
|
+
for (i = 0, l = specialObjects.length; i < l; i++) {
|
95
|
+
if (object === specialObjects[i].object) {
|
96
|
+
return specialObjects[i].value;
|
97
|
+
}
|
98
|
+
}
|
99
|
+
|
100
|
+
return ascii.object.call(f, object, processed, indent);
|
101
|
+
}
|
102
|
+
|
103
|
+
ascii.func = function (func) {
|
104
|
+
return "function " + functionName(func) + "() {}";
|
105
|
+
};
|
106
|
+
|
107
|
+
ascii.array = function (array, processed) {
|
108
|
+
processed = processed || [];
|
109
|
+
processed.push(array);
|
110
|
+
var pieces = [];
|
111
|
+
var i, l;
|
112
|
+
l = (this.limitChildrenCount > 0) ?
|
113
|
+
Math.min(this.limitChildrenCount, array.length) : array.length;
|
114
|
+
|
115
|
+
for (i = 0; i < l; ++i) {
|
116
|
+
pieces.push(ascii(this, array[i], processed));
|
117
|
+
}
|
118
|
+
|
119
|
+
if(l < array.length)
|
120
|
+
pieces.push("[... " + (array.length - l) + " more elements]");
|
121
|
+
|
122
|
+
return "[" + pieces.join(", ") + "]";
|
123
|
+
};
|
124
|
+
|
125
|
+
ascii.object = function (object, processed, indent) {
|
126
|
+
processed = processed || [];
|
127
|
+
processed.push(object);
|
128
|
+
indent = indent || 0;
|
129
|
+
var pieces = [], properties = samsam.keys(object).sort();
|
130
|
+
var length = 3;
|
131
|
+
var prop, str, obj, i, k, l;
|
132
|
+
l = (this.limitChildrenCount > 0) ?
|
133
|
+
Math.min(this.limitChildrenCount, properties.length) : properties.length;
|
134
|
+
|
135
|
+
for (i = 0; i < l; ++i) {
|
136
|
+
prop = properties[i];
|
137
|
+
obj = object[prop];
|
138
|
+
|
139
|
+
if (isCircular(obj, processed)) {
|
140
|
+
str = "[Circular]";
|
141
|
+
} else {
|
142
|
+
str = ascii(this, obj, processed, indent + 2);
|
143
|
+
}
|
144
|
+
|
145
|
+
str = (/\s/.test(prop) ? '"' + prop + '"' : prop) + ": " + str;
|
146
|
+
length += str.length;
|
147
|
+
pieces.push(str);
|
148
|
+
}
|
149
|
+
|
150
|
+
var cons = constructorName(this, object);
|
151
|
+
var prefix = cons ? "[" + cons + "] " : "";
|
152
|
+
var is = "";
|
153
|
+
for (i = 0, k = indent; i < k; ++i) { is += " "; }
|
154
|
+
|
155
|
+
if(l < properties.length)
|
156
|
+
pieces.push("[... " + (properties.length - l) + " more elements]");
|
157
|
+
|
158
|
+
if (length + indent > 80) {
|
159
|
+
return prefix + "{\n " + is + pieces.join(",\n " + is) + "\n" +
|
160
|
+
is + "}";
|
161
|
+
}
|
162
|
+
return prefix + "{ " + pieces.join(", ") + " }";
|
163
|
+
};
|
164
|
+
|
165
|
+
ascii.element = function (element) {
|
166
|
+
var tagName = element.tagName.toLowerCase();
|
167
|
+
var attrs = element.attributes, attr, pairs = [], attrName, i, l, val;
|
168
|
+
|
169
|
+
for (i = 0, l = attrs.length; i < l; ++i) {
|
170
|
+
attr = attrs.item(i);
|
171
|
+
attrName = attr.nodeName.toLowerCase().replace("html:", "");
|
172
|
+
val = attr.nodeValue;
|
173
|
+
if (attrName !== "contenteditable" || val !== "inherit") {
|
174
|
+
if (!!val) { pairs.push(attrName + "=\"" + val + "\""); }
|
175
|
+
}
|
176
|
+
}
|
177
|
+
|
178
|
+
var formatted = "<" + tagName + (pairs.length > 0 ? " " : "");
|
179
|
+
// SVG elements have undefined innerHTML
|
180
|
+
var content = element.innerHTML || '';
|
181
|
+
|
182
|
+
if (content.length > 20) {
|
183
|
+
content = content.substr(0, 20) + "[...]";
|
184
|
+
}
|
185
|
+
|
186
|
+
var res = formatted + pairs.join(" ") + ">" + content +
|
187
|
+
"</" + tagName + ">";
|
188
|
+
|
189
|
+
return res.replace(/ contentEditable="inherit"/, "");
|
190
|
+
};
|
191
|
+
|
192
|
+
function Formatio(options) {
|
193
|
+
for (var opt in options) {
|
194
|
+
this[opt] = options[opt];
|
195
|
+
}
|
196
|
+
}
|
197
|
+
|
198
|
+
Formatio.prototype = {
|
199
|
+
functionName: functionName,
|
200
|
+
|
201
|
+
configure: function (options) {
|
202
|
+
return new Formatio(options);
|
203
|
+
},
|
204
|
+
|
205
|
+
constructorName: function (object) {
|
206
|
+
return constructorName(this, object);
|
207
|
+
},
|
208
|
+
|
209
|
+
ascii: function (object, processed, indent) {
|
210
|
+
return ascii(this, object, processed, indent);
|
211
|
+
}
|
212
|
+
};
|
213
|
+
|
214
|
+
return Formatio.prototype;
|
215
|
+
});
|