rails-backbone-generator 0.0.1

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.
Files changed (57) hide show
  1. data/.gitignore +19 -0
  2. data/Gemfile +4 -0
  3. data/LICENSE +22 -0
  4. data/README.md +135 -0
  5. data/Rakefile +2 -0
  6. data/lib/generators/backbone/collection_generator.rb +65 -0
  7. data/lib/generators/backbone/model_generator.rb +56 -0
  8. data/lib/generators/backbone/namespace_generator.rb +68 -0
  9. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/collections/%collection_name%.coffee.tt +4 -0
  10. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/collections/.gitkeep +0 -0
  11. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/models/%model_name%.coffee.tt +15 -0
  12. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/models/.gitkeep +0 -0
  13. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/routes/.gitkeep +0 -0
  14. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/templates/.gitkeep +0 -0
  15. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%/views/.gitkeep +0 -0
  16. data/lib/generators/backbone/templates/app/assets/javascripts/%namespace%.coffee.tt +16 -0
  17. data/lib/generators/backbone/templates/app/assets/javascripts/shared/.gitkeep +0 -0
  18. data/lib/generators/backbone/templates/app/assets/javascripts/shared/core_extentions/collections_extentions.coffee +30 -0
  19. data/lib/generators/backbone/templates/app/assets/javascripts/shared/helpers/.gitkeep +0 -0
  20. data/lib/generators/backbone/templates/app/assets/javascripts/shared/utils/.gitkeep +0 -0
  21. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/collections/%collection_name%_spec.coffee.tt +8 -0
  22. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/collections/.gitkeep +0 -0
  23. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/factories/%model_name%_factory.coffee.tt +43 -0
  24. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/factories/.gitkeep +0 -0
  25. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/models/%model_name%_spec.coffee.tt +12 -0
  26. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/models/.gitkeep +0 -0
  27. data/lib/generators/backbone/templates/spec/javascripts/%namespace%/views/.gitkeep +0 -0
  28. data/lib/generators/backbone/templates/spec/javascripts/helpers/association_helpers.coffee +3 -0
  29. data/lib/generators/backbone/templates/spec/javascripts/helpers/common_helpers.coffee +13 -0
  30. data/lib/generators/backbone/templates/spec/javascripts/helpers/fake_host.coffee +18 -0
  31. data/lib/generators/backbone/templates/spec/javascripts/helpers/headless_webkit_helper.coffee +9 -0
  32. data/lib/generators/backbone/templates/spec/javascripts/helpers/state_helpers.coffee +4 -0
  33. data/lib/generators/backbone/templates/spec/javascripts/support/jasmine.yml +81 -0
  34. data/lib/generators/backbone/templates/vendor/javascripts/.gitkeep +0 -0
  35. data/lib/generators/backbone/templates/vendor/javascripts/backbone/backbone-0.9.2.js +1431 -0
  36. data/lib/generators/backbone/templates/vendor/javascripts/backbone/backbone-bind-to-1.0.0.coffee +47 -0
  37. data/lib/generators/backbone/templates/vendor/javascripts/backbone/backbone-handlebars-1.0.0.coffee +1920 -0
  38. data/lib/generators/backbone/templates/vendor/javascripts/backbone/backbone-query-0.1.2.js +325 -0
  39. data/lib/generators/backbone/templates/vendor/javascripts/backbone/backbone-relational-0.6.0.js +1687 -0
  40. data/lib/generators/backbone/templates/vendor/javascripts/backbone/handlebars-1.0.rc.1.js +1920 -0
  41. data/lib/generators/backbone/templates/vendor/javascripts/backbone/underscore-1.3.3.js +1059 -0
  42. data/lib/generators/backbone/templates/vendor/javascripts/browser_compatibility/json2.js +487 -0
  43. data/lib/generators/backbone/templates/vendor/javascripts/browser_compatibility/localstorage-polyfill.js +92 -0
  44. data/lib/generators/backbone/templates/vendor/javascripts/jquery/jquery-1.8.0.js +9227 -0
  45. data/lib/generators/backbone/templates/vendor/javascripts/jquery/jquery-ui.min.js +17 -0
  46. data/lib/generators/backbone/templates/vendor/javascripts/jquery/jquery.easing-1.3.js +205 -0
  47. data/lib/generators/backbone/templates/vendor/javascripts/jquery/jquery_ujs.js +368 -0
  48. data/lib/generators/backbone/templates/vendor/javascripts/testing/backbone-factory.js +53 -0
  49. data/lib/generators/backbone/templates/vendor/javascripts/testing/jasmine-jquery-1.3.1.js +288 -0
  50. data/lib/generators/backbone/templates/vendor/javascripts/testing/jasmine-sinon.js +43 -0
  51. data/lib/generators/backbone/templates/vendor/javascripts/testing/mock-ajax.js +207 -0
  52. data/lib/generators/backbone/templates/vendor/javascripts/testing/sinon-1.4.2.js +4081 -0
  53. data/lib/generators/backbone_generator.rb +3 -0
  54. data/lib/rails_backbone_generator/version.rb +3 -0
  55. data/lib/rails_backbone_generator.rb +4 -0
  56. data/rails_backbone_generator.gemspec +20 -0
  57. metadata +135 -0
