sinon-rails 1.3.2.1 → 1.4.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/README.md CHANGED
@@ -1,6 +1,6 @@
1
- # Sinon::Rails
1
+ # Sinon.js for Rails
2
2
 
3
- TODO: Write a gem description
3
+ sinon.js via asset pipeline
4
4
 
5
5
  ## Installation
6
6
 
@@ -12,16 +12,20 @@ And then execute:
12
12
 
13
13
  $ bundle
14
14
 
15
- Or install it yourself as:
15
+ Add this line to your test manifest file:
16
16
 
17
- $ gem install sinon-rails
17
+ //=require sinon
18
+
19
+ Or directly include at `/assets/sinon.js`
18
20
 
19
21
  ## Usage
20
22
 
21
- TODO: Write usage instructions here
23
+ Read about sinon.js [here](http://sinonjs.org/).
22
24
 
23
25
  ## Contributing
24
26
 
27
+ sinon-rails maintained by [Travis Jeffery](http://github.com/travisjeffery)
28
+
25
29
  1. Fork it
26
30
  2. Create your feature branch (`git checkout -b my-new-feature`)
27
31
  3. Commit your changes (`git commit -am 'Added some feature'`)
data/lib/sinon-rails.rb CHANGED
@@ -2,6 +2,6 @@ require "sinon-rails/version"
2
2
 
3
3
  module Sinon
4
4
  module Rails
5
- require 'sinon-rails/engine' if defined?(Rails)
5
+ require 'lib/sinon-rails/engine' if defined?(Rails)
6
6
  end
7
7
  end
@@ -1,5 +1,5 @@
1
1
  module Sinon
2
2
  module Rails
3
- VERSION = "1.3.2.1"
3
+ VERSION = "1.4.2"
4
4
  end
5
5
  end
data/sinon-rails.gemspec CHANGED
@@ -1,5 +1,4 @@
1
1
  # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
2
  require File.expand_path('../lib/sinon-rails/version', __FILE__)
4
3
 
5
4
  Gem::Specification.new do |gem|
@@ -1,11 +1,12 @@
1
1
  /**
2
- * Sinon.JS 1.3.2, 2012/03/11
2
+ * Sinon.JS 1.4.2, 2012/07/11
3
3
  *
4
4
  * @author Christian Johansen (christian@cjohansen.no)
5
+ * @author Contributors: https://github.com/cjohansen/Sinon.JS/blob/master/AUTHORS
5
6
  *
6
7
  * (The BSD License)
7
8
  *
8
- * Copyright (c) 2010-2011, Christian Johansen, christian@cjohansen.no
9
+ * Copyright (c) 2010-2012, Christian Johansen, christian@cjohansen.no
9
10
  * All rights reserved.
10
11
  *
11
12
  * Redistribution and use in source and binary forms, with or without modification,
@@ -34,94 +35,232 @@
34
35
 
35
36
  "use strict";
36
37
  var sinon = (function () {
37
- var buster = (function (buster, setTimeout) {
38
- function extend(target) {
39
- if (!target) {
40
- return;
41
- }
42
-
43
- for (var i = 1, l = arguments.length, prop; i < l; ++i) {
44
- for (prop in arguments[i]) {
45
- target[prop] = arguments[i][prop];
46
- }
47
- }
48
-
49
- return target;
50
- }
51
-
38
+ var buster = (function (setTimeout, B) {
39
+ var isNode = typeof require == "function" && typeof module == "object";
52
40
  var div = typeof document != "undefined" && document.createElement("div");
41
+ var F = function () {};
53
42
 
54
- return extend(buster, {
55
- bind: function (obj, methOrProp) {
43
+ var buster = {
44
+ bind: function bind(obj, methOrProp) {
56
45
  var method = typeof methOrProp == "string" ? obj[methOrProp] : methOrProp;
57
46
  var args = Array.prototype.slice.call(arguments, 2);
58
-
59
47
  return function () {
60
48
  var allArgs = args.concat(Array.prototype.slice.call(arguments));
61
49
  return method.apply(obj, allArgs);
62
50
  };
63
51
  },
64
52
 
65
- create: (function () {
66
- function F() {}
53
+ partial: function partial(fn) {
54
+ var args = [].slice.call(arguments, 1);
55
+ return function () {
56
+ return fn.apply(this, args.concat([].slice.call(arguments)));
57
+ };
58
+ },
67
59
 
68
- return function create(object) {
69
- F.prototype = object;
70
- return new F();
71
- }
72
- }()),
60
+ create: function create(object) {
61
+ F.prototype = object;
62
+ return new F();
63
+ },
73
64
 
74
- extend: extend,
65
+ extend: function extend(target) {
66
+ if (!target) { return; }
67
+ for (var i = 1, l = arguments.length, prop; i < l; ++i) {
68
+ for (prop in arguments[i]) {
69
+ target[prop] = arguments[i][prop];
70
+ }
71
+ }
72
+ return target;
73
+ },
75
74
 
76
- nextTick: function (callback) {
75
+ nextTick: function nextTick(callback) {
77
76
  if (typeof process != "undefined" && process.nextTick) {
78
77
  return process.nextTick(callback);
79
78
  }
80
-
81
79
  setTimeout(callback, 0);
82
80
  },
83
81
 
84
- functionName: function (func) {
82
+ functionName: function functionName(func) {
85
83
  if (!func) return "";
86
84
  if (func.displayName) return func.displayName;
87
85
  if (func.name) return func.name;
88
-
89
86
  var matches = func.toString().match(/function\s+([^\(]+)/m);
90
87
  return matches && matches[1] || "";
91
88
  },
92
89
 
93
- isNode: function (obj) {
90
+ isNode: function isNode(obj) {
94
91
  if (!div) return false;
95
-
96
92
  try {
97
93
  obj.appendChild(div);
98
94
  obj.removeChild(div);
99
95
  } catch (e) {
100
96
  return false;
101
97
  }
102
-
103
98
  return true;
104
99
  },
105
100
 
106
- isElement: function (obj) {
107
- return obj && buster.isNode(obj) && obj.nodeType === 1;
108
- }
109
- });
110
- }(buster || {}, setTimeout));
101
+ isElement: function isElement(obj) {
102
+ return obj && obj.nodeType === 1 && buster.isNode(obj);
103
+ },
111
104
 
112
- if (typeof module == "object" && typeof require == "function") {
113
- module.exports = buster;
114
- buster.eventEmitter = require("./buster-event-emitter");
105
+ isArray: function isArray(arr) {
106
+ return Object.prototype.toString.call(arr) == "[object Array]";
107
+ },
115
108
 
116
- Object.defineProperty(buster, "defineVersionGetter", {
117
- get: function () {
118
- return require("./define-version-getter");
109
+ flatten: function flatten(arr) {
110
+ var result = [], arr = arr || [];
111
+ for (var i = 0, l = arr.length; i < l; ++i) {
112
+ result = result.concat(buster.isArray(arr[i]) ? flatten(arr[i]) : arr[i]);
113
+ }
114
+ return result;
115
+ },
116
+
117
+ each: function each(arr, callback) {
118
+ for (var i = 0, l = arr.length; i < l; ++i) {
119
+ callback(arr[i]);
120
+ }
121
+ },
122
+
123
+ map: function map(arr, callback) {
124
+ var results = [];
125
+ for (var i = 0, l = arr.length; i < l; ++i) {
126
+ results.push(callback(arr[i]));
127
+ }
128
+ return results;
129
+ },
130
+
131
+ parallel: function parallel(fns, callback) {
132
+ function cb(err, res) {
133
+ if (typeof callback == "function") {
134
+ callback(err, res);
135
+ callback = null;
136
+ }
137
+ }
138
+ if (fns.length == 0) { return cb(null, []); }
139
+ var remaining = fns.length, results = [];
140
+ function makeDone(num) {
141
+ return function done(err, result) {
142
+ if (err) { return cb(err); }
143
+ results[num] = result;
144
+ if (--remaining == 0) { cb(null, results); }
145
+ };
146
+ }
147
+ for (var i = 0, l = fns.length; i < l; ++i) {
148
+ fns[i](makeDone(i));
149
+ }
150
+ },
151
+
152
+ series: function series(fns, callback) {
153
+ function cb(err, res) {
154
+ if (typeof callback == "function") {
155
+ callback(err, res);
156
+ }
157
+ }
158
+ var remaining = fns.slice();
159
+ var results = [];
160
+ function callNext() {
161
+ if (remaining.length == 0) return cb(null, results);
162
+ var promise = remaining.shift()(next);
163
+ if (promise && typeof promise.then == "function") {
164
+ promise.then(buster.partial(next, null), next);
165
+ }
166
+ }
167
+ function next(err, result) {
168
+ if (err) return cb(err);
169
+ results.push(result);
170
+ callNext();
171
+ }
172
+ callNext();
173
+ },
174
+
175
+ countdown: function countdown(num, done) {
176
+ return function () {
177
+ if (--num == 0) done();
178
+ };
119
179
  }
120
- });
121
- }
180
+ };
181
+
182
+ if (typeof process === "object" &&
183
+ typeof require === "function" && typeof module === "object") {
184
+ var crypto = require("crypto");
185
+ var path = require("path");
186
+
187
+ buster.tmpFile = function (fileName) {
188
+ var hashed = crypto.createHash("sha1");
189
+ hashed.update(fileName);
190
+ var tmpfileName = hashed.digest("hex");
191
+
192
+ if (process.platform == "win32") {
193
+ return path.join(process.env["TEMP"], tmpfileName);
194
+ } else {
195
+ return path.join("/tmp", tmpfileName);
196
+ }
197
+ };
198
+ }
199
+
200
+ if (Array.prototype.some) {
201
+ buster.some = function (arr, fn, thisp) {
202
+ return arr.some(fn, thisp);
203
+ };
204
+ } else {
205
+ // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some
206
+ buster.some = function (arr, fun, thisp) {
207
+ if (arr == null) { throw new TypeError(); }
208
+ arr = Object(arr);
209
+ var len = arr.length >>> 0;
210
+ if (typeof fun !== "function") { throw new TypeError(); }
211
+
212
+ for (var i = 0; i < len; i++) {
213
+ if (arr.hasOwnProperty(i) && fun.call(thisp, arr[i], i, arr)) {
214
+ return true;
215
+ }
216
+ }
217
+
218
+ return false;
219
+ };
220
+ }
122
221
 
222
+ if (Array.prototype.filter) {
223
+ buster.filter = function (arr, fn, thisp) {
224
+ return arr.filter(fn, thisp);
225
+ };
226
+ } else {
227
+ // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter
228
+ buster.filter = function (fn, thisp) {
229
+ if (this == null) { throw new TypeError(); }
230
+
231
+ var t = Object(this);
232
+ var len = t.length >>> 0;
233
+ if (typeof fn != "function") { throw new TypeError(); }
234
+
235
+ var res = [];
236
+ for (var i = 0; i < len; i++) {
237
+ if (i in t) {
238
+ var val = t[i]; // in case fun mutates this
239
+ if (fn.call(thisp, val, i, t)) { res.push(val); }
240
+ }
241
+ }
242
+
243
+ return res;
244
+ };
245
+ }
123
246
 
124
- if (typeof require != "undefined") {
247
+ if (isNode) {
248
+ module.exports = buster;
249
+ buster.eventEmitter = require("./buster-event-emitter");
250
+ Object.defineProperty(buster, "defineVersionGetter", {
251
+ get: function () {
252
+ return require("./define-version-getter");
253
+ }
254
+ });
255
+ }
256
+
257
+ return buster.extend(B || {}, buster);
258
+ }(setTimeout, buster));
259
+ if (typeof buster === "undefined") {
260
+ var buster = {};
261
+ }
262
+
263
+ if (typeof module === "object" && typeof require === "function") {
125
264
  buster = require("buster-core");
126
265
  }
127
266
 
@@ -130,12 +269,26 @@ buster.format.excludeConstructors = ["Object", /^.$/];
130
269
  buster.format.quoteStrings = true;
131
270
 
132
271
  buster.format.ascii = (function () {
272
+
273
+ var hasOwn = Object.prototype.hasOwnProperty;
274
+
275
+ var specialObjects = [];
276
+ if (typeof global != "undefined") {
277
+ specialObjects.push({ obj: global, value: "[object global]" });
278
+ }
279
+ if (typeof document != "undefined") {
280
+ specialObjects.push({ obj: document, value: "[object HTMLDocument]" });
281
+ }
282
+ if (typeof window != "undefined") {
283
+ specialObjects.push({ obj: window, value: "[object Window]" });
284
+ }
285
+
133
286
  function keys(object) {
134
287
  var k = Object.keys && Object.keys(object) || [];
135
288
 
136
289
  if (k.length == 0) {
137
290
  for (var prop in object) {
138
- if (object.hasOwnProperty(prop)) {
291
+ if (hasOwn.call(object, prop)) {
139
292
  k.push(prop);
140
293
  }
141
294
  }
@@ -175,7 +328,7 @@ buster.format.ascii = (function () {
175
328
  }
176
329
 
177
330
  if (Object.prototype.toString.call(object) == "[object Array]") {
178
- return ascii.array(object);
331
+ return ascii.array.call(this, object, processed);
179
332
  }
180
333
 
181
334
  if (!object) {
@@ -186,10 +339,17 @@ buster.format.ascii = (function () {
186
339
  return ascii.element(object);
187
340
  }
188
341
 
189
- if (object.toString !== Object.prototype.toString) {
342
+ if (typeof object.toString == "function" &&
343
+ object.toString !== Object.prototype.toString) {
190
344
  return object.toString();
191
345
  }
192
346
 
347
+ for (var i = 0, l = specialObjects.length; i < l; i++) {
348
+ if (object === specialObjects[i].obj) {
349
+ return specialObjects[i].value;
350
+ }
351
+ }
352
+
193
353
  return ascii.object.call(this, object, processed, indent);
194
354
  }
195
355
 
@@ -203,7 +363,7 @@ buster.format.ascii = (function () {
203
363
  var pieces = [];
204
364
 
205
365
  for (var i = 0, l = array.length; i < l; ++i) {
206
- pieces.push(ascii(array[i], processed));
366
+ pieces.push(ascii.call(this, array[i], processed));
207
367
  }
208
368
 
209
369
  return "[" + pieces.join(", ") + "]";
@@ -376,11 +536,15 @@ var sinon = (function (buster) {
376
536
  method.displayName = property;
377
537
 
378
538
  method.restore = function () {
379
- if(owned) {
380
- object[property] = wrappedMethod;
381
- } else {
539
+ // For prototype properties try to reset by delete first.
540
+ // If this fails (ex: localStorage on mobile safari) then force a reset
541
+ // via direct assignment.
542
+ if (!owned) {
382
543
  delete object[property];
383
544
  }
545
+ if (object[property] === method) {
546
+ object[property] = wrappedMethod;
547
+ }
384
548
  };
385
549
 
386
550
  method.restore.sinon = true;
@@ -414,6 +578,9 @@ var sinon = (function (buster) {
414
578
  },
415
579
 
416
580
  deepEqual: function deepEqual(a, b) {
581
+ if (sinon.match && sinon.match.isMatcher(a)) {
582
+ return a.test(b);
583
+ }
417
584
  if (typeof a != "object" || typeof b != "object") {
418
585
  return a === b;
419
586
  }
@@ -565,6 +732,14 @@ var sinon = (function (buster) {
565
732
  err.message = msg + err.message;
566
733
  throw err;
567
734
  }, 0);
735
+ },
736
+
737
+ typeOf: function (value) {
738
+ if (value === null) {
739
+ return "null";
740
+ }
741
+ var string = Object.prototype.toString.call(value);
742
+ return string.substring(8, string.length - 1).toLowerCase();
568
743
  }
569
744
  };
570
745
 
@@ -584,6 +759,7 @@ var sinon = (function (buster) {
584
759
  module.exports.test = require("./sinon/test");
585
760
  module.exports.testCase = require("./sinon/test_case");
586
761
  module.exports.assert = require("./sinon/assert");
762
+ module.exports.match = require("./sinon/match");
587
763
  }
588
764
 
589
765
  if (buster) {
@@ -596,7 +772,7 @@ var sinon = (function (buster) {
596
772
  try {
597
773
  var util = require("util");
598
774
  sinon.format = function (value) {
599
- return typeof value == "object" ? util.inspect(value) : value;
775
+ return typeof value == "object" && value.toString === Object.prototype.toString ? util.inspect(value) : value;
600
776
  };
601
777
  } catch (e) {
602
778
  /* Node, but no util module - would be very old, but better safe than
@@ -610,6 +786,248 @@ var sinon = (function (buster) {
610
786
  /* @depend ../sinon.js */
611
787
  /*jslint eqeqeq: false, onevar: false, plusplus: false*/
612
788
  /*global module, require, sinon*/
789
+ /**
790
+ * Match functions
791
+ *
792
+ * @author Maximilian Antoni (mail@maxantoni.de)
793
+ * @license BSD
794
+ *
795
+ * Copyright (c) 2012 Maximilian Antoni
796
+ */
797
+
798
+ (function (sinon) {
799
+ var commonJSModule = typeof module == "object" && typeof require == "function";
800
+
801
+ if (!sinon && commonJSModule) {
802
+ sinon = require("../sinon");
803
+ }
804
+
805
+ if (!sinon) {
806
+ return;
807
+ }
808
+
809
+ function assertType(value, type, name) {
810
+ var actual = sinon.typeOf(value);
811
+ if (actual !== type) {
812
+ throw new TypeError("Expected type of " + name + " to be " +
813
+ type + ", but was " + actual);
814
+ }
815
+ }
816
+
817
+ var matcher = {
818
+ toString: function () {
819
+ return this.message;
820
+ }
821
+ };
822
+
823
+ function isMatcher(object) {
824
+ return matcher.isPrototypeOf(object);
825
+ }
826
+
827
+ function matchObject(expectation, actual) {
828
+ if (actual === null || actual === undefined) {
829
+ return false;
830
+ }
831
+ for (var key in expectation) {
832
+ if (expectation.hasOwnProperty(key)) {
833
+ var exp = expectation[key];
834
+ var act = actual[key];
835
+ if (match.isMatcher(exp)) {
836
+ if (!exp.test(act)) {
837
+ return false;
838
+ }
839
+ } else if (sinon.typeOf(exp) === "object") {
840
+ if (!matchObject(exp, act)) {
841
+ return false;
842
+ }
843
+ } else if (!sinon.deepEqual(exp, act)) {
844
+ return false;
845
+ }
846
+ }
847
+ }
848
+ return true;
849
+ }
850
+
851
+ matcher.or = function (m2) {
852
+ if (!isMatcher(m2)) {
853
+ throw new TypeError("Matcher expected");
854
+ }
855
+ var m1 = this;
856
+ var or = sinon.create(matcher);
857
+ or.test = function (actual) {
858
+ return m1.test(actual) || m2.test(actual);
859
+ };
860
+ or.message = m1.message + ".or(" + m2.message + ")";
861
+ return or;
862
+ };
863
+
864
+ matcher.and = function (m2) {
865
+ if (!isMatcher(m2)) {
866
+ throw new TypeError("Matcher expected");
867
+ }
868
+ var m1 = this;
869
+ var and = sinon.create(matcher);
870
+ and.test = function (actual) {
871
+ return m1.test(actual) && m2.test(actual);
872
+ };
873
+ and.message = m1.message + ".and(" + m2.message + ")";
874
+ return and;
875
+ };
876
+
877
+ var match = function (expectation, message) {
878
+ var m = sinon.create(matcher);
879
+ var type = sinon.typeOf(expectation);
880
+ switch (type) {
881
+ case "object":
882
+ if (typeof expectation.test === "function") {
883
+ m.test = function (actual) {
884
+ return expectation.test(actual) === true;
885
+ };
886
+ m.message = "match(" + sinon.functionName(expectation.test) + ")";
887
+ return m;
888
+ }
889
+ var str = [];
890
+ for (var key in expectation) {
891
+ if (expectation.hasOwnProperty(key)) {
892
+ str.push(key + ": " + expectation[key]);
893
+ }
894
+ }
895
+ m.test = function (actual) {
896
+ return matchObject(expectation, actual);
897
+ };
898
+ m.message = "match(" + str.join(", ") + ")";
899
+ break;
900
+ case "number":
901
+ m.test = function (actual) {
902
+ return expectation == actual;
903
+ };
904
+ break;
905
+ case "string":
906
+ m.test = function (actual) {
907
+ if (typeof actual !== "string") {
908
+ return false;
909
+ }
910
+ return actual.indexOf(expectation) !== -1;
911
+ };
912
+ m.message = "match(\"" + expectation + "\")";
913
+ break;
914
+ case "regexp":
915
+ m.test = function (actual) {
916
+ if (typeof actual !== "string") {
917
+ return false;
918
+ }
919
+ return expectation.test(actual);
920
+ };
921
+ break;
922
+ case "function":
923
+ m.test = expectation;
924
+ if (message) {
925
+ m.message = message;
926
+ } else {
927
+ m.message = "match(" + sinon.functionName(expectation) + ")";
928
+ }
929
+ break;
930
+ default:
931
+ m.test = function (actual) {
932
+ return sinon.deepEqual(expectation, actual);
933
+ };
934
+ }
935
+ if (!m.message) {
936
+ m.message = "match(" + expectation + ")";
937
+ }
938
+ return m;
939
+ };
940
+
941
+ match.isMatcher = isMatcher;
942
+
943
+ match.any = match(function () {
944
+ return true;
945
+ }, "any");
946
+
947
+ match.defined = match(function (actual) {
948
+ return actual !== null && actual !== undefined;
949
+ }, "defined");
950
+
951
+ match.truthy = match(function (actual) {
952
+ return !!actual;
953
+ }, "truthy");
954
+
955
+ match.falsy = match(function (actual) {
956
+ return !actual;
957
+ }, "falsy");
958
+
959
+ match.same = function (expectation) {
960
+ return match(function (actual) {
961
+ return expectation === actual;
962
+ }, "same(" + expectation + ")");
963
+ };
964
+
965
+ match.typeOf = function (type) {
966
+ assertType(type, "string", "type");
967
+ return match(function (actual) {
968
+ return sinon.typeOf(actual) === type;
969
+ }, "typeOf(\"" + type + "\")");
970
+ };
971
+
972
+ match.instanceOf = function (type) {
973
+ assertType(type, "function", "type");
974
+ return match(function (actual) {
975
+ return actual instanceof type;
976
+ }, "instanceOf(" + sinon.functionName(type) + ")");
977
+ };
978
+
979
+ function createPropertyMatcher(propertyTest, messagePrefix) {
980
+ return function (property, value) {
981
+ assertType(property, "string", "property");
982
+ var onlyProperty = arguments.length === 1;
983
+ var message = messagePrefix + "(\"" + property + "\"";
984
+ if (!onlyProperty) {
985
+ message += ", " + value;
986
+ }
987
+ message += ")";
988
+ return match(function (actual) {
989
+ if (actual === undefined || actual === null ||
990
+ !propertyTest(actual, property)) {
991
+ return false;
992
+ }
993
+ return onlyProperty || sinon.deepEqual(value, actual[property]);
994
+ }, message);
995
+ };
996
+ }
997
+
998
+ match.has = createPropertyMatcher(function (actual, property) {
999
+ if (typeof actual === "object") {
1000
+ return property in actual;
1001
+ }
1002
+ return actual[property] !== undefined;
1003
+ }, "has");
1004
+
1005
+ match.hasOwn = createPropertyMatcher(function (actual, property) {
1006
+ return actual.hasOwnProperty(property);
1007
+ }, "hasOwn");
1008
+
1009
+ match.bool = match.typeOf("boolean");
1010
+ match.number = match.typeOf("number");
1011
+ match.string = match.typeOf("string");
1012
+ match.object = match.typeOf("object");
1013
+ match.func = match.typeOf("function");
1014
+ match.array = match.typeOf("array");
1015
+ match.regexp = match.typeOf("regexp");
1016
+ match.date = match.typeOf("date");
1017
+
1018
+ if (commonJSModule) {
1019
+ module.exports = match;
1020
+ } else {
1021
+ sinon.match = match;
1022
+ }
1023
+ }(typeof sinon == "object" && sinon || null));
1024
+
1025
+ /**
1026
+ * @depend ../sinon.js
1027
+ * @depend match.js
1028
+ */
1029
+ /*jslint eqeqeq: false, onevar: false, plusplus: false*/
1030
+ /*global module, require, sinon*/
613
1031
  /**
614
1032
  * Spy functions
615
1033
  *
@@ -639,7 +1057,7 @@ var sinon = (function (buster) {
639
1057
  return spy.create(object);
640
1058
  }
641
1059
 
642
- if (!object || !property) {
1060
+ if (!object && !property) {
643
1061
  return spy.create(function () {});
644
1062
  }
645
1063
 
@@ -694,6 +1112,7 @@ var sinon = (function (buster) {
694
1112
  function incrementCallCount() {
695
1113
  this.called = true;
696
1114
  this.callCount += 1;
1115
+ this.notCalled = false;
697
1116
  this.calledOnce = this.callCount == 1;
698
1117
  this.calledTwice = this.callCount == 2;
699
1118
  this.calledThrice = this.callCount == 3;
@@ -712,6 +1131,7 @@ var sinon = (function (buster) {
712
1131
  var spyApi = {
713
1132
  reset: function () {
714
1133
  this.called = false;
1134
+ this.notCalled = true;
715
1135
  this.calledOnce = false;
716
1136
  this.calledTwice = false;
717
1137
  this.calledThrice = false;
@@ -725,6 +1145,11 @@ var sinon = (function (buster) {
725
1145
  this.thisValues = [];
726
1146
  this.exceptions = [];
727
1147
  this.callIds = [];
1148
+ if (this.fakes) {
1149
+ for (var i = 0; i < this.fakes.length; i++) {
1150
+ this.fakes[i].reset();
1151
+ }
1152
+ }
728
1153
  },
729
1154
 
730
1155
  create: function create(func) {
@@ -882,11 +1307,15 @@ var sinon = (function (buster) {
882
1307
  delegateToCalls(spyApi, "calledOn", true);
883
1308
  delegateToCalls(spyApi, "alwaysCalledOn", false, "calledOn");
884
1309
  delegateToCalls(spyApi, "calledWith", true);
1310
+ delegateToCalls(spyApi, "calledWithMatch", true);
885
1311
  delegateToCalls(spyApi, "alwaysCalledWith", false, "calledWith");
1312
+ delegateToCalls(spyApi, "alwaysCalledWithMatch", false, "calledWithMatch");
886
1313
  delegateToCalls(spyApi, "calledWithExactly", true);
887
1314
  delegateToCalls(spyApi, "alwaysCalledWithExactly", false, "calledWithExactly");
888
1315
  delegateToCalls(spyApi, "neverCalledWith", false, "notCalledWith",
889
1316
  function () { return true; });
1317
+ delegateToCalls(spyApi, "neverCalledWithMatch", false, "notCalledWithMatch",
1318
+ function () { return true; });
890
1319
  delegateToCalls(spyApi, "threw", true);
891
1320
  delegateToCalls(spyApi, "alwaysThrew", false, "threw");
892
1321
  delegateToCalls(spyApi, "returned", true);
@@ -937,7 +1366,13 @@ var sinon = (function (buster) {
937
1366
  },
938
1367
 
939
1368
  "*": function (spy, args) {
940
- return args.join(", ");
1369
+ var formatted = [];
1370
+
1371
+ for (var i = 0, l = args.length; i < l; ++i) {
1372
+ push.call(formatted, sinon.format(args[i]));
1373
+ }
1374
+
1375
+ return formatted.join(", ");
941
1376
  }
942
1377
  };
943
1378
 
@@ -982,22 +1417,32 @@ var sinon = (function (buster) {
982
1417
  return true;
983
1418
  },
984
1419
 
1420
+ calledWithMatch: function calledWithMatch() {
1421
+ for (var i = 0, l = arguments.length; i < l; i += 1) {
1422
+ var actual = this.args[i];
1423
+ var expectation = arguments[i];
1424
+ if (!sinon.match || !sinon.match(expectation).test(actual)) {
1425
+ return false;
1426
+ }
1427
+ }
1428
+ return true;
1429
+ },
1430
+
985
1431
  calledWithExactly: function calledWithExactly() {
986
1432
  return arguments.length == this.args.length &&
987
1433
  this.calledWith.apply(this, arguments);
988
1434
  },
989
1435
 
990
1436
  notCalledWith: function notCalledWith() {
991
- for (var i = 0, l = arguments.length; i < l; i += 1) {
992
- if (!sinon.deepEqual(arguments[i], this.args[i])) {
993
- return true;
994
- }
995
- }
996
- return false;
1437
+ return !this.calledWith.apply(this, arguments);
1438
+ },
1439
+
1440
+ notCalledWithMatch: function notCalledWithMatch() {
1441
+ return !this.calledWithMatch.apply(this, arguments);
997
1442
  },
998
1443
 
999
1444
  returned: function returned(value) {
1000
- return this.returnValue === value;
1445
+ return sinon.deepEqual(value, this.returnValue);
1001
1446
  },
1002
1447
 
1003
1448
  threw: function threw(error) {
@@ -1195,6 +1640,20 @@ var sinon = (function (buster) {
1195
1640
  return "argument at index " + stub.callArgAt + " is not a function: " + func;
1196
1641
  }
1197
1642
 
1643
+ var nextTick = (function () {
1644
+ if (typeof process === "object" && typeof process.nextTick === "function") {
1645
+ return process.nextTick;
1646
+ } else if (typeof msSetImmediate === "function") {
1647
+ return msSetImmediate.bind(window);
1648
+ } else if (typeof setImmediate === "function") {
1649
+ return setImmediate;
1650
+ } else {
1651
+ return function (callback) {
1652
+ setTimeout(callback, 0);
1653
+ };
1654
+ }
1655
+ })();
1656
+
1198
1657
  function callCallback(stub, args) {
1199
1658
  if (typeof stub.callArgAt == "number") {
1200
1659
  var func = getCallback(stub, args);
@@ -1203,14 +1662,20 @@ var sinon = (function (buster) {
1203
1662
  throw new TypeError(getCallbackError(stub, func, args));
1204
1663
  }
1205
1664
 
1206
- func.apply(stub.callbackContext, stub.callbackArguments);
1665
+ if (stub.callbackAsync) {
1666
+ nextTick(function() {
1667
+ func.apply(stub.callbackContext, stub.callbackArguments);
1668
+ });
1669
+ } else {
1670
+ func.apply(stub.callbackContext, stub.callbackArguments);
1671
+ }
1207
1672
  }
1208
1673
  }
1209
1674
 
1210
1675
  var uuid = 0;
1211
1676
 
1212
1677
  sinon.extend(stub, (function () {
1213
- var slice = Array.prototype.slice;
1678
+ var slice = Array.prototype.slice, proto;
1214
1679
 
1215
1680
  function throwsException(error, message) {
1216
1681
  if (typeof error == "string") {
@@ -1221,21 +1686,23 @@ var sinon = (function (buster) {
1221
1686
  } else {
1222
1687
  this.exception = error;
1223
1688
  }
1224
-
1689
+
1225
1690
  return this;
1226
1691
  }
1227
1692
 
1228
- return {
1693
+ proto = {
1229
1694
  create: function create() {
1230
1695
  var functionStub = function () {
1696
+
1697
+ callCallback(functionStub, arguments);
1698
+
1231
1699
  if (functionStub.exception) {
1232
1700
  throw functionStub.exception;
1233
1701
  } else if (typeof functionStub.returnArgAt == 'number') {
1234
1702
  return arguments[functionStub.returnArgAt];
1703
+ } else if (functionStub.returnThis) {
1704
+ return this;
1235
1705
  }
1236
-
1237
- callCallback(functionStub, arguments);
1238
-
1239
1706
  return functionStub.returnValue;
1240
1707
  };
1241
1708
 
@@ -1262,12 +1729,18 @@ var sinon = (function (buster) {
1262
1729
  if (typeof pos != "number") {
1263
1730
  throw new TypeError("argument index is not number");
1264
1731
  }
1265
-
1732
+
1266
1733
  this.returnArgAt = pos;
1267
1734
 
1268
1735
  return this;
1269
1736
  },
1270
1737
 
1738
+ returnsThis: function returnsThis() {
1739
+ this.returnThis = true;
1740
+
1741
+ return this;
1742
+ },
1743
+
1271
1744
  "throws": throwsException,
1272
1745
  throwsException: throwsException,
1273
1746
 
@@ -1363,6 +1836,21 @@ var sinon = (function (buster) {
1363
1836
  return this;
1364
1837
  }
1365
1838
  };
1839
+
1840
+ // create asynchronous versions of callsArg* and yields* methods
1841
+ for (var method in proto) {
1842
+ if (proto.hasOwnProperty(method) && method.match(/^(callsArg|yields)/)) {
1843
+ proto[method + 'Async'] = (function (syncFnName) {
1844
+ return function () {
1845
+ this.callbackAsync = true;
1846
+ return this[syncFnName].apply(this, arguments);
1847
+ };
1848
+ })(method);
1849
+ }
1850
+ }
1851
+
1852
+ return proto;
1853
+
1366
1854
  }()));
1367
1855
 
1368
1856
  if (commonJSModule) {
@@ -1488,6 +1976,8 @@ var sinon = (function (buster) {
1488
1976
 
1489
1977
  if (messages.length > 0) {
1490
1978
  sinon.expectation.fail(messages.concat(met).join("\n"));
1979
+ } else {
1980
+ sinon.expectation.pass(messages.concat(met).join("\n"));
1491
1981
  }
1492
1982
 
1493
1983
  return true;
@@ -1495,21 +1985,30 @@ var sinon = (function (buster) {
1495
1985
 
1496
1986
  invokeMethod: function invokeMethod(method, thisValue, args) {
1497
1987
  var expectations = this.expectations && this.expectations[method];
1498
- var length = expectations && expectations.length || 0;
1988
+ var length = expectations && expectations.length || 0, i;
1499
1989
 
1500
- for (var i = 0; i < length; i += 1) {
1990
+ for (i = 0; i < length; i += 1) {
1501
1991
  if (!expectations[i].met() &&
1502
1992
  expectations[i].allowsCall(thisValue, args)) {
1503
1993
  return expectations[i].apply(thisValue, args);
1504
1994
  }
1505
1995
  }
1506
1996
 
1507
- var messages = [];
1997
+ var messages = [], available, exhausted = 0;
1508
1998
 
1509
1999
  for (i = 0; i < length; i += 1) {
2000
+ if (expectations[i].allowsCall(thisValue, args)) {
2001
+ available = available || expectations[i];
2002
+ } else {
2003
+ exhausted += 1;
2004
+ }
1510
2005
  push.call(messages, " " + expectations[i].toString());
1511
2006
  }
1512
2007
 
2008
+ if (exhausted === 0) {
2009
+ return available.apply(thisValue, args);
2010
+ }
2011
+
1513
2012
  messages.unshift("Unexpected call: " + sinon.spyCall.toString.call({
1514
2013
  proxy: method,
1515
2014
  args: args
@@ -1660,7 +2159,7 @@ var sinon = (function (buster) {
1660
2159
  return;
1661
2160
  }
1662
2161
 
1663
- if (!args || args.length === 0) {
2162
+ if (!args) {
1664
2163
  sinon.expectation.fail(this.method + " received no arguments, expected " +
1665
2164
  this.expectedArguments.join());
1666
2165
  }
@@ -1685,7 +2184,7 @@ var sinon = (function (buster) {
1685
2184
  },
1686
2185
 
1687
2186
  allowsCall: function allowsCall(thisValue, args) {
1688
- if (this.met()) {
2187
+ if (this.met() && receivedMaxCalls(this)) {
1689
2188
  return false;
1690
2189
  }
1691
2190
 
@@ -1758,11 +2257,16 @@ var sinon = (function (buster) {
1758
2257
  verify: function verify() {
1759
2258
  if (!this.met()) {
1760
2259
  sinon.expectation.fail(this.toString());
2260
+ } else {
2261
+ sinon.expectation.pass(this.toString());
1761
2262
  }
1762
2263
 
1763
2264
  return true;
1764
2265
  },
1765
2266
 
2267
+ pass: function(message) {
2268
+ sinon.assert.pass(message);
2269
+ },
1766
2270
  fail: function (message) {
1767
2271
  var exception = new Error(message);
1768
2272
  exception.name = "ExpectationError";
@@ -1886,6 +2390,17 @@ var sinon = (function (buster) {
1886
2390
  });
1887
2391
  }
1888
2392
  }
2393
+ if (!property && !!object && typeof object == "object") {
2394
+ var stubbedObj = sinon.stub.apply(sinon, arguments);
2395
+
2396
+ for (var prop in stubbedObj) {
2397
+ if (typeof stubbedObj[prop] === "function") {
2398
+ this.add(stubbedObj[prop]);
2399
+ }
2400
+ }
2401
+
2402
+ return stubbedObj;
2403
+ }
1889
2404
 
1890
2405
  return this.add(sinon.stub.apply(sinon, arguments));
1891
2406
  },
@@ -1962,7 +2477,8 @@ if (typeof sinon == "undefined") {
1962
2477
  this.timeouts[toId] = {
1963
2478
  id: toId,
1964
2479
  func: args[0],
1965
- callAt: this.now + delay
2480
+ callAt: this.now + delay,
2481
+ invokeArgs: Array.prototype.slice.call(args, 2)
1966
2482
  };
1967
2483
 
1968
2484
  if (recurring === true) {
@@ -2096,7 +2612,8 @@ if (typeof sinon == "undefined") {
2096
2612
  func: this.timeouts[id].func,
2097
2613
  callAt: this.timeouts[id].callAt,
2098
2614
  interval: this.timeouts[id].interval,
2099
- id: this.timeouts[id].id
2615
+ id: this.timeouts[id].id,
2616
+ invokeArgs: this.timeouts[id].invokeArgs
2100
2617
  };
2101
2618
  }
2102
2619
  }
@@ -2106,9 +2623,15 @@ if (typeof sinon == "undefined") {
2106
2623
  },
2107
2624
 
2108
2625
  callTimer: function (timer) {
2626
+ if (typeof timer.interval == "number") {
2627
+ this.timeouts[timer.id].callAt += timer.interval;
2628
+ } else {
2629
+ delete this.timeouts[timer.id];
2630
+ }
2631
+
2109
2632
  try {
2110
2633
  if (typeof timer.func == "function") {
2111
- timer.func.call(null);
2634
+ timer.func.apply(null, timer.invokeArgs);
2112
2635
  } else {
2113
2636
  eval(timer.func);
2114
2637
  }
@@ -2123,12 +2646,6 @@ if (typeof sinon == "undefined") {
2123
2646
  return;
2124
2647
  }
2125
2648
 
2126
- if (typeof timer.interval == "number") {
2127
- this.timeouts[timer.id].callAt += timer.interval;
2128
- } else {
2129
- delete this.timeouts[timer.id];
2130
- }
2131
-
2132
2649
  if (exception) {
2133
2650
  throw exception;
2134
2651
  }
@@ -2204,11 +2721,19 @@ if (typeof sinon == "undefined") {
2204
2721
 
2205
2722
  for (var i = 0, l = this.methods.length; i < l; i++) {
2206
2723
  method = this.methods[i];
2207
- global[method] = this["_" + method];
2724
+ if (global[method].hadOwnProperty) {
2725
+ global[method] = this["_" + method];
2726
+ } else {
2727
+ delete global[method];
2728
+ }
2208
2729
  }
2730
+
2731
+ // Prevent multiple executions which will completely remove these props
2732
+ this.methods = [];
2209
2733
  }
2210
2734
 
2211
2735
  function stubGlobal(method, clock) {
2736
+ clock[method].hadOwnProperty = Object.prototype.hasOwnProperty.call(global, method);
2212
2737
  clock["_" + method] = global[method];
2213
2738
 
2214
2739
  if (method == "Date") {
@@ -2849,7 +3374,7 @@ sinon.fakeServer = (function () {
2849
3374
  return response;
2850
3375
  }
2851
3376
 
2852
- var wloc = window.location;
3377
+ var wloc = typeof window !== "undefined" ? window.location : {};
2853
3378
  var rCurrLoc = new RegExp("^" + wloc.protocol + "//" + wloc.host);
2854
3379
 
2855
3380
  function matchOne(response, reqMethod, reqUrl) {
@@ -3533,11 +4058,16 @@ if (typeof module == "object" && typeof require == "function") {
3533
4058
  mirrorPropAsAssertion("calledThrice", "expected %n to be called thrice but was called %c%C");
3534
4059
  mirrorPropAsAssertion("calledOn", "expected %n to be called with %1 as this but was called with %t");
3535
4060
  mirrorPropAsAssertion("alwaysCalledOn", "expected %n to always be called with %1 as this but was called with %t");
4061
+ mirrorPropAsAssertion("calledWithNew", "expected %n to be called with new");
4062
+ mirrorPropAsAssertion("alwaysCalledWithNew", "expected %n to always be called with new");
3536
4063
  mirrorPropAsAssertion("calledWith", "expected %n to be called with arguments %*%C");
4064
+ mirrorPropAsAssertion("calledWithMatch", "expected %n to be called with match %*%C");
3537
4065
  mirrorPropAsAssertion("alwaysCalledWith", "expected %n to always be called with arguments %*%C");
4066
+ mirrorPropAsAssertion("alwaysCalledWithMatch", "expected %n to always be called with match %*%C");
3538
4067
  mirrorPropAsAssertion("calledWithExactly", "expected %n to be called with exact arguments %*%C");
3539
4068
  mirrorPropAsAssertion("alwaysCalledWithExactly", "expected %n to always be called with exact arguments %*%C");
3540
4069
  mirrorPropAsAssertion("neverCalledWith", "expected %n to never be called with arguments %*%C");
4070
+ mirrorPropAsAssertion("neverCalledWithMatch", "expected %n to never be called with match %*%C");
3541
4071
  mirrorPropAsAssertion("threw", "%n did not throw exception%C");
3542
4072
  mirrorPropAsAssertion("alwaysThrew", "%n did not always throw exception%C");
3543
4073
 
@@ -3548,5 +4078,4 @@ if (typeof module == "object" && typeof require == "function") {
3548
4078
  }
3549
4079
  }(typeof sinon == "object" && sinon || null, typeof window != "undefined" ? window : global));
3550
4080
 
3551
- return sinon;}.call(typeof window != 'undefined' && window || {}));
3552
-
4081
+ return sinon;}.call(typeof window != 'undefined' && window || {}));
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sinon-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.2.1
4
+ version: 1.4.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-04-13 00:00:00.000000000 Z
12
+ date: 2012-09-07 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description:
15
15
  email:
@@ -48,7 +48,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
48
48
  version: '0'
49
49
  requirements: []
50
50
  rubyforge_project:
51
- rubygems_version: 1.8.19
51
+ rubygems_version: 1.8.23
52
52
  signing_key:
53
53
  specification_version: 3
54
54
  summary: sinon.js via asset pipeline