canjs-rails 0.1.0 → 1.1.2
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.
- data/CHANGELOG.md +5 -0
- data/canjs-rails.gemspec +1 -1
- data/lib/canjs/rails/version.rb +2 -2
- data/vendor/assets/javascripts/can.construct.proxy.js +27 -26
- data/vendor/assets/javascripts/can.construct.super.js +40 -36
- data/vendor/assets/javascripts/can.control.plugin.js +92 -229
- data/vendor/assets/javascripts/can.control.view.js +37 -31
- data/vendor/assets/javascripts/can.fixture.js +277 -570
- data/vendor/assets/javascripts/can.jquery.js +2396 -1792
- data/vendor/assets/javascripts/can.jquery.min.js +70 -52
- data/vendor/assets/javascripts/can.observe.attributes.js +137 -276
- data/vendor/assets/javascripts/can.observe.backup.js +137 -335
- data/vendor/assets/javascripts/can.observe.delegate.js +97 -250
- data/vendor/assets/javascripts/can.observe.setter.js +53 -52
- data/vendor/assets/javascripts/can.observe.validations.js +187 -362
- data/vendor/assets/javascripts/can.view.modifiers.js +57 -190
- data/vendor/assets/javascripts/can.view.mustache.js +758 -0
- data/vendor/assets/javascripts/download_canjs.sh +18 -13
- metadata +4 -3
@@ -1,38 +1,43 @@
|
|
1
|
-
|
1
|
+
/*
|
2
|
+
* CanJS - 1.1.2 (2012-11-28)
|
3
|
+
* http://canjs.us/
|
4
|
+
* Copyright (c) 2012 Bitovi
|
5
|
+
* Licensed MIT
|
6
|
+
*/
|
7
|
+
(function (can, window, undefined) {
|
8
|
+
// ## can/control/view/view.js
|
2
9
|
var URI = steal.URI || steal.File;
|
3
|
-
|
4
|
-
can.Control.getFolder = function() {
|
10
|
+
|
11
|
+
can.Control.getFolder = function () {
|
5
12
|
return can.underscore(this.fullName.replace(/\./g, "/")).replace("/Controllers", "");
|
6
13
|
};
|
7
14
|
|
8
|
-
can.Control._calculatePosition = function(
|
15
|
+
can.Control._calculatePosition = function (Class, view) {
|
9
16
|
var classParts = Class.fullName.split('.'),
|
10
17
|
classPartsWithoutPrefix = classParts.slice(0);
|
11
|
-
|
12
|
-
action_name = "init"; // Remove prefix (usually 2 elements)
|
13
|
-
|
18
|
+
classPartsWithoutPrefix.splice(0, 2), action_name = "init"; // Remove prefix (usually 2 elements)
|
14
19
|
var hasControllers = (classParts.length > 2) && classParts[1] == 'Controllers',
|
15
|
-
path = hasControllers? can.underscore(classParts[0]): can.underscore(classParts.join("/")),
|
20
|
+
path = hasControllers ? can.underscore(classParts[0]) : can.underscore(classParts.join("/")),
|
16
21
|
controller_name = can.underscore(classPartsWithoutPrefix.join('/')).toLowerCase(),
|
17
22
|
suffix = (typeof view == "string" && /\.[\w\d]+$/.test(view)) ? "" : can.view.ext;
|
18
|
-
|
23
|
+
|
19
24
|
//calculate view
|
20
|
-
if (
|
21
|
-
if (
|
25
|
+
if (typeof view == "string") {
|
26
|
+
if (view.substr(0, 2) == "//") { //leave where it is
|
22
27
|
} else {
|
23
|
-
view = "//" + URI(path).join(
|
28
|
+
view = "//" + URI(path).join('views/' + (view.indexOf('/') !== -1 ? view : (hasControllers ? controller_name + '/' : "") + view)) + suffix;
|
24
29
|
}
|
25
|
-
} else if (!view
|
26
|
-
view = "//" + URI(path).join('views/' + (hasControllers ? controller_name + '/' : "") + action_name.replace(/\.|#/g, '').replace(/ /g, '_'))+ suffix;
|
30
|
+
} else if (!view) {
|
31
|
+
view = "//" + URI(path).join('views/' + (hasControllers ? controller_name + '/' : "") + action_name.replace(/\.|#/g, '').replace(/ /g, '_')) + suffix;
|
27
32
|
}
|
28
33
|
return view;
|
29
34
|
};
|
30
|
-
|
31
|
-
var calculateHelpers = function(
|
35
|
+
|
36
|
+
var calculateHelpers = function (myhelpers) {
|
32
37
|
var helpers = {};
|
33
|
-
if (
|
34
|
-
if (
|
35
|
-
for (
|
38
|
+
if (myhelpers) {
|
39
|
+
if (can.isArray(myhelpers)) {
|
40
|
+
for (var h = 0; h < myhelpers.length; h++) {
|
36
41
|
can.extend(helpers, myhelpers[h]);
|
37
42
|
}
|
38
43
|
}
|
@@ -40,39 +45,39 @@
|
|
40
45
|
can.extend(helpers, myhelpers);
|
41
46
|
}
|
42
47
|
} else {
|
43
|
-
if (
|
48
|
+
if (this._default_helpers) {
|
44
49
|
helpers = this._default_helpers;
|
45
50
|
}
|
46
|
-
|
51
|
+
|
47
52
|
//load from name
|
48
53
|
var current = window;
|
49
54
|
var parts = this.constructor.fullName.split(/\./);
|
50
|
-
for (
|
51
|
-
if(current){
|
52
|
-
if (
|
55
|
+
for (var i = 0; i < parts.length; i++) {
|
56
|
+
if (current) {
|
57
|
+
if (typeof current.Helpers == 'object') {
|
53
58
|
can.extend(helpers, current.Helpers);
|
54
59
|
}
|
55
60
|
current = current[parts[i]];
|
56
61
|
}
|
57
62
|
}
|
58
|
-
|
59
|
-
if (current && typeof current.Helpers == 'object'
|
63
|
+
|
64
|
+
if (current && typeof current.Helpers == 'object') {
|
60
65
|
can.extend(helpers, current.Helpers);
|
61
66
|
}
|
62
|
-
|
67
|
+
|
63
68
|
this._default_helpers = helpers;
|
64
69
|
}
|
65
70
|
return helpers;
|
66
71
|
};
|
67
72
|
|
68
|
-
can.Control.prototype.view = function(
|
73
|
+
can.Control.prototype.view = function (view, data, myhelpers) {
|
69
74
|
//shift args if no view is provided
|
70
|
-
if (
|
75
|
+
if (typeof view != "string" && !myhelpers) {
|
71
76
|
myhelpers = data;
|
72
77
|
data = view;
|
73
78
|
view = null;
|
74
79
|
}
|
75
|
-
|
80
|
+
|
76
81
|
//guess from controller name
|
77
82
|
view = can.Control._calculatePosition(this.constructor, view, this.called);
|
78
83
|
|
@@ -85,4 +90,5 @@
|
|
85
90
|
return can.view(view, data, helpers); //what about controllers in other folders?
|
86
91
|
};
|
87
92
|
|
88
|
-
|
93
|
+
|
94
|
+
})(can, this);
|
@@ -1,326 +1,253 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
1
|
+
/*
|
2
|
+
* CanJS - 1.1.2 (2012-11-28)
|
3
|
+
* http://canjs.us/
|
4
|
+
* Copyright (c) 2012 Bitovi
|
5
|
+
* Licensed MIT
|
6
|
+
*/
|
7
|
+
(function (can, window, undefined) {
|
8
|
+
// ## can/util/object/object.js
|
9
|
+
|
10
|
+
var isArray = can.isArray,
|
11
|
+
// essentially returns an object that has all the must have comparisons ...
|
12
|
+
// must haves, do not return true when provided undefined
|
13
|
+
cleanSet = function (obj, compares) {
|
14
|
+
var copy = can.extend({}, obj);
|
15
|
+
for (var prop in copy) {
|
16
|
+
var compare = compares[prop] === undefined ? compares["*"] : compares[prop];
|
17
|
+
if (same(copy[prop], undefined, compare)) {
|
18
|
+
delete copy[prop]
|
19
|
+
}
|
12
20
|
}
|
21
|
+
return copy;
|
22
|
+
},
|
23
|
+
propCount = function (obj) {
|
24
|
+
var count = 0;
|
25
|
+
for (var prop in obj) count++;
|
26
|
+
return count;
|
27
|
+
};
|
28
|
+
|
29
|
+
can.Object = {};
|
30
|
+
|
31
|
+
var same = can.Object.same = function (a, b, compares, aParent, bParent, deep) {
|
32
|
+
var aType = typeof a,
|
33
|
+
aArray = isArray(a),
|
34
|
+
comparesType = typeof compares,
|
35
|
+
compare;
|
36
|
+
|
37
|
+
if (comparesType == 'string' || compares === null) {
|
38
|
+
compares = compareMethods[compares];
|
39
|
+
comparesType = 'function'
|
13
40
|
}
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
for(var prop in obj) count++;
|
19
|
-
return count;
|
20
|
-
};
|
41
|
+
if (comparesType == 'function') {
|
42
|
+
return compares(a, b, aParent, bParent)
|
43
|
+
}
|
44
|
+
compares = compares || {};
|
21
45
|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
* ## same
|
30
|
-
*
|
31
|
-
* Returns true if two objects are similar.
|
32
|
-
*
|
33
|
-
* can.Object.same({foo: "bar"} , {bar: "foo"}) //-> false
|
34
|
-
*
|
35
|
-
* ## subset
|
36
|
-
*
|
37
|
-
* Returns true if an object is a set of another set.
|
38
|
-
*
|
39
|
-
* can.Object.subset({}, {foo: "bar"} ) //-> true
|
40
|
-
*
|
41
|
-
* ## subsets
|
42
|
-
*
|
43
|
-
* Returns the subsets of an object
|
44
|
-
*
|
45
|
-
* can.Object.subsets({userId: 20},
|
46
|
-
* [
|
47
|
-
* {userId: 20, limit: 30},
|
48
|
-
* {userId: 5},
|
49
|
-
* {}
|
50
|
-
* ])
|
51
|
-
* //-> [{userId: 20, limit: 30}]
|
52
|
-
*/
|
53
|
-
can.Object = {};
|
54
|
-
|
55
|
-
/**
|
56
|
-
* @function same
|
57
|
-
* Returns if two objects are the same. It takes an optional compares object that
|
58
|
-
* can be used to make comparisons.
|
59
|
-
*
|
60
|
-
* This function does not work with objects that create circular references.
|
61
|
-
*
|
62
|
-
* ## Examples
|
63
|
-
*
|
64
|
-
* can.Object.same({name: "Justin"},
|
65
|
-
* {name: "JUSTIN"}) //-> false
|
66
|
-
*
|
67
|
-
* // ignore the name property
|
68
|
-
* can.Object.same({name: "Brian"},
|
69
|
-
* {name: "JUSTIN"},
|
70
|
-
* {name: null}) //-> true
|
71
|
-
*
|
72
|
-
* // ignore case
|
73
|
-
* can.Object.same({name: "Justin"},
|
74
|
-
* {name: "JUSTIN"},
|
75
|
-
* {name: "i"}) //-> true
|
76
|
-
*
|
77
|
-
* // deep rule
|
78
|
-
* can.Object.same({ person : { name: "Justin" } },
|
79
|
-
* { person : { name: "JUSTIN" } },
|
80
|
-
* { person : { name: "i" } }) //-> true
|
81
|
-
*
|
82
|
-
* // supplied compare function
|
83
|
-
* can.Object.same({age: "Thirty"},
|
84
|
-
* {age: 30},
|
85
|
-
* {age: function( a, b ){
|
86
|
-
* if( a == "Thirty" ) {
|
87
|
-
* a = 30
|
88
|
-
* }
|
89
|
-
* if( b == "Thirty" ) {
|
90
|
-
* b = 30
|
91
|
-
* }
|
92
|
-
* return a === b;
|
93
|
-
* }}) //-> true
|
94
|
-
*
|
95
|
-
* @param {Object} a an object to compare
|
96
|
-
* @param {Object} b an object to compare
|
97
|
-
* @param {Object} [compares] an object that indicates how to
|
98
|
-
* compare specific properties.
|
99
|
-
* Typically this is a name / value pair
|
100
|
-
*
|
101
|
-
* can.Object.same({name: "Justin"},{name: "JUSTIN"},{name: "i"})
|
102
|
-
*
|
103
|
-
* There are two compare functions that you can specify with a string:
|
104
|
-
*
|
105
|
-
* - 'i' - ignores case
|
106
|
-
* - null - ignores this property
|
107
|
-
*
|
108
|
-
* @param {Object} [deep] used internally
|
109
|
-
*/
|
110
|
-
var same = can.Object.same = function(a, b, compares, aParent, bParent, deep){
|
111
|
-
var aType = typeof a,
|
112
|
-
aArray = isArray(a),
|
113
|
-
comparesType = typeof compares,
|
114
|
-
compare;
|
115
|
-
|
116
|
-
if(comparesType == 'string' || compares === null ){
|
117
|
-
compares = compareMethods[compares];
|
118
|
-
comparesType = 'function'
|
119
|
-
}
|
120
|
-
if(comparesType == 'function'){
|
121
|
-
return compares(a, b, aParent, bParent)
|
122
|
-
}
|
123
|
-
compares = compares || {};
|
124
|
-
|
125
|
-
if(a instanceof Date){
|
126
|
-
return a === b;
|
127
|
-
}
|
128
|
-
if(deep === -1){
|
129
|
-
return aType === 'object' || a === b;
|
130
|
-
}
|
131
|
-
if(aType !== typeof b || aArray !== isArray(b)){
|
132
|
-
return false;
|
133
|
-
}
|
134
|
-
if(a === b){
|
135
|
-
return true;
|
136
|
-
}
|
137
|
-
if(aArray){
|
138
|
-
if(a.length !== b.length){
|
46
|
+
if (a instanceof Date) {
|
47
|
+
return a === b;
|
48
|
+
}
|
49
|
+
if (deep === -1) {
|
50
|
+
return aType === 'object' || a === b;
|
51
|
+
}
|
52
|
+
if (aType !== typeof b || aArray !== isArray(b)) {
|
139
53
|
return false;
|
140
54
|
}
|
141
|
-
|
142
|
-
|
143
|
-
|
55
|
+
if (a === b) {
|
56
|
+
return true;
|
57
|
+
}
|
58
|
+
if (aArray) {
|
59
|
+
if (a.length !== b.length) {
|
144
60
|
return false;
|
145
61
|
}
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
62
|
+
for (var i = 0; i < a.length; i++) {
|
63
|
+
compare = compares[i] === undefined ? compares["*"] : compares[i]
|
64
|
+
if (!same(a[i], b[i], a, b, compare)) {
|
65
|
+
return false;
|
66
|
+
}
|
67
|
+
};
|
68
|
+
return true;
|
69
|
+
} else if (aType === "object" || aType === 'function') {
|
70
|
+
var bCopy = can.extend({}, b);
|
71
|
+
for (var prop in a) {
|
72
|
+
compare = compares[prop] === undefined ? compares["*"] : compares[prop];
|
73
|
+
if (!same(a[prop], b[prop], compare, a, b, deep === false ? -1 : undefined)) {
|
74
|
+
return false;
|
75
|
+
}
|
76
|
+
delete bCopy[prop];
|
77
|
+
}
|
78
|
+
// go through bCopy props ... if there is no compare .. return false
|
79
|
+
for (prop in bCopy) {
|
80
|
+
if (compares[prop] === undefined || !same(undefined, b[prop], compares[prop], a, b, deep === false ? -1 : undefined)) {
|
81
|
+
return false;
|
82
|
+
}
|
154
83
|
}
|
155
|
-
|
84
|
+
return true;
|
156
85
|
}
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
86
|
+
return false;
|
87
|
+
};
|
88
|
+
|
89
|
+
can.Object.subsets = function (checkSet, sets, compares) {
|
90
|
+
var len = sets.length,
|
91
|
+
subsets = [],
|
92
|
+
checkPropCount = propCount(checkSet),
|
93
|
+
setLength;
|
94
|
+
|
95
|
+
for (var i = 0; i < len; i++) {
|
96
|
+
//check this subset
|
97
|
+
var set = sets[i];
|
98
|
+
if (can.Object.subset(checkSet, set, compares)) {
|
99
|
+
subsets.push(set)
|
100
|
+
}
|
101
|
+
}
|
102
|
+
return subsets;
|
103
|
+
};
|
104
|
+
|
105
|
+
can.Object.subset = function (subset, set, compares) {
|
106
|
+
// go through set {type: 'folder'} and make sure every property
|
107
|
+
// is in subset {type: 'folder', parentId :5}
|
108
|
+
// then make sure that set has fewer properties
|
109
|
+
// make sure we are only checking 'important' properties
|
110
|
+
// in subset (ones that have to have a value)
|
111
|
+
var setPropCount = 0,
|
112
|
+
compares = compares || {};
|
113
|
+
|
114
|
+
for (var prop in set) {
|
115
|
+
|
116
|
+
if (!same(subset[prop], set[prop], compares[prop], subset, set)) {
|
161
117
|
return false;
|
162
118
|
}
|
163
119
|
}
|
164
120
|
return true;
|
165
|
-
}
|
166
|
-
return false;
|
167
|
-
};
|
168
|
-
|
169
|
-
/**
|
170
|
-
* @function subsets
|
171
|
-
* Returns the sets in 'sets' that are a subset of checkSet
|
172
|
-
* @param {Object} checkSet
|
173
|
-
* @param {Object} sets
|
174
|
-
*/
|
175
|
-
can.Object.subsets = function(checkSet, sets, compares){
|
176
|
-
var len = sets.length,
|
177
|
-
subsets = [],
|
178
|
-
checkPropCount = propCount(checkSet),
|
179
|
-
setLength;
|
180
|
-
|
181
|
-
for(var i =0; i < len; i++){
|
182
|
-
//check this subset
|
183
|
-
var set = sets[i];
|
184
|
-
if( can.Object.subset(checkSet, set, compares) ){
|
185
|
-
subsets.push(set)
|
186
|
-
}
|
187
121
|
}
|
188
|
-
return subsets;
|
189
|
-
};
|
190
|
-
/**
|
191
|
-
* @function subset
|
192
|
-
* Compares if checkSet is a subset of set
|
193
|
-
* @param {Object} checkSet
|
194
|
-
* @param {Object} set
|
195
|
-
* @param {Object} [compares]
|
196
|
-
* @param {Object} [checkPropCount]
|
197
|
-
*/
|
198
|
-
can.Object.subset = function(subset, set, compares){
|
199
|
-
// go through set {type: 'folder'} and make sure every property
|
200
|
-
// is in subset {type: 'folder', parentId :5}
|
201
|
-
// then make sure that set has fewer properties
|
202
|
-
// make sure we are only checking 'important' properties
|
203
|
-
// in subset (ones that have to have a value)
|
204
|
-
|
205
|
-
var setPropCount =0,
|
206
|
-
compares = compares || {};
|
207
|
-
|
208
|
-
for(var prop in set){
|
209
122
|
|
210
|
-
|
211
|
-
|
212
|
-
|
123
|
+
var compareMethods = {
|
124
|
+
"null": function () {
|
125
|
+
return true;
|
126
|
+
},
|
127
|
+
i: function (a, b) {
|
128
|
+
return ("" + a).toLowerCase() == ("" + b).toLowerCase()
|
129
|
+
}
|
213
130
|
}
|
214
|
-
return true;
|
215
|
-
}
|
216
131
|
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
132
|
+
// ## can/util/fixture/fixture.js
|
133
|
+
// Get the URL from old Steal root, new Steal config or can.fixture.rootUrl
|
134
|
+
var getUrl = function (url) {
|
135
|
+
if (typeof steal !== 'undefined') {
|
136
|
+
if (can.isFunction(steal.config)) {
|
137
|
+
return steal.config().root.mapJoin(url).toString();
|
138
|
+
}
|
139
|
+
return steal.root.join(url).toString();
|
140
|
+
}
|
141
|
+
return (can.fixture.rootUrl || '') + url;
|
224
142
|
}
|
225
|
-
}
|
226
|
-
|
227
|
-
|
228
|
-
;
|
229
|
-
|
230
143
|
|
231
144
|
var updateSettings = function (settings, originalOptions) {
|
232
|
-
|
233
|
-
|
234
|
-
|
145
|
+
if (!can.fixture.on) {
|
146
|
+
return;
|
147
|
+
}
|
235
148
|
|
236
|
-
|
237
|
-
|
149
|
+
//simple wrapper for logging
|
150
|
+
var _logger = function (type, arr) {
|
151
|
+
if (console.log.apply) {
|
152
|
+
Function.prototype.call.apply(console[type], [console].concat(arr));
|
153
|
+
// console[type].apply(console, arr)
|
154
|
+
} else {
|
155
|
+
console[type](arr)
|
156
|
+
}
|
157
|
+
},
|
158
|
+
log = function () {
|
238
159
|
if (window.console && console.log) {
|
239
|
-
|
160
|
+
Array.prototype.unshift.call(arguments, 'fixture INFO:');
|
161
|
+
_logger("log", Array.prototype.slice.call(arguments));
|
162
|
+
}
|
163
|
+
else if (window.opera && window.opera.postError) {
|
164
|
+
opera.postError("fixture INFO: " + Array.prototype.join.call(arguments, ','));
|
240
165
|
}
|
241
166
|
}
|
242
167
|
|
243
168
|
// We always need the type which can also be called method, default to GET
|
244
169
|
settings.type = settings.type || settings.method || 'GET';
|
245
170
|
|
246
|
-
|
247
|
-
|
171
|
+
// add the fixture option if programmed in
|
172
|
+
var data = overwrite(settings);
|
248
173
|
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
}
|
254
|
-
return;
|
174
|
+
// if we don't have a fixture, do nothing
|
175
|
+
if (!settings.fixture) {
|
176
|
+
if (window.location.protocol === "file:") {
|
177
|
+
log("ajax request to " + settings.url + ", no fixture found");
|
255
178
|
}
|
179
|
+
return;
|
180
|
+
}
|
181
|
+
|
182
|
+
//if referencing something else, update the fixture option
|
183
|
+
if (typeof settings.fixture === "string" && can.fixture[settings.fixture]) {
|
184
|
+
settings.fixture = can.fixture[settings.fixture];
|
185
|
+
}
|
256
186
|
|
257
|
-
|
258
|
-
|
259
|
-
|
187
|
+
// if a string, we just point to the right url
|
188
|
+
if (typeof settings.fixture == "string") {
|
189
|
+
var url = settings.fixture;
|
190
|
+
|
191
|
+
if (/^\/\//.test(url)) {
|
192
|
+
// this lets us use rootUrl w/o having steal...
|
193
|
+
url = getUrl(settings.fixture.substr(2));
|
260
194
|
}
|
261
195
|
|
262
|
-
|
263
|
-
|
264
|
-
|
196
|
+
if (data) {
|
197
|
+
// Template static fixture URLs
|
198
|
+
url = can.sub(url, data);
|
199
|
+
}
|
265
200
|
|
266
|
-
|
267
|
-
// this lets us use rootUrl w/o having steal...
|
268
|
-
url = can.fixture.rootUrl === steal.root ?
|
269
|
-
steal.root.mapJoin(settings.fixture.substr(2)) + '' :
|
270
|
-
can.fixture.rootUrl + settings.fixture.substr(2);
|
271
|
-
}
|
201
|
+
delete settings.fixture;
|
272
202
|
|
273
|
-
delete settings.fixture;
|
274
203
|
|
275
|
-
//@steal-remove-start
|
276
|
-
log("looking for fixture in " + url);
|
277
|
-
//@steal-remove-end
|
278
204
|
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
}
|
205
|
+
settings.url = url;
|
206
|
+
settings.data = null;
|
207
|
+
settings.type = "GET";
|
208
|
+
if (!settings.error) {
|
209
|
+
settings.error = function (xhr, error, message) {
|
210
|
+
throw "fixtures.js Error " + error + " " + message;
|
211
|
+
};
|
287
212
|
}
|
288
|
-
|
289
|
-
|
290
|
-
log("using a dynamic fixture for " + settings.type + " " + settings.url);
|
291
|
-
//@steal-remove-end
|
213
|
+
}
|
214
|
+
else {
|
292
215
|
|
293
|
-
//it's a function ... add the fixture datatype so our fixture transport handles it
|
294
|
-
// TODO: make everything go here for timing and other fun stuff
|
295
|
-
// add to settings data from fixture ...
|
296
|
-
settings.dataTypes && settings.dataTypes.splice(0, 0, "fixture");
|
297
216
|
|
298
|
-
|
299
|
-
|
300
|
-
|
217
|
+
//it's a function ... add the fixture datatype so our fixture transport handles it
|
218
|
+
// TODO: make everything go here for timing and other fun stuff
|
219
|
+
// add to settings data from fixture ...
|
220
|
+
settings.dataTypes && settings.dataTypes.splice(0, 0, "fixture");
|
221
|
+
|
222
|
+
if (data && originalOptions) {
|
223
|
+
can.extend(originalOptions.data, data)
|
301
224
|
}
|
302
|
-
}
|
225
|
+
}
|
226
|
+
},
|
303
227
|
// A helper function that takes what's called with response
|
304
228
|
// and moves some common args around to make it easier to call
|
305
|
-
extractResponse = function(status, statusText, responses, headers) {
|
229
|
+
extractResponse = function (status, statusText, responses, headers) {
|
306
230
|
// if we get response(RESPONSES, HEADERS)
|
307
|
-
if(typeof status != "number"){
|
231
|
+
if (typeof status != "number") {
|
308
232
|
headers = statusText;
|
309
233
|
responses = status;
|
310
234
|
statusText = "success"
|
311
235
|
status = 200;
|
312
236
|
}
|
313
237
|
// if we get response(200, RESPONSES, HEADERS)
|
314
|
-
if(typeof statusText != "string"){
|
238
|
+
if (typeof statusText != "string") {
|
315
239
|
headers = responses;
|
316
240
|
responses = statusText;
|
317
241
|
statusText = "success";
|
318
242
|
}
|
243
|
+
if (status >= 400 && status <= 599) {
|
244
|
+
this.dataType = "text"
|
245
|
+
}
|
319
246
|
return [status, statusText, extractResponses(this, responses), headers];
|
320
247
|
},
|
321
248
|
// If we get data instead of responses,
|
322
249
|
// make sure we provide a response type that matches the first datatype (typically json)
|
323
|
-
extractResponses = function(settings, responses){
|
250
|
+
extractResponses = function (settings, responses) {
|
324
251
|
var next = settings.dataTypes ? settings.dataTypes[0] : (settings.dataType || 'json');
|
325
252
|
if (!responses || !responses[next]) {
|
326
253
|
var tmp = {}
|
@@ -349,14 +276,14 @@ var compareMethods = {
|
|
349
276
|
// we'll immediately wait the delay time for all fixtures
|
350
277
|
timeout = setTimeout(function () {
|
351
278
|
// if the user wants to call success on their own, we allow it ...
|
352
|
-
var success = function() {
|
353
|
-
if(stopped === false) {
|
354
|
-
callback.apply(null, extractResponse.apply(s, arguments)
|
279
|
+
var success = function () {
|
280
|
+
if (stopped === false) {
|
281
|
+
callback.apply(null, extractResponse.apply(s, arguments));
|
355
282
|
}
|
356
283
|
},
|
357
|
-
|
358
|
-
|
359
|
-
if(result !== undefined) {
|
284
|
+
// get the result form the fixture
|
285
|
+
result = s.fixture(original, success, headers, s);
|
286
|
+
if (result !== undefined) {
|
360
287
|
// make sure the result has the right dataType
|
361
288
|
callback(200, "success", extractResponses(s, result), {});
|
362
289
|
}
|
@@ -377,8 +304,7 @@ var compareMethods = {
|
|
377
304
|
stopped = false;
|
378
305
|
|
379
306
|
//TODO this should work with response
|
380
|
-
d.getResponseHeader = function () {
|
381
|
-
}
|
307
|
+
d.getResponseHeader = function () {}
|
382
308
|
|
383
309
|
// call success and fail
|
384
310
|
d.then(settings.success, settings.fail);
|
@@ -392,24 +318,24 @@ var compareMethods = {
|
|
392
318
|
// set a timeout that simulates making a request ....
|
393
319
|
timeout = setTimeout(function () {
|
394
320
|
// if the user wants to call success on their own, we allow it ...
|
395
|
-
var success = function() {
|
321
|
+
var success = function () {
|
396
322
|
var response = extractResponse.apply(settings, arguments),
|
397
323
|
status = response[0];
|
398
324
|
|
399
|
-
if (
|
400
|
-
d.resolve(response[2][settings.dataType]
|
325
|
+
if ((status >= 200 && status < 300 || status === 304) && stopped === false) {
|
326
|
+
d.resolve(response[2][settings.dataType])
|
401
327
|
} else {
|
402
328
|
// TODO probably resolve better
|
403
329
|
d.reject(d, 'error', response[1]);
|
404
330
|
}
|
405
331
|
},
|
406
|
-
|
407
|
-
|
408
|
-
if(result !== undefined) {
|
409
|
-
d.resolve(result
|
332
|
+
// get the result form the fixture
|
333
|
+
result = settings.fixture(settings, success, settings.headers, settings);
|
334
|
+
if (result !== undefined) {
|
335
|
+
d.resolve(result)
|
410
336
|
}
|
411
337
|
}, can.fixture.delay);
|
412
|
-
|
338
|
+
|
413
339
|
return d;
|
414
340
|
} else {
|
415
341
|
return AJAX(settings);
|
@@ -417,10 +343,10 @@ var compareMethods = {
|
|
417
343
|
}
|
418
344
|
}
|
419
345
|
|
420
|
-
var typeTest = /^(script|json|
|
421
|
-
|
346
|
+
var typeTest = /^(script|json|text|jsonp)$/,
|
347
|
+
// a list of 'overwrite' settings object
|
422
348
|
overwrites = [],
|
423
|
-
|
349
|
+
// returns the index of an overwrite function
|
424
350
|
find = function (settings, exact) {
|
425
351
|
for (var i = 0; i < overwrites.length; i++) {
|
426
352
|
if ($fixture._similar(settings, overwrites[i], exact)) {
|
@@ -429,7 +355,7 @@ var compareMethods = {
|
|
429
355
|
}
|
430
356
|
return -1;
|
431
357
|
},
|
432
|
-
|
358
|
+
// overwrites the settings fixture if an overwrite matches
|
433
359
|
overwrite = function (settings) {
|
434
360
|
var index = find(settings);
|
435
361
|
if (index > -1) {
|
@@ -438,24 +364,15 @@ var compareMethods = {
|
|
438
364
|
}
|
439
365
|
|
440
366
|
},
|
441
|
-
|
442
|
-
|
443
|
-
* @param {Object} settings
|
444
|
-
*/
|
445
|
-
getId = function (settings) {
|
367
|
+
|
368
|
+
getId = function (settings) {
|
446
369
|
var id = settings.data.id;
|
447
370
|
|
448
371
|
if (id === undefined && typeof settings.data === "number") {
|
449
372
|
id = settings.data;
|
450
373
|
}
|
451
374
|
|
452
|
-
|
453
|
-
Check for id in params(if query string)
|
454
|
-
If this is just a string representation of an id, parse
|
455
|
-
if(id === undefined && typeof settings.data === "string") {
|
456
|
-
id = settings.data;
|
457
|
-
}
|
458
|
-
//*/
|
375
|
+
|
459
376
|
|
460
377
|
if (id === undefined) {
|
461
378
|
settings.url.replace(/\/(\d+)(\/|$|\.)/g, function (all, num) {
|
@@ -478,36 +395,7 @@ var compareMethods = {
|
|
478
395
|
return id;
|
479
396
|
};
|
480
397
|
|
481
|
-
|
482
|
-
* @plugin can/util/fixture
|
483
|
-
* @test can/util/fixture/qunit.html
|
484
|
-
*
|
485
|
-
* `can.fixture` intercept an AJAX request and simulates the response with a file or function.
|
486
|
-
* Read more about the usage in the [overview can.fixture].
|
487
|
-
*
|
488
|
-
* @param {Object|String} settings Configures the AJAX requests the fixture should
|
489
|
-
* intercept. If an __object__ is passed, the object's properties and values
|
490
|
-
* are matched against the settings passed to can.ajax.
|
491
|
-
*
|
492
|
-
* If a __string__ is passed, it can be used to match the url and type. Urls
|
493
|
-
* can be templated, using <code>{NAME}</code> as wildcards.
|
494
|
-
*
|
495
|
-
* @param {Function|String} fixture The response to use for the AJAX
|
496
|
-
* request. If a __string__ url is passed, the ajax request is redirected
|
497
|
-
* to the url. If a __function__ is provided, it looks like:
|
498
|
-
*
|
499
|
-
* fixture( originalSettings, settings, callback, headers)
|
500
|
-
*
|
501
|
-
* where:
|
502
|
-
*
|
503
|
-
* - originalSettings - the orignal settings passed to can.ajax
|
504
|
-
* - settings - the settings after all filters have run
|
505
|
-
* - callback - a callback to call with the response if the fixture executes asynchronously
|
506
|
-
* - headers - request headers
|
507
|
-
*
|
508
|
-
* If __null__ is passed, and there is a fixture at settings, that fixture will be removed,
|
509
|
-
* allowing the AJAX request to behave normally.
|
510
|
-
*/
|
398
|
+
|
511
399
|
var $fixture = can.fixture = function (settings, fixture) {
|
512
400
|
// if we provide a fixture ...
|
513
401
|
if (fixture !== undefined) {
|
@@ -516,19 +404,19 @@ var compareMethods = {
|
|
516
404
|
var matches = settings.match(/(GET|POST|PUT|DELETE) (.+)/i);
|
517
405
|
if (!matches) {
|
518
406
|
settings = {
|
519
|
-
url
|
407
|
+
url: settings
|
520
408
|
};
|
521
409
|
} else {
|
522
410
|
settings = {
|
523
|
-
url
|
524
|
-
type
|
411
|
+
url: matches[2],
|
412
|
+
type: matches[1]
|
525
413
|
};
|
526
414
|
}
|
527
415
|
|
528
416
|
}
|
529
417
|
|
530
418
|
//handle removing. An exact match if fixture was provided, otherwise, anything similar
|
531
|
-
var index = find(settings, !!fixture);
|
419
|
+
var index = find(settings, !! fixture);
|
532
420
|
if (index > -1) {
|
533
421
|
overwrites.splice(index, 1)
|
534
422
|
}
|
@@ -538,7 +426,7 @@ var compareMethods = {
|
|
538
426
|
settings.fixture = fixture;
|
539
427
|
overwrites.push(settings)
|
540
428
|
} else {
|
541
|
-
can.each(settings, function(fixture, url){
|
429
|
+
can.each(settings, function (fixture, url) {
|
542
430
|
$fixture(url, fixture);
|
543
431
|
})
|
544
432
|
}
|
@@ -547,22 +435,24 @@ var compareMethods = {
|
|
547
435
|
|
548
436
|
can.extend(can.fixture, {
|
549
437
|
// given ajax settings, find an overwrite
|
550
|
-
_similar
|
438
|
+
_similar: function (settings, overwrite, exact) {
|
551
439
|
if (exact) {
|
552
|
-
return can.Object.same(settings, overwrite, {
|
440
|
+
return can.Object.same(settings, overwrite, {
|
441
|
+
fixture: null
|
442
|
+
})
|
553
443
|
} else {
|
554
444
|
return can.Object.subset(settings, overwrite, can.fixture._compare)
|
555
445
|
}
|
556
446
|
},
|
557
|
-
_compare
|
558
|
-
url
|
447
|
+
_compare: {
|
448
|
+
url: function (a, b) {
|
559
449
|
return !!$fixture._getData(b, a)
|
560
450
|
},
|
561
|
-
fixture
|
562
|
-
type
|
451
|
+
fixture: null,
|
452
|
+
type: "i"
|
563
453
|
},
|
564
454
|
// gets data from a url like "/todo/{id}" given "todo/5"
|
565
|
-
_getData
|
455
|
+
_getData: function (fixtureUrl, url) {
|
566
456
|
var order = [],
|
567
457
|
fixtureUrlAdjusted = fixtureUrl.replace('.', '\\.').replace('?', '\\?'),
|
568
458
|
res = new RegExp(fixtureUrlAdjusted.replace(replacer, function (whole, part) {
|
@@ -581,95 +471,10 @@ var compareMethods = {
|
|
581
471
|
return data;
|
582
472
|
},
|
583
473
|
|
584
|
-
make
|
585
|
-
|
586
|
-
|
587
|
-
|
588
|
-
*
|
589
|
-
* `can.fixture.make` is used for findAll / findOne style requests.
|
590
|
-
*
|
591
|
-
* ## With can.ajax
|
592
|
-
*
|
593
|
-
* //makes a nested list of messages
|
594
|
-
* can.fixture.make(["messages","message"], 1000,
|
595
|
-
* function(i, messages){
|
596
|
-
* return {
|
597
|
-
* subject: "This is message "+i,
|
598
|
-
* body: "Here is some text for this message",
|
599
|
-
* date: Math.floor( new Date().getTime() ),
|
600
|
-
* parentId : i < 100 ? null : Math.floor(Math.random()*i)
|
601
|
-
* }
|
602
|
-
* })
|
603
|
-
* //uses the message fixture to return messages limited by
|
604
|
-
* // offset, limit, order, etc.
|
605
|
-
* can.ajax({
|
606
|
-
* url: "messages",
|
607
|
-
* data: {
|
608
|
-
* offset: 100,
|
609
|
-
* limit: 50,
|
610
|
-
* order: ["date ASC"],
|
611
|
-
* parentId: 5},
|
612
|
-
* },
|
613
|
-
* fixture: "-messages",
|
614
|
-
* success: function( messages ) { ... }
|
615
|
-
* });
|
616
|
-
*
|
617
|
-
* ## With can.Model
|
618
|
-
*
|
619
|
-
* `can.fixture.make` returns a model store that offers `findAll`, `findOne`, `create`,
|
620
|
-
* `update` and `destroy` fixture functions you can map to a [can.Model] Ajax request.
|
621
|
-
* Consider a model like this:
|
622
|
-
*
|
623
|
-
* var Todo = can.Model({
|
624
|
-
* findAll : 'GET /todos',
|
625
|
-
* findOne : 'GET /todos/{id}',
|
626
|
-
* create : 'POST /todos',
|
627
|
-
* update : 'PUT /todos/{id}',
|
628
|
-
* destroy : 'DELETE /todos/{id}'
|
629
|
-
* }, {});
|
630
|
-
*
|
631
|
-
* And an unnamed generated fixture like this:
|
632
|
-
*
|
633
|
-
* var store = can.fixture.make(100, function(i) {
|
634
|
-
* return {
|
635
|
-
* id : i,
|
636
|
-
* name : 'Todo ' + i
|
637
|
-
* }
|
638
|
-
* });
|
639
|
-
*
|
640
|
-
* You can map can.Model requests using the return value of `can.fixture.make`:
|
641
|
-
*
|
642
|
-
* can.fixture('GET /todos', store.findAll);
|
643
|
-
* can.fixture('GET /todos/{id}', store.findOne);
|
644
|
-
* can.fixture('POST /todos', store.create);
|
645
|
-
* can.fixture('PUT /todos/{id}', store.update);
|
646
|
-
* can.fixture('DELETE /todos/{id}', store.destroy);
|
647
|
-
*
|
648
|
-
* @param {Array|String} types An array of the fixture names or the singular fixture name.
|
649
|
-
* If an array, the first item is the plural fixture name (prefixed with -) and the second
|
650
|
-
* item is the singular name. If a string, it's assumed to be the singular fixture name. Make
|
651
|
-
* will simply add s to the end of it for the plural name. If this parameter is not an array
|
652
|
-
* or a String the fixture won't be added and only return the generator object.
|
653
|
-
* @param {Number} count the number of items to create
|
654
|
-
* @param {Function} make a function that will return the JavaScript object. The
|
655
|
-
* make function is called back with the id and the current array of items.
|
656
|
-
* @param {Function} filter (optional) a function used to further filter results. Used for to simulate
|
657
|
-
* server params like searchText or startDate.
|
658
|
-
* The function should return true if the item passes the filter,
|
659
|
-
* false otherwise. For example:
|
660
|
-
*
|
661
|
-
*
|
662
|
-
* function(item, settings){
|
663
|
-
* if(settings.data.searchText){
|
664
|
-
* var regex = new RegExp("^"+settings.data.searchText)
|
665
|
-
* return regex.test(item.name);
|
666
|
-
* }
|
667
|
-
* }
|
668
|
-
*
|
669
|
-
* @return {Object} A generator object providing fixture functions for *findAll*, *findOne*, *create*,
|
670
|
-
* *update* and *destroy*.
|
671
|
-
*/
|
672
|
-
var items = [], // TODO: change this to a hash
|
474
|
+
make: function (types, count, make, filter) {
|
475
|
+
|
476
|
+
var items = [],
|
477
|
+
// TODO: change this to a hash
|
673
478
|
findOne = function (id) {
|
674
479
|
for (var i = 0; i < items.length; i++) {
|
675
480
|
if (id == items[i].id) {
|
@@ -680,7 +485,7 @@ var compareMethods = {
|
|
680
485
|
methods = {};
|
681
486
|
|
682
487
|
if (typeof types === "string") {
|
683
|
-
types = [types + "s", types
|
488
|
+
types = [types + "s", types]
|
684
489
|
} else if (!can.isArray(types)) {
|
685
490
|
filter = make;
|
686
491
|
make = count;
|
@@ -689,7 +494,7 @@ var compareMethods = {
|
|
689
494
|
|
690
495
|
// make all items
|
691
496
|
can.extend(methods, {
|
692
|
-
findAll
|
497
|
+
findAll: function (settings) {
|
693
498
|
//copy array of items
|
694
499
|
var retArr = items.slice(0);
|
695
500
|
settings.data = settings.data || {};
|
@@ -727,7 +532,6 @@ var compareMethods = {
|
|
727
532
|
});
|
728
533
|
});
|
729
534
|
|
730
|
-
|
731
535
|
var offset = parseInt(settings.data.offset, 10) || 0,
|
732
536
|
limit = parseInt(settings.data.limit, 10) || (items.length - offset),
|
733
537
|
i = 0;
|
@@ -736,7 +540,7 @@ var compareMethods = {
|
|
736
540
|
for (var param in settings.data) {
|
737
541
|
i = 0;
|
738
542
|
if (settings.data[param] !== undefined && // don't do this if the value of the param is null (ignore it)
|
739
|
-
|
543
|
+
(param.indexOf("Id") != -1 || param.indexOf("_id") != -1)) {
|
740
544
|
while (i < retArr.length) {
|
741
545
|
if (settings.data[param] != retArr[i][param]) {
|
742
546
|
retArr.splice(i, 1);
|
@@ -760,28 +564,28 @@ var compareMethods = {
|
|
760
564
|
|
761
565
|
//return data spliced with limit and offset
|
762
566
|
return {
|
763
|
-
"count"
|
764
|
-
"limit"
|
765
|
-
"offset"
|
766
|
-
"data"
|
567
|
+
"count": retArr.length,
|
568
|
+
"limit": settings.data.limit,
|
569
|
+
"offset": settings.data.offset,
|
570
|
+
"data": retArr.slice(offset, offset + limit)
|
767
571
|
};
|
768
572
|
},
|
769
|
-
findOne
|
573
|
+
findOne: function (orig, response) {
|
770
574
|
var item = findOne(getId(orig));
|
771
575
|
response(item ? item : undefined);
|
772
576
|
},
|
773
|
-
update
|
577
|
+
update: function (orig, response) {
|
774
578
|
var id = getId(orig);
|
775
579
|
|
776
580
|
// TODO: make it work with non-linear ids ..
|
777
581
|
can.extend(findOne(id), orig.data);
|
778
582
|
response({
|
779
|
-
id
|
583
|
+
id: getId(orig)
|
780
584
|
}, {
|
781
|
-
location
|
585
|
+
location: orig.url + "/" + getId(orig)
|
782
586
|
});
|
783
587
|
},
|
784
|
-
destroy
|
588
|
+
destroy: function (settings) {
|
785
589
|
var id = getId(settings);
|
786
590
|
for (var i = 0; i < items.length; i++) {
|
787
591
|
if (items[i].id == id) {
|
@@ -794,7 +598,7 @@ var compareMethods = {
|
|
794
598
|
can.extend(findOne(id) || {}, settings.data);
|
795
599
|
return {};
|
796
600
|
},
|
797
|
-
create
|
601
|
+
create: function (settings, response) {
|
798
602
|
var item = make(items.length, items);
|
799
603
|
|
800
604
|
can.extend(item, settings.data);
|
@@ -806,9 +610,9 @@ var compareMethods = {
|
|
806
610
|
items.push(item);
|
807
611
|
var id = item.id || parseInt(Math.random() * 100000, 10);
|
808
612
|
response({
|
809
|
-
id
|
613
|
+
id: id
|
810
614
|
}, {
|
811
|
-
location
|
615
|
+
location: settings.url + "/" + id
|
812
616
|
})
|
813
617
|
}
|
814
618
|
});
|
@@ -824,62 +628,24 @@ var compareMethods = {
|
|
824
628
|
}
|
825
629
|
|
826
630
|
// if we have types given add them to can.fixture
|
827
|
-
if(can.isArray(types)) {
|
631
|
+
if (can.isArray(types)) {
|
828
632
|
can.fixture["~" + types[0]] = items;
|
829
633
|
can.fixture["-" + types[0]] = methods.findAll;
|
830
634
|
can.fixture["-" + types[1]] = methods.findOne;
|
831
|
-
can.fixture["-" + types[1]+"Update"] = methods.update;
|
832
|
-
can.fixture["-" + types[1]+"Destroy"] = methods.destroy;
|
833
|
-
can.fixture["-" + types[1]+"Create"] = methods.create;
|
635
|
+
can.fixture["-" + types[1] + "Update"] = methods.update;
|
636
|
+
can.fixture["-" + types[1] + "Destroy"] = methods.destroy;
|
637
|
+
can.fixture["-" + types[1] + "Create"] = methods.create;
|
834
638
|
}
|
835
639
|
|
836
640
|
return can.extend({
|
837
641
|
getId: getId,
|
838
|
-
find
|
839
|
-
return findOne(
|
642
|
+
find: function (settings) {
|
643
|
+
return findOne(getId(settings));
|
840
644
|
}
|
841
645
|
}, methods);
|
842
646
|
},
|
843
|
-
|
844
|
-
|
845
|
-
* @parent can.fixture
|
846
|
-
*
|
847
|
-
* `can.fixture.rand` creates random integers or random arrays of
|
848
|
-
* other arrays.
|
849
|
-
*
|
850
|
-
* ## Examples
|
851
|
-
*
|
852
|
-
* var rand = can.fixture.rand;
|
853
|
-
*
|
854
|
-
* // get a random integer between 0 and 10 (inclusive)
|
855
|
-
* rand(11);
|
856
|
-
*
|
857
|
-
* // get a random number between -5 and 5 (inclusive)
|
858
|
-
* rand(-5, 6);
|
859
|
-
*
|
860
|
-
* // pick a random item from an array
|
861
|
-
* rand(["j","m","v","c"],1)[0]
|
862
|
-
*
|
863
|
-
* // pick a random number of items from an array
|
864
|
-
* rand(["j","m","v","c"])
|
865
|
-
*
|
866
|
-
* // pick 2 items from an array
|
867
|
-
* rand(["j","m","v","c"],2)
|
868
|
-
*
|
869
|
-
* // pick between 2 and 3 items at random
|
870
|
-
* rand(["j","m","v","c"],2,3)
|
871
|
-
*
|
872
|
-
*
|
873
|
-
* @param {Array|Number} arr An array of items to select from.
|
874
|
-
* If a number is provided, a random number is returned.
|
875
|
-
* If min and max are not provided, a random number of items are selected
|
876
|
-
* from this array.
|
877
|
-
* @param {Number} [min] If only min is provided, min items
|
878
|
-
* are selected.
|
879
|
-
* @param {Number} [max] If min and max are provided, a random number of
|
880
|
-
* items between min and max (inclusive) is selected.
|
881
|
-
*/
|
882
|
-
rand : function (arr, min, max) {
|
647
|
+
|
648
|
+
rand: function (arr, min, max) {
|
883
649
|
if (typeof arr == 'number') {
|
884
650
|
if (typeof min == 'number') {
|
885
651
|
return arr + Math.floor(Math.random() * (min - arr));
|
@@ -907,95 +673,35 @@ var compareMethods = {
|
|
907
673
|
}
|
908
674
|
return res;
|
909
675
|
},
|
910
|
-
|
911
|
-
|
912
|
-
*
|
913
|
-
* Use can.fixture.xhr to create an object that looks like an xhr object.
|
914
|
-
*
|
915
|
-
* ## Example
|
916
|
-
*
|
917
|
-
* The following example shows how the -restCreate fixture uses xhr to return
|
918
|
-
* a simulated xhr object:
|
919
|
-
* @codestart
|
920
|
-
* "-restCreate" : function( settings, cbType ) {
|
921
|
-
* switch(cbType){
|
922
|
-
* case "success":
|
923
|
-
* return [
|
924
|
-
* {id: parseInt(Math.random()*1000)},
|
925
|
-
* "success",
|
926
|
-
* can.fixture.xhr()];
|
927
|
-
* case "complete":
|
928
|
-
* return [
|
929
|
-
* can.fixture.xhr({
|
930
|
-
* getResponseHeader: function() {
|
931
|
-
* return settings.url+"/"+parseInt(Math.random()*1000);
|
932
|
-
* }
|
933
|
-
* }),
|
934
|
-
* "success"];
|
935
|
-
* }
|
936
|
-
* }
|
937
|
-
* @codeend
|
938
|
-
* @param {Object} [xhr] properties that you want to overwrite
|
939
|
-
* @return {Object} an object that looks like a successful XHR object.
|
940
|
-
*/
|
941
|
-
xhr : function (xhr) {
|
676
|
+
|
677
|
+
xhr: function (xhr) {
|
942
678
|
return can.extend({}, {
|
943
|
-
abort
|
944
|
-
getAllResponseHeaders
|
679
|
+
abort: can.noop,
|
680
|
+
getAllResponseHeaders: function () {
|
945
681
|
return "";
|
946
682
|
},
|
947
|
-
getResponseHeader
|
683
|
+
getResponseHeader: function () {
|
948
684
|
return "";
|
949
685
|
},
|
950
|
-
open
|
951
|
-
overrideMimeType
|
952
|
-
readyState
|
953
|
-
responseText
|
954
|
-
responseXML
|
955
|
-
send
|
956
|
-
setRequestHeader
|
957
|
-
status
|
958
|
-
statusText
|
686
|
+
open: can.noop,
|
687
|
+
overrideMimeType: can.noop,
|
688
|
+
readyState: 4,
|
689
|
+
responseText: "",
|
690
|
+
responseXML: null,
|
691
|
+
send: can.noop,
|
692
|
+
setRequestHeader: can.noop,
|
693
|
+
status: 200,
|
694
|
+
statusText: "OK"
|
959
695
|
}, xhr);
|
960
696
|
},
|
961
|
-
|
962
|
-
|
963
|
-
* @parent can.fixture
|
964
|
-
*
|
965
|
-
* `can.fixture.on` lets you programatically turn off fixtures. This is mostly used for testing.
|
966
|
-
*
|
967
|
-
* can.fixture.on = false
|
968
|
-
* Task.findAll({}, function(){
|
969
|
-
* can.fixture.on = true;
|
970
|
-
* })
|
971
|
-
*/
|
972
|
-
on : true
|
697
|
+
|
698
|
+
on: true
|
973
699
|
});
|
974
|
-
|
975
|
-
* @attribute can.fixture.delay
|
976
|
-
* @parent can.fixture
|
977
|
-
*
|
978
|
-
* `can.fixture.delay` indicates the delay in milliseconds between an ajax request is made and
|
979
|
-
* the success and complete handlers are called. This only sets
|
980
|
-
* functional synchronous fixtures that return a result. By default, the delay is 200ms.
|
981
|
-
*
|
982
|
-
* @codestart
|
983
|
-
* steal('can/util/fixtures').then(function(){
|
984
|
-
* can.fixture.delay = 1000;
|
985
|
-
* })
|
986
|
-
* @codeend
|
987
|
-
*/
|
700
|
+
|
988
701
|
can.fixture.delay = 200;
|
989
702
|
|
990
|
-
|
991
|
-
|
992
|
-
* @parent can.fixture
|
993
|
-
*
|
994
|
-
* `can.fixture.rootUrl` contains the root URL for fixtures to use.
|
995
|
-
* If you are using StealJS it will use the Steal root
|
996
|
-
* URL by default.
|
997
|
-
*/
|
998
|
-
can.fixture.rootUrl = window.steal ? steal.root : undefined;
|
703
|
+
|
704
|
+
can.fixture.rootUrl = getUrl('');
|
999
705
|
|
1000
706
|
can.fixture["-handleFunction"] = function (settings) {
|
1001
707
|
if (typeof settings.fixture === "string" && can.fixture[settings.fixture]) {
|
@@ -1017,4 +723,5 @@ var compareMethods = {
|
|
1017
723
|
|
1018
724
|
//Expose this for fixture debugging
|
1019
725
|
can.fixture.overwrites = overwrites;
|
1020
|
-
|
726
|
+
|
727
|
+
})(can, this);
|