@@ -0,0 +1,53 @@
1
+ // Backbone Factory JS
2
+ // https://github.com/SupportBee/Backbone-Factory
3
+
4
+ (function(){
5
+ window.BackboneFactory = {
6
+
7
+ factories: {},
8
+ sequences: {},
9
+
10
+ define: function(factory_name, klass, defaults){
11
+
12
+ // Check for arguments' sanity
13
+ if(factory_name.match(/[^\w_]+/)){
14
+ throw "Factory name should not contain spaces or other funky characters";
15
+ }
16
+
17
+ if(defaults === undefined) defaults = function(){return {}};
18
+
19
+ // The object creator
20
+ this.factories[factory_name] = function(options){
21
+ if(options === undefined) options = function(){return {}};
22
+ arguments = _.extend({}, {id: BackboneFactory.next("_" + factory_name + "_id")}, defaults.call(), options.call());
23
+ return new klass(arguments);
24
+ };
25
+
26
+ // Lets define a sequence for id
27
+ BackboneFactory.define_sequence("_"+ factory_name +"_id", function(n){
28
+ return n
29
+ });
30
+ },
31
+
32
+ create: function(factory_name, options){
33
+ if(this.factories[factory_name] === undefined){
34
+ throw "Factory with name " + factory_name + " does not exist";
35
+ }
36
+ return this.factories[factory_name].apply(null, [options]);
37
+ },
38
+
39
+ define_sequence: function(sequence_name, callback){
40
+ this.sequences[sequence_name] = {}
41
+ this.sequences[sequence_name]['counter'] = 0;
42
+ this.sequences[sequence_name]['callback'] = callback;
43
+ },
44
+
45
+ next: function(sequence_name){
46
+ if(this.sequences[sequence_name] === undefined){
47
+ throw "Sequence with name " + sequence_name + " does not exist";
48
+ }
49
+ this.sequences[sequence_name]['counter'] += 1;
50
+ return this.sequences[sequence_name]['callback'].apply(null, [this.sequences[sequence_name]['counter']]); //= callback;
51
+ }
52
+ }
53
+ })();
@@ -0,0 +1,288 @@
1
+ var readFixtures = function() {
2
+ return jasmine.getFixtures().proxyCallTo_('read', arguments);
3
+ };
4
+
5
+ var preloadFixtures = function() {
6
+ jasmine.getFixtures().proxyCallTo_('preload', arguments);
7
+ };
8
+
9
+ var loadFixtures = function() {
10
+ jasmine.getFixtures().proxyCallTo_('load', arguments);
11
+ };
12
+
13
+ var setFixtures = function(html) {
14
+ jasmine.getFixtures().set(html);
15
+ };
16
+
17
+ var sandbox = function(attributes) {
18
+ return jasmine.getFixtures().sandbox(attributes);
19
+ };
20
+
21
+ var spyOnEvent = function(selector, eventName) {
22
+ jasmine.JQuery.events.spyOn(selector, eventName);
23
+ }
24
+
25
+ jasmine.getFixtures = function() {
26
+ return jasmine.currentFixtures_ = jasmine.currentFixtures_ || new jasmine.Fixtures();
27
+ };
28
+
29
+ jasmine.Fixtures = function() {
30
+ this.containerId = 'jasmine-fixtures';
31
+ this.fixturesCache_ = {};
32
+ this.fixturesPath = 'spec/javascripts/fixtures';
33
+ };
34
+
35
+ jasmine.Fixtures.prototype.set = function(html) {
36
+ this.cleanUp();
37
+ this.createContainer_(html);
38
+ };
39
+
40
+ jasmine.Fixtures.prototype.preload = function() {
41
+ this.read.apply(this, arguments);
42
+ };
43
+
44
+ jasmine.Fixtures.prototype.load = function() {
45
+ this.cleanUp();
46
+ this.createContainer_(this.read.apply(this, arguments));
47
+ };
48
+
49
+ jasmine.Fixtures.prototype.read = function() {
50
+ var htmlChunks = [];
51
+
52
+ var fixtureUrls = arguments;
53
+ for(var urlCount = fixtureUrls.length, urlIndex = 0; urlIndex < urlCount; urlIndex++) {
54
+ htmlChunks.push(this.getFixtureHtml_(fixtureUrls[urlIndex]));
55
+ }
56
+
57
+ return htmlChunks.join('');
58
+ };
59
+
60
+ jasmine.Fixtures.prototype.clearCache = function() {
61
+ this.fixturesCache_ = {};
62
+ };
63
+
64
+ jasmine.Fixtures.prototype.cleanUp = function() {
65
+ jQuery('#' + this.containerId).remove();
66
+ };
67
+
68
+ jasmine.Fixtures.prototype.sandbox = function(attributes) {
69
+ var attributesToSet = attributes || {};
70
+ return jQuery('<div id="sandbox" />').attr(attributesToSet);
71
+ };
72
+
73
+ jasmine.Fixtures.prototype.createContainer_ = function(html) {
74
+ var container;
75
+ if(html instanceof jQuery) {
76
+ container = jQuery('<div id="' + this.containerId + '" />');
77
+ container.html(html);
78
+ } else {
79
+ container = '<div id="' + this.containerId + '">' + html + '</div>'
80
+ }
81
+ jQuery('body').append(container);
82
+ };
83
+
84
+ jasmine.Fixtures.prototype.getFixtureHtml_ = function(url) {
85
+ if (typeof this.fixturesCache_[url] == 'undefined') {
86
+ this.loadFixtureIntoCache_(url);
87
+ }
88
+ return this.fixturesCache_[url];
89
+ };
90
+
91
+ jasmine.Fixtures.prototype.loadFixtureIntoCache_ = function(relativeUrl) {
92
+ var self = this;
93
+ var url = this.fixturesPath.match('/$') ? this.fixturesPath + relativeUrl : this.fixturesPath + '/' + relativeUrl;
94
+ jQuery.ajax({
95
+ async: false, // must be synchronous to guarantee that no tests are run before fixture is loaded
96
+ cache: false,
97
+ dataType: 'html',
98
+ url: url,
99
+ success: function(data) {
100
+ self.fixturesCache_[relativeUrl] = data;
101
+ },
102
+ error: function(jqXHR, status, errorThrown) {
103
+ throw Error('Fixture could not be loaded: ' + url + ' (status: ' + status + ', message: ' + errorThrown.message + ')');
104
+ }
105
+ });
106
+ };
107
+
108
+ jasmine.Fixtures.prototype.proxyCallTo_ = function(methodName, passedArguments) {
109
+ return this[methodName].apply(this, passedArguments);
110
+ };
111
+
112
+
113
+ jasmine.JQuery = function() {};
114
+
115
+ jasmine.JQuery.browserTagCaseIndependentHtml = function(html) {
116
+ return jQuery('<div/>').append(html).html();
117
+ };
118
+
119
+ jasmine.JQuery.elementToString = function(element) {
120
+ return jQuery('<div />').append(element.clone()).html();
121
+ };
122
+
123
+ jasmine.JQuery.matchersClass = {};
124
+
125
+ (function(namespace) {
126
+ var data = {
127
+ spiedEvents: {},
128
+ handlers: []
129
+ };
130
+
131
+ namespace.events = {
132
+ spyOn: function(selector, eventName) {
133
+ var handler = function(e) {
134
+ data.spiedEvents[[selector, eventName]] = e;
135
+ };
136
+ jQuery(selector).bind(eventName, handler);
137
+ data.handlers.push(handler);
138
+ },
139
+
140
+ wasTriggered: function(selector, eventName) {
141
+ return !!(data.spiedEvents[[selector, eventName]]);
142
+ },
143
+
144
+ cleanUp: function() {
145
+ data.spiedEvents = {};
146
+ data.handlers = [];
147
+ }
148
+ }
149
+ })(jasmine.JQuery);
150
+
151
+ (function(){
152
+ var jQueryMatchers = {
153
+ toHaveClass: function(className) {
154
+ return this.actual.hasClass(className);
155
+ },
156
+
157
+ toBeVisible: function() {
158
+ return this.actual.is(':visible');
159
+ },
160
+
161
+ toBeHidden: function() {
162
+ return this.actual.is(':hidden');
163
+ },
164
+
165
+ toBeSelected: function() {
166
+ return this.actual.is(':selected');
167
+ },
168
+
169
+ toBeChecked: function() {
170
+ return this.actual.is(':checked');
171
+ },
172
+
173
+ toBeEmpty: function() {
174
+ return this.actual.is(':empty');
175
+ },
176
+
177
+ toExist: function() {
178
+ return this.actual.size() > 0;
179
+ },
180
+
181
+ toHaveAttr: function(attributeName, expectedAttributeValue) {
182
+ return hasProperty(this.actual.attr(attributeName), expectedAttributeValue);
183
+ },
184
+
185
+ toHaveId: function(id) {
186
+ return this.actual.attr('id') == id;
187
+ },
188
+
189
+ toHaveHtml: function(html) {
190
+ return this.actual.html() == jasmine.JQuery.browserTagCaseIndependentHtml(html);
191
+ },
192
+
193
+ toHaveText: function(text) {
194
+ if (text && jQuery.isFunction(text.test)) {
195
+ return text.test(this.actual.text());
196
+ } else {
197
+ return this.actual.text() == text;
198
+ }
199
+ },
200
+
201
+ toHaveValue: function(value) {
202
+ return this.actual.val() == value;
203
+ },
204
+
205
+ toHaveData: function(key, expectedValue) {
206
+ return hasProperty(this.actual.data(key), expectedValue);
207
+ },
208
+
209
+ toBe: function(selector) {
210
+ return this.actual.is(selector);
211
+ },
212
+
213
+ toContain: function(selector) {
214
+ return this.actual.find(selector).size() > 0;
215
+ },
216
+
217
+ toBeDisabled: function(selector){
218
+ return this.actual.is(':disabled');
219
+ },
220
+
221
+ // tests the existence of a specific event binding
222
+ toHandle: function(eventName) {
223
+ var events = this.actual.data("events");
224
+ return events && events[eventName].length > 0;
225
+ },
226
+
227
+ // tests the existence of a specific event binding + handler
228
+ toHandleWith: function(eventName, eventHandler) {
229
+ var stack = this.actual.data("events")[eventName];
230
+ var i;
231
+ for (i = 0; i < stack.length; i++) {
232
+ if (stack[i].handler == eventHandler) {
233
+ return true;
234
+ }
235
+ }
236
+ return false;
237
+ }
238
+ };
239
+
240
+ var hasProperty = function(actualValue, expectedValue) {
241
+ if (expectedValue === undefined) {
242
+ return actualValue !== undefined;
243
+ }
244
+ return actualValue == expectedValue;
245
+ };
246
+
247
+ var bindMatcher = function(methodName) {
248
+ var builtInMatcher = jasmine.Matchers.prototype[methodName];
249
+
250
+ jasmine.JQuery.matchersClass[methodName] = function() {
251
+ if (this.actual instanceof jQuery) {
252
+ var result = jQueryMatchers[methodName].apply(this, arguments);
253
+ this.actual = jasmine.JQuery.elementToString(this.actual);
254
+ return result;
255
+ }
256
+
257
+ if (builtInMatcher) {
258
+ return builtInMatcher.apply(this, arguments);
259
+ }
260
+
261
+ return false;
262
+ };
263
+ };
264
+
265
+ for(var methodName in jQueryMatchers) {
266
+ bindMatcher(methodName);
267
+ }
268
+ })();
269
+
270
+ beforeEach(function() {
271
+ this.addMatchers(jasmine.JQuery.matchersClass);
272
+ this.addMatchers({
273
+ toHaveBeenTriggeredOn: function(selector) {
274
+ this.message = function() {
275
+ return [
276
+ "Expected event " + this.actual + " to have been triggered on" + selector,
277
+ "Expected event " + this.actual + " not to have been triggered on" + selector
278
+ ];
279
+ };
280
+ return jasmine.JQuery.events.wasTriggered(selector, this.actual);
281
+ }
282
+ })
283
+ });
284
+
285
+ afterEach(function() {
286
+ jasmine.getFixtures().cleanUp();
287
+ jasmine.JQuery.events.cleanUp();
288
+ });
@@ -0,0 +1,43 @@
1
+ (function(global) {
2
+
3
+ var spyMatchers = "called calledOnce calledTwice calledThrice calledBefore calledAfter calledOn alwaysCalledOn calledWith alwaysCalledWith calledWithExactly alwaysCalledWithExactly".split(" "),
4
+ i = spyMatchers.length,
5
+ spyMatcherHash = {},
6
+ unusualMatchers = {
7
+ "returned": "toHaveReturned",
8
+ "alwaysReturned": "toHaveAlwaysReturned",
9
+ "threw": "toHaveThrown",
10
+ "alwaysThrew": "toHaveAlwaysThrown"
11
+ },
12
+
13
+ getMatcherFunction = function(sinonName) {
14
+ return function() {
15
+ var sinonProperty = this.actual[sinonName];
16
+ return (typeof sinonProperty === 'function') ? sinonProperty.apply(this.actual, arguments) : sinonProperty;
17
+ };
18
+ };
19
+
20
+ while(i--) {
21
+ var sinonName = spyMatchers[i],
22
+ matcherName = "toHaveBeen" + sinonName.charAt(0).toUpperCase() + sinonName.slice(1);
23
+
24
+ spyMatcherHash[matcherName] = getMatcherFunction(sinonName);
25
+ };
26
+
27
+ for (var j in unusualMatchers) {
28
+ spyMatcherHash[unusualMatchers[j]] = getMatcherFunction(j);
29
+ }
30
+
31
+ global.sinonJasmine = {
32
+ getMatchers: function() {
33
+ return spyMatcherHash;
34
+ }
35
+ };
36
+
37
+ })(window);
38
+
39
+ beforeEach(function() {
40
+
41
+ this.addMatchers(sinonJasmine.getMatchers());
42
+
43
+ });
@@ -0,0 +1,207 @@
1
+ /*
2
+ Jasmine-Ajax : a set of helpers for testing AJAX requests under the Jasmine
3
+ BDD framework for JavaScript.
4
+
5
+ Supports both Prototype.js and jQuery.
6
+
7
+ http://github.com/pivotal/jasmine-ajax
8
+
9
+ Jasmine Home page: http://pivotal.github.com/jasmine
10
+
11
+ Copyright (c) 2008-2010 Pivotal Labs
12
+
13
+ Permission is hereby granted, free of charge, to any person obtaining
14
+ a copy of this software and associated documentation files (the
15
+ "Software"), to deal in the Software without restriction, including
16
+ without limitation the rights to use, copy, modify, merge, publish,
17
+ distribute, sublicense, and/or sell copies of the Software, and to
18
+ permit persons to whom the Software is furnished to do so, subject to
19
+ the following conditions:
20
+
21
+ The above copyright notice and this permission notice shall be
22
+ included in all copies or substantial portions of the Software.
23
+
24
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
28
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
29
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
30
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31
+
32
+ */
33
+
34
+ // Jasmine-Ajax interface
35
+ var ajaxRequests = [];
36
+
37
+ function mostRecentAjaxRequest() {
38
+ if (ajaxRequests.length > 0) {
39
+ return ajaxRequests[ajaxRequests.length - 1];
40
+ } else {
41
+ return null;
42
+ }
43
+ }
44
+
45
+ function clearAjaxRequests() {
46
+ ajaxRequests = [];
47
+ }
48
+
49
+ // Fake XHR for mocking Ajax Requests & Responses
50
+ function FakeXMLHttpRequest() {
51
+ var extend = Object.extend || $.extend;
52
+ extend(this, {
53
+ requestHeaders: {},
54
+
55
+ open: function() {
56
+ this.method = arguments[0];
57
+ this.url = arguments[1];
58
+ this.readyState = 1;
59
+ },
60
+
61
+ setRequestHeader: function(header, value) {
62
+ this.requestHeaders[header] = value;
63
+ },
64
+
65
+ abort: function() {
66
+ this.readyState = 0;
67
+ },
68
+
69
+ readyState: 0,
70
+
71
+ onreadystatechange: function(isTimeout) {
72
+ },
73
+
74
+ status: null,
75
+
76
+ send: function(data) {
77
+ this.params = data;
78
+ this.readyState = 2;
79
+ },
80
+
81
+ getResponseHeader: function(name) {
82
+ return this.responseHeaders[name];
83
+ },
84
+
85
+ getAllResponseHeaders: function() {
86
+ var responseHeaders = [];
87
+ for (var i in this.responseHeaders) {
88
+ if (this.responseHeaders.hasOwnProperty(i)) {
89
+ responseHeaders.push(i + ': ' + this.responseHeaders[i]);
90
+ }
91
+ }
92
+ return responseHeaders.join('\r\n');
93
+ },
94
+
95
+ responseText: null,
96
+
97
+ response: function(response) {
98
+ this.status = response.status;
99
+ this.responseText = response.responseText || "";
100
+ this.readyState = 4;
101
+ this.responseHeaders = response.responseHeaders ||
102
+ {"Content-type": response.contentType || "application/json" };
103
+ // uncomment for jquery 1.3.x support
104
+ // jasmine.Clock.tick(20);
105
+
106
+ this.onreadystatechange();
107
+ },
108
+ responseTimeout: function() {
109
+ this.readyState = 4;
110
+ jasmine.Clock.tick(jQuery.ajaxSettings.timeout || 30000);
111
+ this.onreadystatechange('timeout');
112
+ }
113
+ });
114
+
115
+ return this;
116
+ }
117
+
118
+
119
+ jasmine.Ajax = {
120
+
121
+ isInstalled: function() {
122
+ return jasmine.Ajax.installed == true;
123
+ },
124
+
125
+ assertInstalled: function() {
126
+ if (!jasmine.Ajax.isInstalled()) {
127
+ throw new Error("Mock ajax is not installed, use jasmine.Ajax.useMock()")
128
+ }
129
+ },
130
+
131
+ useMock: function() {
132
+ if (!jasmine.Ajax.isInstalled()) {
133
+ var spec = jasmine.getEnv().currentSpec;
134
+ spec.after(jasmine.Ajax.uninstallMock);
135
+
136
+ jasmine.Ajax.installMock();
137
+ }
138
+ },
139
+
140
+ installMock: function() {
141
+ if (typeof jQuery != 'undefined') {
142
+ jasmine.Ajax.installJquery();
143
+ } else if (typeof Prototype != 'undefined') {
144
+ jasmine.Ajax.installPrototype();
145
+ } else {
146
+ throw new Error("jasmine.Ajax currently only supports jQuery and Prototype");
147
+ }
148
+ jasmine.Ajax.installed = true;
149
+ },
150
+
151
+ installJquery: function() {
152
+ jasmine.Ajax.mode = 'jQuery';
153
+ jasmine.Ajax.real = jQuery.ajaxSettings.xhr;
154
+ jQuery.ajaxSettings.xhr = jasmine.Ajax.jQueryMock;
155
+
156
+ },
157
+
158
+ installPrototype: function() {
159
+ jasmine.Ajax.mode = 'Prototype';
160
+ jasmine.Ajax.real = Ajax.getTransport;
161
+
162
+ Ajax.getTransport = jasmine.Ajax.prototypeMock;
163
+ },
164
+
165
+ uninstallMock: function() {
166
+ jasmine.Ajax.assertInstalled();
167
+ if (jasmine.Ajax.mode == 'jQuery') {
168
+ jQuery.ajaxSettings.xhr = jasmine.Ajax.real;
169
+ } else if (jasmine.Ajax.mode == 'Prototype') {
170
+ Ajax.getTransport = jasmine.Ajax.real;
171
+ }
172
+ jasmine.Ajax.reset();
173
+ },
174
+
175
+ reset: function() {
176
+ jasmine.Ajax.installed = false;
177
+ jasmine.Ajax.mode = null;
178
+ jasmine.Ajax.real = null;
179
+ },
180
+
181
+ jQueryMock: function() {
182
+ var newXhr = new FakeXMLHttpRequest();
183
+ ajaxRequests.push(newXhr);
184
+ return newXhr;
185
+ },
186
+
187
+ prototypeMock: function() {
188
+ return new FakeXMLHttpRequest();
189
+ },
190
+
191
+ installed: false,
192
+ mode: null
193
+ }
194
+
195
+
196
+ // Jasmine-Ajax Glue code for Prototype.js
197
+ if (typeof Prototype != 'undefined' && Ajax && Ajax.Request) {
198
+ Ajax.Request.prototype.originalRequest = Ajax.Request.prototype.request;
199
+ Ajax.Request.prototype.request = function(url) {
200
+ this.originalRequest(url);
201
+ ajaxRequests.push(this);
202
+ };
203
+
204
+ Ajax.Request.prototype.response = function(responseOptions) {
205
+ return this.transport.response(responseOptions);
206
+ };
207
+ }