oojspec 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
+
});
|