ember-source 1.3.0.beta.3 → 1.3.0.beta.4

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.

Potentially problematic release.


This version of ember-source might be problematic. Click here for more details.

checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ff5a6fc3eb4677debee445c9aab360b383381bdd
4
- data.tar.gz: debab909fe7d1cdbbda47cf804b31e54623d3fb7
3
+ metadata.gz: 0c97cbaa7499c9dabda7a41414d0a238bd4c65ef
4
+ data.tar.gz: 22fa502c0dd86ea6e46663f2358b2968a8458ce2
5
5
  SHA512:
6
- metadata.gz: 17fcd4f97238d920ed6269b7163556430295023b07ba13d829ef861391284d44c622127a2b668c274c793ff83554ee3c636ac4974c5092fd4fafe60e58f324e5
7
- data.tar.gz: 5e67e24f7aa5c86db645043d69f321d5436dcc6d7f8b2e9032be7ecfe8418873cbffc116e97705b4a66e184476c68709518c7f40bbd8e1c099bb703895b5f585
6
+ metadata.gz: 1afe19e69292627746d80dd1c404b77215f960438b9e0d6e4a8d6eafed5bf6673b80a7792bd7febafaf30ce68a74fa117bebf8804e170b3a0186897cd58eb478
7
+ data.tar.gz: cfe522afcb9c327e22aedd7b4185ed86ad2a636c91dfbe28e6dec565397da6eb4208eddd0ee4c84edee5d1d19fb2280bbbab045536fcb2e0133e89ef33dc498b
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.3.0-beta.3
1
+ 1.3.0-beta.4
@@ -1,14 +1,13 @@
1
- // ==========================================================================
2
- // Project: Ember - JavaScript Application Framework
3
- // Copyright: Copyright 2011-2013 Tilde Inc. and contributors
4
- // Portions Copyright 2006-2011 Strobe Inc.
5
- // Portions Copyright 2008-2011 Apple Inc. All rights reserved.
6
- // License: Licensed under MIT license
7
- // See https://raw.github.com/emberjs/ember.js/master/LICENSE
8
- // ==========================================================================
9
-
1
+ /*!
2
+ * @overview Ember - JavaScript Application Framework
3
+ * @copyright Copyright 2011-2013 Tilde Inc. and contributors
4
+ * Portions Copyright 2006-2011 Strobe Inc.
5
+ * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
6
+ * @license Licensed under MIT license
7
+ * See https://raw.github.com/emberjs/ember.js/master/LICENSE
8
+ * @version 1.4.0-beta.1+canary.dc0dc0ce
9
+ */
10
10
 
11
- // Version: 1.3.0-beta.3
12
11
 
13
12
  (function() {
14
13
  /*global __fail__*/
@@ -58,11 +57,6 @@ if (!('MANDATORY_SETTER' in Ember.ENV)) {
58
57
  */
59
58
  Ember.assert = function(desc, test) {
60
59
  if (!test) {
61
- Ember.Logger.assert(test, desc);
62
- }
63
-
64
- if (Ember.testing && !test) {
65
- // when testing, ensure test failures when assertions fail
66
60
  throw new Ember.Error("Assertion Failed: " + desc);
67
61
  }
68
62
  };
@@ -184,17 +178,16 @@ if (!Ember.testing) {
184
178
 
185
179
  })();
186
180
 
187
- // ==========================================================================
188
- // Project: Ember - JavaScript Application Framework
189
- // Copyright: Copyright 2011-2013 Tilde Inc. and contributors
190
- // Portions Copyright 2006-2011 Strobe Inc.
191
- // Portions Copyright 2008-2011 Apple Inc. All rights reserved.
192
- // License: Licensed under MIT license
193
- // See https://raw.github.com/emberjs/ember.js/master/LICENSE
194
- // ==========================================================================
195
-
181
+ /*!
182
+ * @overview Ember - JavaScript Application Framework
183
+ * @copyright Copyright 2011-2013 Tilde Inc. and contributors
184
+ * Portions Copyright 2006-2011 Strobe Inc.
185
+ * Portions Copyright 2008-2011 Apple Inc. All rights reserved.
186
+ * @license Licensed under MIT license
187
+ * See https://raw.github.com/emberjs/ember.js/master/LICENSE
188
+ * @version 1.4.0-beta.1+canary.dc0dc0ce
189
+ */
196
190
 
197
- // Version: 1.3.0-beta.3
198
191
 
199
192
  (function() {
200
193
  var define, requireModule, require, requirejs;
@@ -275,7 +268,7 @@ var define, requireModule, require, requirejs;
275
268
 
276
269
  @class Ember
277
270
  @static
278
- @version 1.3.0-beta.3
271
+ @version 1.4.0-beta.1+canary.dc0dc0ce
279
272
  */
280
273
 
281
274
  if ('undefined' === typeof Ember) {
@@ -302,10 +295,10 @@ Ember.toString = function() { return "Ember"; };
302
295
  /**
303
296
  @property VERSION
304
297
  @type String
305
- @default '1.3.0-beta.3'
298
+ @default '1.4.0-beta.1+canary.dc0dc0ce'
306
299
  @final
307
300
  */
308
- Ember.VERSION = '1.3.0-beta.3';
301
+ Ember.VERSION = '1.4.0-beta.1+canary.dc0dc0ce';
309
302
 
310
303
  /**
311
304
  Standard environmental variables. You can define these in a global `ENV`
@@ -1546,6 +1539,41 @@ Ember.typeOf = function(item) {
1546
1539
  return ret;
1547
1540
  };
1548
1541
 
1542
+ /**
1543
+ Convenience method to inspect an object. This method will attempt to
1544
+ convert the object into a useful string description.
1545
+
1546
+ It is a pretty simple implementation. If you want something more robust,
1547
+ use something like JSDump: https://github.com/NV/jsDump
1548
+
1549
+ @method inspect
1550
+ @for Ember
1551
+ @param {Object} obj The object you want to inspect.
1552
+ @return {String} A description of the object
1553
+ */
1554
+ Ember.inspect = function(obj) {
1555
+ var type = Ember.typeOf(obj);
1556
+ if (type === 'array') {
1557
+ return '[' + obj + ']';
1558
+ }
1559
+ if (type !== 'object') {
1560
+ return obj + '';
1561
+ }
1562
+
1563
+ var v, ret = [];
1564
+ for(var key in obj) {
1565
+ if (obj.hasOwnProperty(key)) {
1566
+ v = obj[key];
1567
+ if (v === 'toString') { continue; } // ignore useless items
1568
+ if (Ember.typeOf(v) === 'function') { v = "function() { ... }"; }
1569
+ ret.push(key + ": " + v);
1570
+ }
1571
+ }
1572
+ return "{" + ret.join(", ") + "}";
1573
+ };
1574
+
1575
+
1576
+
1549
1577
  })();
1550
1578
 
1551
1579
 
@@ -1957,7 +1985,7 @@ var normalizeTuple = Ember.normalizeTuple = function(target, path) {
1957
1985
  }
1958
1986
 
1959
1987
  // must return some kind of path to be valid else other things will break.
1960
- if (!path || path.length===0) throw new Ember.Error('Invalid Path');
1988
+ if (!path || path.length===0) throw new Ember.Error('Path cannot be empty');
1961
1989
 
1962
1990
  return [ target, path ];
1963
1991
  };
@@ -4010,6 +4038,52 @@ Ember.finishChains = function(obj) {
4010
4038
 
4011
4039
 
4012
4040
  (function() {
4041
+ if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
4042
+ /**
4043
+ @module ember-metal
4044
+ */
4045
+
4046
+ var forEach = Ember.EnumerableUtils.forEach,
4047
+ BRACE_EXPANSION = /^((?:[^\.]*\.)*)\{(.*)\}$/;
4048
+
4049
+ /**
4050
+ Expands `pattern`, invoking `callback` for each expansion.
4051
+
4052
+ The only pattern supported is brace-expansion, anything else will be passed
4053
+ once to `callback` directly. Brace expansion can only appear at the end of a
4054
+ pattern, for example as the last item in a chain.
4055
+
4056
+ Example
4057
+ ```js
4058
+ function echo(arg){ console.log(arg); }
4059
+
4060
+ Ember.expandProperties('foo.bar', echo); //=> 'foo.bar'
4061
+ Ember.expandProperties('{foo,bar}', echo); //=> 'foo', 'bar'
4062
+ Ember.expandProperties('foo.{bar,baz}', echo); //=> 'foo.bar', 'foo.baz'
4063
+ Ember.expandProperties('{foo,bar}.baz', echo); //=> '{foo,bar}.baz'
4064
+ ```
4065
+
4066
+ @method
4067
+ @private
4068
+ @param {string} pattern The property pattern to expand.
4069
+ @param {function} callback The callback to invoke. It is invoked once per
4070
+ expansion, and is passed the expansion.
4071
+ */
4072
+ Ember.expandProperties = function (pattern, callback) {
4073
+ var match, prefix, list;
4074
+
4075
+ if (match = BRACE_EXPANSION.exec(pattern)) {
4076
+ prefix = match[1];
4077
+ list = match[2];
4078
+
4079
+ forEach(list.split(','), function (suffix) {
4080
+ callback(prefix + suffix);
4081
+ });
4082
+ } else {
4083
+ callback(pattern);
4084
+ }
4085
+ };
4086
+ }
4013
4087
 
4014
4088
  })();
4015
4089
 
@@ -4215,6 +4289,9 @@ var get = Ember.get,
4215
4289
  watch = Ember.watch,
4216
4290
  unwatch = Ember.unwatch;
4217
4291
 
4292
+ if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
4293
+ var expandProperties = Ember.expandProperties;
4294
+ }
4218
4295
 
4219
4296
  // ..........................................................
4220
4297
  // DEPENDENT KEYS
@@ -4479,9 +4556,18 @@ ComputedPropertyPrototype.readOnly = function(readOnly) {
4479
4556
  ComputedPropertyPrototype.property = function() {
4480
4557
  var args;
4481
4558
 
4482
-
4559
+ if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
4560
+ var addArg = function (property) {
4561
+ args.push(property);
4562
+ };
4563
+
4564
+ args = [];
4565
+ for (var i = 0, l = arguments.length; i < l; i++) {
4566
+ expandProperties(arguments[i], addArg);
4567
+ }
4568
+ } else {
4483
4569
  args = a_slice.call(arguments);
4484
-
4570
+ }
4485
4571
 
4486
4572
  this._dependentKeys = args;
4487
4573
  return this;
@@ -4610,7 +4696,7 @@ ComputedPropertyPrototype.set = function(obj, keyName, value) {
4610
4696
  funcArgLength, cachedValue, ret;
4611
4697
 
4612
4698
  if (this._readOnly) {
4613
- throw new Ember.Error('Cannot Set: ' + keyName + ' on: ' + obj.toString() );
4699
+ throw new Ember.Error('Cannot Set: ' + keyName + ' on: ' + Ember.inspect(obj));
4614
4700
  }
4615
4701
 
4616
4702
  this._suspended = obj;
@@ -5287,7 +5373,51 @@ Ember.computed.oneWay = function(dependentKey) {
5287
5373
  });
5288
5374
  };
5289
5375
 
5376
+ if (Ember.FEATURES.isEnabled('computed-read-only')) {
5377
+ /**
5378
+ Where `computed.oneWay` provides oneWay bindings, `computed.readOnly` provides
5379
+ a readOnly one way binding. Very often when using `computed.oneWay` one does
5380
+ not also want changes to propogate back up, as they will replace the value.
5381
+
5382
+ This prevents the reverse flow, and also throws an exception when it occurs.
5383
+
5384
+ Example
5385
+
5386
+ ```javascript
5387
+ User = Ember.Object.extend({
5388
+ firstName: null,
5389
+ lastName: null,
5390
+ nickName: Ember.computed.readOnly('firstName')
5391
+ });
5392
+
5393
+ user = User.create({
5394
+ firstName: 'Teddy',
5395
+ lastName: 'Zeenny'
5396
+ });
5290
5397
 
5398
+ user.get('nickName');
5399
+ # 'Teddy'
5400
+
5401
+ user.set('nickName', 'TeddyBear');
5402
+ # throws Exception
5403
+ # throw new Ember.Error('Cannot Set: nickName on: <User:ember27288>' );`
5404
+
5405
+ user.get('firstName');
5406
+ # 'Teddy'
5407
+ ```
5408
+
5409
+ @method computed.readOnly
5410
+ @for Ember
5411
+ @param {String} dependentKey
5412
+ @return {Ember.ComputedProperty} computed property which creates a
5413
+ one way computed property to the original value for property.
5414
+ */
5415
+ Ember.computed.readOnly = function(dependentKey) {
5416
+ return Ember.computed(dependentKey, function() {
5417
+ return get(this, dependentKey);
5418
+ }).readOnly();
5419
+ };
5420
+ }
5291
5421
  /**
5292
5422
  A computed property that acts like a standard getter and setter,
5293
5423
  but returns the value at the provided `defaultPath` if the
@@ -6365,7 +6495,7 @@ Ember.run.later = function(target, method) {
6365
6495
  If you pass a string it will be resolved on the
6366
6496
  target at the time the method is invoked.
6367
6497
  @param {Object} [args*] Optional arguments to pass to the timeout.
6368
- @return {Object} timer
6498
+ @return {Object} Timer information for use in cancelling, see `Ember.run.cancel`.
6369
6499
  */
6370
6500
  Ember.run.once = function(target, method) {
6371
6501
  checkAutoRun();
@@ -6416,7 +6546,7 @@ Ember.run.once = function(target, method) {
6416
6546
  If you pass a string it will be resolved on the
6417
6547
  target at the time the method is invoked.
6418
6548
  @param {Object} [args*] Optional arguments to pass to the timeout.
6419
- @return {Object} timer
6549
+ @return {Object} Timer information for use in cancelling, see `Ember.run.cancel`.
6420
6550
  */
6421
6551
  Ember.run.scheduleOnce = function(queue, target, method) {
6422
6552
  checkAutoRun();
@@ -6478,7 +6608,7 @@ Ember.run.scheduleOnce = function(queue, target, method) {
6478
6608
  If you pass a string it will be resolved on the
6479
6609
  target at the time the method is invoked.
6480
6610
  @param {Object} [args*] Optional arguments to pass to the timeout.
6481
- @return {Object} timer
6611
+ @return {Object} Timer information for use in cancelling, see `Ember.run.cancel`.
6482
6612
  */
6483
6613
  Ember.run.next = function() {
6484
6614
  var args = slice.call(arguments);
@@ -6488,7 +6618,8 @@ Ember.run.next = function() {
6488
6618
 
6489
6619
  /**
6490
6620
  Cancels a scheduled item. Must be a value returned by `Ember.run.later()`,
6491
- `Ember.run.once()`, or `Ember.run.next()`.
6621
+ `Ember.run.once()`, `Ember.run.next()`, `Ember.run.debounce()`, or
6622
+ `Ember.run.throttle()`.
6492
6623
 
6493
6624
  ```javascript
6494
6625
  var runNext = Ember.run.next(myContext, function() {
@@ -6505,11 +6636,29 @@ Ember.run.next = function() {
6505
6636
  // will not be executed
6506
6637
  });
6507
6638
  Ember.run.cancel(runOnce);
6639
+
6640
+ var throttle = Ember.run.throttle(myContext, function() {
6641
+ // will not be executed
6642
+ }, 1);
6643
+ Ember.run.cancel(throttle);
6644
+
6645
+ var debounce = Ember.run.debounce(myContext, function() {
6646
+ // will not be executed
6647
+ }, 1);
6648
+ Ember.run.cancel(debounce);
6649
+
6650
+ var debounceImmediate = Ember.run.debounce(myContext, function() {
6651
+ // will be executed since we passed in true (immediate)
6652
+ }, 100, true);
6653
+ // the 100ms delay until this method can be called again will be cancelled
6654
+ Ember.run.cancel(debounceImmediate);
6655
+ ```
6656
+ ```
6508
6657
  ```
6509
6658
 
6510
6659
  @method cancel
6511
6660
  @param {Object} timer Timer object to cancel
6512
- @return {void}
6661
+ @return {Boolean} true if cancelled or false/undefined if it wasn't found
6513
6662
  */
6514
6663
  Ember.run.cancel = function(timer) {
6515
6664
  return backburner.cancel(timer);
@@ -6541,6 +6690,34 @@ Ember.run.cancel = function(timer) {
6541
6690
  // console logs 'debounce ran.' one time.
6542
6691
  ```
6543
6692
 
6693
+ Immediate allows you to run the function immediately, but debounce
6694
+ other calls for this function until the wait time has elapsed. If
6695
+ `debounce` is called again before the specified time has elapsed,
6696
+ the timer is reset and the entire period msut pass again before
6697
+ the method can be called again.
6698
+
6699
+ ```javascript
6700
+ var myFunc = function() { console.log(this.name + ' ran.'); };
6701
+ var myContext = {name: 'debounce'};
6702
+
6703
+ Ember.run.debounce(myContext, myFunc, 150, true);
6704
+
6705
+ // console logs 'debounce ran.' one time immediately.
6706
+ // 100ms passes
6707
+
6708
+ Ember.run.debounce(myContext, myFunc, 150, true);
6709
+
6710
+ // 150ms passes and nothing else is logged to the console and
6711
+ // the debouncee is no longer being watched
6712
+
6713
+ Ember.run.debounce(myContext, myFunc, 150, true);
6714
+
6715
+ // console logs 'debounce ran.' one time immediately.
6716
+ // 150ms passes and nothing else is logged tot he console and
6717
+ // the debouncee is no longer being watched
6718
+
6719
+ ```
6720
+
6544
6721
  @method debounce
6545
6722
  @param {Object} [target] target of method to invoke
6546
6723
  @param {Function|String} method The method to invoke.
@@ -6549,7 +6726,7 @@ Ember.run.cancel = function(timer) {
6549
6726
  @param {Object} [args*] Optional arguments to pass to the timeout.
6550
6727
  @param {Number} wait Number of milliseconds to wait.
6551
6728
  @param {Boolean} immediate Trigger the function on the leading instead of the trailing edge of the wait interval.
6552
- @return {void}
6729
+ @return {Array} Timer information for use in cancelling, see `Ember.run.cancel`.
6553
6730
  */
6554
6731
  Ember.run.debounce = function() {
6555
6732
  return backburner.debounce.apply(backburner, arguments);
@@ -6586,7 +6763,7 @@ Ember.run.debounce = function() {
6586
6763
  then it will be looked up on the passed target.
6587
6764
  @param {Object} [args*] Optional arguments to pass to the timeout.
6588
6765
  @param {Number} spacing Number of milliseconds to space out requests.
6589
- @return {void}
6766
+ @return {Array} Timer information for use in cancelling, see `Ember.run.cancel`.
6590
6767
  */
6591
6768
  Ember.run.throttle = function() {
6592
6769
  return backburner.throttle.apply(backburner, arguments);
@@ -7096,6 +7273,9 @@ var Mixin, REQUIRED, Alias,
7096
7273
  defineProperty = Ember.defineProperty,
7097
7274
  guidFor = Ember.guidFor;
7098
7275
 
7276
+ if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
7277
+ var expandProperties = Ember.expandProperties;
7278
+ }
7099
7279
 
7100
7280
  function mixinsMeta(obj) {
7101
7281
  var m = Ember.meta(obj, true), ret = m.mixins;
@@ -7669,35 +7849,6 @@ Alias = function(methodName) {
7669
7849
  };
7670
7850
  Alias.prototype = new Ember.Descriptor();
7671
7851
 
7672
- /**
7673
- Makes a property or method available via an additional name.
7674
-
7675
- ```javascript
7676
- App.PaintSample = Ember.Object.extend({
7677
- color: 'red',
7678
- colour: Ember.alias('color'),
7679
- name: function() {
7680
- return "Zed";
7681
- },
7682
- moniker: Ember.alias("name")
7683
- });
7684
-
7685
- var paintSample = App.PaintSample.create()
7686
- paintSample.get('colour'); // 'red'
7687
- paintSample.moniker(); // 'Zed'
7688
- ```
7689
-
7690
- @method alias
7691
- @for Ember
7692
- @param {String} methodName name of the method or property to alias
7693
- @return {Ember.Descriptor}
7694
- @deprecated Use `Ember.aliasMethod` or `Ember.computed.alias` instead
7695
- */
7696
- Ember.alias = function(methodName) {
7697
- Ember.deprecate("Ember.alias is deprecated. Please use Ember.aliasMethod or Ember.computed.alias instead.");
7698
- return new Alias(methodName);
7699
- };
7700
-
7701
7852
  /**
7702
7853
  Makes a method available via an additional name.
7703
7854
 
@@ -7752,7 +7903,23 @@ Ember.observer = function() {
7752
7903
  var func = a_slice.call(arguments, -1)[0];
7753
7904
  var paths;
7754
7905
 
7755
-
7906
+ if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
7907
+ var addWatchedProperty = function (path) { paths.push(path); };
7908
+ var _paths = a_slice.call(arguments, 0, -1);
7909
+
7910
+ if (typeof func !== "function") {
7911
+ // revert to old, soft-deprecated argument ordering
7912
+
7913
+ func = arguments[0];
7914
+ _paths = a_slice.call(arguments, 1);
7915
+ }
7916
+
7917
+ paths = [];
7918
+
7919
+ for (var i=0; i<_paths.length; ++i) {
7920
+ expandProperties(_paths[i], addWatchedProperty);
7921
+ }
7922
+ } else {
7756
7923
  paths = a_slice.call(arguments, 0, -1);
7757
7924
 
7758
7925
  if (typeof func !== "function") {
@@ -7761,7 +7928,7 @@ Ember.observer = function() {
7761
7928
  func = arguments[0];
7762
7929
  paths = a_slice.call(arguments, 1);
7763
7930
  }
7764
-
7931
+ }
7765
7932
 
7766
7933
  if (typeof func !== "function") {
7767
7934
  throw new Ember.Error("Ember.observer called without a function");
@@ -7850,7 +8017,24 @@ Ember.beforeObserver = function() {
7850
8017
  var func = a_slice.call(arguments, -1)[0];
7851
8018
  var paths;
7852
8019
 
7853
-
8020
+ if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
8021
+ var addWatchedProperty = function(path) { paths.push(path); };
8022
+
8023
+ var _paths = a_slice.call(arguments, 0, -1);
8024
+
8025
+ if (typeof func !== "function") {
8026
+ // revert to old, soft-deprecated argument ordering
8027
+
8028
+ func = arguments[0];
8029
+ _paths = a_slice.call(arguments, 1);
8030
+ }
8031
+
8032
+ paths = [];
8033
+
8034
+ for (var i=0; i<_paths.length; ++i) {
8035
+ expandProperties(_paths[i], addWatchedProperty);
8036
+ }
8037
+ } else {
7854
8038
  paths = a_slice.call(arguments, 0, -1);
7855
8039
 
7856
8040
  if (typeof func !== "function") {
@@ -7859,7 +8043,7 @@ Ember.beforeObserver = function() {
7859
8043
  func = arguments[0];
7860
8044
  paths = a_slice.call(arguments, 1);
7861
8045
  }
7862
-
8046
+ }
7863
8047
 
7864
8048
  if (typeof func !== "function") {
7865
8049
  throw new Ember.Error("Ember.beforeObserver called without a function");
@@ -7937,7 +8121,7 @@ Ember Metal
7937
8121
  @class RSVP
7938
8122
  @module RSVP
7939
8123
  */
7940
- define("rsvp/all",
8124
+ define("rsvp/all",
7941
8125
  ["./promise","./utils","exports"],
7942
8126
  function(__dependency1__, __dependency2__, __exports__) {
7943
8127
  "use strict";
@@ -8033,7 +8217,7 @@ define("rsvp/all",
8033
8217
  __exports__.all = all;
8034
8218
  });
8035
8219
 
8036
- define("rsvp/cast",
8220
+ define("rsvp/cast",
8037
8221
  ["exports"],
8038
8222
  function(__exports__) {
8039
8223
  "use strict";
@@ -8104,7 +8288,7 @@ define("rsvp/cast",
8104
8288
 
8105
8289
  __exports__.cast = cast;
8106
8290
  });
8107
- define("rsvp/config",
8291
+ define("rsvp/config",
8108
8292
  ["./events","exports"],
8109
8293
  function(__dependency1__, __exports__) {
8110
8294
  "use strict";
@@ -8135,7 +8319,7 @@ define("rsvp/config",
8135
8319
  __exports__.config = config;
8136
8320
  __exports__.configure = configure;
8137
8321
  });
8138
- define("rsvp/defer",
8322
+ define("rsvp/defer",
8139
8323
  ["./promise","exports"],
8140
8324
  function(__dependency1__, __exports__) {
8141
8325
  "use strict";
@@ -8190,7 +8374,7 @@ define("rsvp/defer",
8190
8374
 
8191
8375
  __exports__.defer = defer;
8192
8376
  });
8193
- define("rsvp/events",
8377
+ define("rsvp/events",
8194
8378
  ["exports"],
8195
8379
  function(__exports__) {
8196
8380
  "use strict";
@@ -8399,7 +8583,7 @@ define("rsvp/events",
8399
8583
 
8400
8584
  __exports__.EventTarget = EventTarget;
8401
8585
  });
8402
- define("rsvp/hash",
8586
+ define("rsvp/hash",
8403
8587
  ["./promise","./utils","exports"],
8404
8588
  function(__dependency1__, __dependency2__, __exports__) {
8405
8589
  "use strict";
@@ -8544,7 +8728,7 @@ define("rsvp/hash",
8544
8728
 
8545
8729
  __exports__.hash = hash;
8546
8730
  });
8547
- define("rsvp/instrument",
8731
+ define("rsvp/instrument",
8548
8732
  ["./config","./utils","exports"],
8549
8733
  function(__dependency1__, __dependency2__, __exports__) {
8550
8734
  "use strict";
@@ -8571,7 +8755,7 @@ define("rsvp/instrument",
8571
8755
 
8572
8756
  __exports__.instrument = instrument;
8573
8757
  });
8574
- define("rsvp/node",
8758
+ define("rsvp/node",
8575
8759
  ["./promise","./all","exports"],
8576
8760
  function(__dependency1__, __dependency2__, __exports__) {
8577
8761
  "use strict";
@@ -8686,7 +8870,7 @@ define("rsvp/node",
8686
8870
 
8687
8871
  __exports__.denodeify = denodeify;
8688
8872
  });
8689
- define("rsvp/promise",
8873
+ define("rsvp/promise",
8690
8874
  ["./config","./events","./cast","./instrument","./utils","exports"],
8691
8875
  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __exports__) {
8692
8876
  "use strict";
@@ -8935,7 +9119,7 @@ define("rsvp/promise",
8935
9119
 
8936
9120
  __exports__.Promise = Promise;
8937
9121
  });
8938
- define("rsvp/race",
9122
+ define("rsvp/race",
8939
9123
  ["./promise","./utils","exports"],
8940
9124
  function(__dependency1__, __dependency2__, __exports__) {
8941
9125
  "use strict";
@@ -9027,7 +9211,7 @@ define("rsvp/race",
9027
9211
 
9028
9212
  __exports__.race = race;
9029
9213
  });
9030
- define("rsvp/reject",
9214
+ define("rsvp/reject",
9031
9215
  ["./promise","exports"],
9032
9216
  function(__dependency1__, __exports__) {
9033
9217
  "use strict";
@@ -9077,7 +9261,7 @@ define("rsvp/reject",
9077
9261
 
9078
9262
  __exports__.reject = reject;
9079
9263
  });
9080
- define("rsvp/resolve",
9264
+ define("rsvp/resolve",
9081
9265
  ["./promise","exports"],
9082
9266
  function(__dependency1__, __exports__) {
9083
9267
  "use strict";
@@ -9123,7 +9307,7 @@ define("rsvp/resolve",
9123
9307
 
9124
9308
  __exports__.resolve = resolve;
9125
9309
  });
9126
- define("rsvp/rethrow",
9310
+ define("rsvp/rethrow",
9127
9311
  ["exports"],
9128
9312
  function(__exports__) {
9129
9313
  "use strict";
@@ -9176,7 +9360,7 @@ define("rsvp/rethrow",
9176
9360
 
9177
9361
  __exports__.rethrow = rethrow;
9178
9362
  });
9179
- define("rsvp/utils",
9363
+ define("rsvp/utils",
9180
9364
  ["exports"],
9181
9365
  function(__exports__) {
9182
9366
  "use strict";
@@ -9202,7 +9386,7 @@ define("rsvp/utils",
9202
9386
  __exports__.isArray = isArray;
9203
9387
  __exports__.now = now;
9204
9388
  });
9205
- define("rsvp",
9389
+ define("rsvp",
9206
9390
  ["./rsvp/events","./rsvp/promise","./rsvp/node","./rsvp/all","./rsvp/race","./rsvp/hash","./rsvp/rethrow","./rsvp/defer","./rsvp/config","./rsvp/resolve","./rsvp/reject", "exports"],
9207
9391
  function(__dependency1__, __dependency2__, __dependency3__, __dependency4__, __dependency5__, __dependency6__, __dependency7__, __dependency8__, __dependency9__, __dependency10__, __dependency11__, __exports__) {
9208
9392
  "use strict";
@@ -9246,6 +9430,7 @@ define("rsvp",
9246
9430
  __exports__.reject = reject;
9247
9431
  __exports__.async = async;
9248
9432
  });
9433
+
9249
9434
  })();
9250
9435
 
9251
9436
  (function() {
@@ -9266,6 +9451,7 @@ Ember.MODEL_FACTORY_INJECTIONS = false || !!Ember.ENV.MODEL_FACTORY_INJECTIONS;
9266
9451
  define("container",
9267
9452
  [],
9268
9453
  function() {
9454
+ "use strict";
9269
9455
 
9270
9456
  // A safe and simple inheriting object.
9271
9457
  function InheritingDict(parent) {
@@ -9387,7 +9573,8 @@ define("container",
9387
9573
 
9388
9574
  this.registry = new InheritingDict(parent && parent.registry);
9389
9575
  this.cache = new InheritingDict(parent && parent.cache);
9390
- this.factoryCache = new InheritingDict(parent && parent.cache);
9576
+ this.factoryCache = new InheritingDict(parent && parent.factoryCache);
9577
+ this.resolveCache = new InheritingDict(parent && parent.resolveCache);
9391
9578
  this.typeInjections = new InheritingDict(parent && parent.typeInjections);
9392
9579
  this.injections = {};
9393
9580
 
@@ -9508,9 +9695,7 @@ define("container",
9508
9695
  @param {Object} options
9509
9696
  */
9510
9697
  register: function(fullName, factory, options) {
9511
- if (fullName.indexOf(':') === -1) {
9512
- throw new TypeError("malformed fullName, expected: `type:name` got: " + fullName + "");
9513
- }
9698
+ validateFullName(fullName);
9514
9699
 
9515
9700
  if (factory === undefined) {
9516
9701
  throw new TypeError('Attempting to register an unknown factory: `' + fullName + '`');
@@ -9543,11 +9728,14 @@ define("container",
9543
9728
  @param {String} fullName
9544
9729
  */
9545
9730
  unregister: function(fullName) {
9731
+ validateFullName(fullName);
9732
+
9546
9733
  var normalizedName = this.normalize(fullName);
9547
9734
 
9548
9735
  this.registry.remove(normalizedName);
9549
9736
  this.cache.remove(normalizedName);
9550
9737
  this.factoryCache.remove(normalizedName);
9738
+ this.resolveCache.remove(normalizedName);
9551
9739
  this._options.remove(normalizedName);
9552
9740
  },
9553
9741
 
@@ -9584,7 +9772,18 @@ define("container",
9584
9772
  @return {Function} fullName's factory
9585
9773
  */
9586
9774
  resolve: function(fullName) {
9587
- return this.resolver(fullName) || this.registry.get(fullName);
9775
+ validateFullName(fullName);
9776
+
9777
+ var normalizedName = this.normalize(fullName);
9778
+ var cached = this.resolveCache.get(normalizedName);
9779
+
9780
+ if (cached) { return cached; }
9781
+
9782
+ var resolved = this.resolver(normalizedName) || this.registry.get(normalizedName);
9783
+
9784
+ this.resolveCache.set(normalizedName, resolved);
9785
+
9786
+ return resolved;
9588
9787
  },
9589
9788
 
9590
9789
  /**
@@ -9665,23 +9864,8 @@ define("container",
9665
9864
  @return {any}
9666
9865
  */
9667
9866
  lookup: function(fullName, options) {
9668
- fullName = this.normalize(fullName);
9669
-
9670
- options = options || {};
9671
-
9672
- if (this.cache.has(fullName) && options.singleton !== false) {
9673
- return this.cache.get(fullName);
9674
- }
9675
-
9676
- var value = instantiate(this, fullName);
9677
-
9678
- if (value === undefined) { return; }
9679
-
9680
- if (isSingleton(this, fullName) && options.singleton !== false) {
9681
- this.cache.set(fullName, value);
9682
- }
9683
-
9684
- return value;
9867
+ validateFullName(fullName);
9868
+ return lookup(this, this.normalize(fullName), options);
9685
9869
  },
9686
9870
 
9687
9871
  /**
@@ -9692,7 +9876,8 @@ define("container",
9692
9876
  @return {any}
9693
9877
  */
9694
9878
  lookupFactory: function(fullName) {
9695
- return factoryFor(this, fullName);
9879
+ validateFullName(fullName);
9880
+ return factoryFor(this, this.normalize(fullName));
9696
9881
  },
9697
9882
 
9698
9883
  /**
@@ -9704,11 +9889,8 @@ define("container",
9704
9889
  @return {Boolean}
9705
9890
  */
9706
9891
  has: function(fullName) {
9707
- if (this.cache.has(fullName)) {
9708
- return true;
9709
- }
9710
-
9711
- return !!this.resolve(fullName);
9892
+ validateFullName(fullName);
9893
+ return has(this, this.normalize(fullName));
9712
9894
  },
9713
9895
 
9714
9896
  /**
@@ -9790,6 +9972,7 @@ define("container",
9790
9972
  @param {String} fullName
9791
9973
  */
9792
9974
  typeInjection: function(type, property, fullName) {
9975
+ validateFullName(fullName);
9793
9976
  if (this.parent) { illegalChildOperation('typeInjection'); }
9794
9977
 
9795
9978
  addTypeInjection(this.typeInjections, type, property, fullName);
@@ -9839,14 +10022,20 @@ define("container",
9839
10022
  @param {String} property
9840
10023
  @param {String} injectionName
9841
10024
  */
9842
- injection: function(factoryName, property, injectionName) {
10025
+ injection: function(fullName, property, injectionName) {
9843
10026
  if (this.parent) { illegalChildOperation('injection'); }
9844
10027
 
9845
- if (factoryName.indexOf(':') === -1) {
9846
- return this.typeInjection(factoryName, property, injectionName);
10028
+ validateFullName(injectionName);
10029
+ var normalizedInjectionName = this.normalize(injectionName);
10030
+
10031
+ if (fullName.indexOf(':') === -1) {
10032
+ return this.typeInjection(fullName, property, normalizedInjectionName);
9847
10033
  }
9848
10034
 
9849
- addInjection(this.injections, factoryName, property, injectionName);
10035
+ validateFullName(fullName);
10036
+ var normalizedName = this.normalize(fullName);
10037
+
10038
+ addInjection(this.injections, normalizedName, property, normalizedInjectionName);
9850
10039
  },
9851
10040
 
9852
10041
 
@@ -9883,7 +10072,7 @@ define("container",
9883
10072
  factoryTypeInjection: function(type, property, fullName) {
9884
10073
  if (this.parent) { illegalChildOperation('factoryTypeInjection'); }
9885
10074
 
9886
- addTypeInjection(this.factoryTypeInjections, type, property, fullName);
10075
+ addTypeInjection(this.factoryTypeInjections, type, property, this.normalize(fullName));
9887
10076
  },
9888
10077
 
9889
10078
  /**
@@ -9935,14 +10124,21 @@ define("container",
9935
10124
  @param {String} property
9936
10125
  @param {String} injectionName
9937
10126
  */
9938
- factoryInjection: function(factoryName, property, injectionName) {
10127
+ factoryInjection: function(fullName, property, injectionName) {
9939
10128
  if (this.parent) { illegalChildOperation('injection'); }
9940
10129
 
9941
- if (factoryName.indexOf(':') === -1) {
9942
- return this.factoryTypeInjection(factoryName, property, injectionName);
10130
+ var normalizedName = this.normalize(fullName);
10131
+ var normalizedInjectionName = this.normalize(injectionName);
10132
+
10133
+ validateFullName(injectionName);
10134
+
10135
+ if (fullName.indexOf(':') === -1) {
10136
+ return this.factoryTypeInjection(normalizedName, property, normalizedInjectionName);
9943
10137
  }
9944
10138
 
9945
- addInjection(this.factoryInjections, factoryName, property, injectionName);
10139
+ validateFullName(fullName);
10140
+
10141
+ addInjection(this.factoryInjections, normalizedName, property, normalizedInjectionName);
9946
10142
  },
9947
10143
 
9948
10144
  /**
@@ -9952,7 +10148,6 @@ define("container",
9952
10148
  @method destroy
9953
10149
  */
9954
10150
  destroy: function() {
9955
-
9956
10151
  for (var i=0, l=this.children.length; i<l; i++) {
9957
10152
  this.children[i].destroy();
9958
10153
  }
@@ -9978,6 +10173,32 @@ define("container",
9978
10173
  }
9979
10174
  };
9980
10175
 
10176
+ function has(container, fullName){
10177
+ if (container.cache.has(fullName)) {
10178
+ return true;
10179
+ }
10180
+
10181
+ return !!container.resolve(fullName);
10182
+ }
10183
+
10184
+ function lookup(container, fullName, options) {
10185
+ options = options || {};
10186
+
10187
+ if (container.cache.has(fullName) && options.singleton !== false) {
10188
+ return container.cache.get(fullName);
10189
+ }
10190
+
10191
+ var value = instantiate(container, fullName);
10192
+
10193
+ if (value === undefined) { return; }
10194
+
10195
+ if (isSingleton(container, fullName) && options.singleton !== false) {
10196
+ container.cache.set(fullName, value);
10197
+ }
10198
+
10199
+ return value;
10200
+ }
10201
+
9981
10202
  function illegalChildOperation(operation) {
9982
10203
  throw new Error(operation + " is not currently supported on child containers");
9983
10204
  }
@@ -9993,14 +10214,14 @@ define("container",
9993
10214
 
9994
10215
  if (!injections) { return hash; }
9995
10216
 
9996
- var injection, lookup;
10217
+ var injection, injectable;
9997
10218
 
9998
10219
  for (var i=0, l=injections.length; i<l; i++) {
9999
10220
  injection = injections[i];
10000
- lookup = container.lookup(injection.fullName);
10221
+ injectable = lookup(container, injection.fullName);
10001
10222
 
10002
- if (lookup !== undefined) {
10003
- hash[injection.property] = lookup;
10223
+ if (injectable !== undefined) {
10224
+ hash[injection.property] = injectable;
10004
10225
  } else {
10005
10226
  throw new Error('Attempting to inject an unknown injection: `' + injection.fullName + '`');
10006
10227
  }
@@ -10025,7 +10246,7 @@ define("container",
10025
10246
  }
10026
10247
 
10027
10248
  function factoryFor(container, fullName) {
10028
- var name = container.normalize(fullName);
10249
+ var name = fullName;
10029
10250
  var factory = container.resolve(name);
10030
10251
  var injectedFactory;
10031
10252
  var cache = container.factoryCache;
@@ -10135,6 +10356,13 @@ define("container",
10135
10356
  });
10136
10357
  }
10137
10358
 
10359
+ var VALID_FULL_NAME_REGEXP = /^[^:]+.+:[^:]+$/;
10360
+ function validateFullName(fullName) {
10361
+ if (!VALID_FULL_NAME_REGEXP.test(fullName)) {
10362
+ throw new TypeError('Invalid Fullname, expected: `type:name` got: ' + fullName);
10363
+ }
10364
+ }
10365
+
10138
10366
  function addInjection(rules, factoryName, property, injectionName) {
10139
10367
  var injections = rules[factoryName] = rules[factoryName] || [];
10140
10368
  injections.push({ property: property, fullName: injectionName });
@@ -10329,39 +10557,6 @@ Ember.copy = function(obj, deep) {
10329
10557
  return _copy(obj, deep, deep ? [] : null, deep ? [] : null);
10330
10558
  };
10331
10559
 
10332
- /**
10333
- Convenience method to inspect an object. This method will attempt to
10334
- convert the object into a useful string description.
10335
-
10336
- It is a pretty simple implementation. If you want something more robust,
10337
- use something like JSDump: https://github.com/NV/jsDump
10338
-
10339
- @method inspect
10340
- @for Ember
10341
- @param {Object} obj The object you want to inspect.
10342
- @return {String} A description of the object
10343
- */
10344
- Ember.inspect = function(obj) {
10345
- var type = Ember.typeOf(obj);
10346
- if (type === 'array') {
10347
- return '[' + obj + ']';
10348
- }
10349
- if (type !== 'object') {
10350
- return obj + '';
10351
- }
10352
-
10353
- var v, ret = [];
10354
- for(var key in obj) {
10355
- if (obj.hasOwnProperty(key)) {
10356
- v = obj[key];
10357
- if (v === 'toString') { continue; } // ignore useless items
10358
- if (Ember.typeOf(v) === 'function') { v = "function() { ... }"; }
10359
- ret.push(key + ": " + v);
10360
- }
10361
- }
10362
- return "{" + ret.join(", ") + "}";
10363
- };
10364
-
10365
10560
  /**
10366
10561
  Compares two objects, returning true if they are logically equal. This is
10367
10562
  a deeper comparison than a simple triple equal. For sets it will compare the
@@ -10466,6 +10661,10 @@ var STRING_DECAMELIZE_REGEXP = (/([a-z\d])([A-Z])/g);
10466
10661
  var STRING_CAMELIZE_REGEXP = (/(\-|_|\.|\s)+(.)?/g);
10467
10662
  var STRING_UNDERSCORE_REGEXP_1 = (/([a-z\d])([A-Z]+)/g);
10468
10663
  var STRING_UNDERSCORE_REGEXP_2 = (/\-|\s+/g);
10664
+ var STRING_PARAMETERIZE_REGEXP_1 = (/[_|\/|\s]+/g);
10665
+ var STRING_PARAMETERIZE_REGEXP_2 = (/[^a-z0-9\-]+/gi);
10666
+ var STRING_PARAMETERIZE_REGEXP_3 = (/[\-]+/g);
10667
+ var STRING_PARAMETERIZE_REGEXP_4 = (/^-+|-+$/g);
10469
10668
 
10470
10669
  /**
10471
10670
  Defines the hash of localized strings for the current language. Used by
@@ -10704,6 +10903,54 @@ Ember.String = {
10704
10903
  }
10705
10904
  };
10706
10905
 
10906
+ if (Ember.FEATURES.isEnabled("string-humanize")) {
10907
+ /**
10908
+ Returns the Humanized form of a string
10909
+
10910
+ Replaces underscores with spaces, and capitializes first character
10911
+ of string. Also strips "_id" suffixes.
10912
+
10913
+ ```javascript
10914
+ 'first_name'.humanize() // 'First name'
10915
+ 'user_id'.humanize() // 'User'
10916
+ ```
10917
+
10918
+ @method humanize
10919
+ @param {String} str The string to humanize.
10920
+ @return {String} The humanized string.
10921
+ */
10922
+
10923
+ Ember.String.humanize = function(str) {
10924
+ return str.replace(/_id$/, '').
10925
+ replace(/_/g, ' ').
10926
+ replace(/^\w/g, function(s){
10927
+ return s.toUpperCase();
10928
+ });
10929
+ };
10930
+ }
10931
+
10932
+ if (Ember.FEATURES.isEnabled("string-parameterize")) {
10933
+ /**
10934
+ Transforms a string so that it may be used as part of a 'pretty' / SEO friendly URL.
10935
+
10936
+ ```javascript
10937
+ 'My favorite items.'.parameterize(); // 'my-favorite-items'
10938
+ 'action_name'.parameterize(); // 'action-name'
10939
+ '100 ways Ember.js is better than Angular.'.parameterize(); // '100-ways-emberjs-is-better-than-angular'
10940
+ ```
10941
+
10942
+ @method parameterize
10943
+ @param {String} str The string to parameterize.
10944
+ @return {String} the parameterized string.
10945
+ */
10946
+ Ember.String.parameterize = function(str) {
10947
+ return str.replace(STRING_PARAMETERIZE_REGEXP_1, '-') // replace underscores, slashes and spaces with separator
10948
+ .replace(STRING_PARAMETERIZE_REGEXP_2, '') // remove non-alphanumeric characters except the separator
10949
+ .replace(STRING_PARAMETERIZE_REGEXP_3, '-') // replace multiple occurring separators
10950
+ .replace(STRING_PARAMETERIZE_REGEXP_4, '') // trim leading and trailing separators
10951
+ .toLowerCase();
10952
+ };
10953
+ }
10707
10954
 
10708
10955
 
10709
10956
  })();
@@ -10728,6 +10975,13 @@ var fmt = Ember.String.fmt,
10728
10975
  capitalize = Ember.String.capitalize,
10729
10976
  classify = Ember.String.classify;
10730
10977
 
10978
+ if (Ember.FEATURES.isEnabled("string-humanize")) {
10979
+ var humanize = Ember.String.humanize;
10980
+ }
10981
+
10982
+ if (Ember.FEATURES.isEnabled("string-parameterize")) {
10983
+ var parameterize = Ember.String.parameterize;
10984
+ }
10731
10985
 
10732
10986
  if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
10733
10987
 
@@ -10821,7 +11075,30 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.String) {
10821
11075
  return capitalize(this);
10822
11076
  };
10823
11077
 
10824
-
11078
+ if (Ember.FEATURES.isEnabled("string-humanize")) {
11079
+ /**
11080
+ See [Ember.String.humanize](/api/classes/Ember.String.html#method_humanize).
11081
+
11082
+ @method humanize
11083
+ @for String
11084
+ */
11085
+ String.prototype.humanize = function() {
11086
+ return humanize(this);
11087
+ };
11088
+ }
11089
+
11090
+ if (Ember.FEATURES.isEnabled("string-parameterize")) {
11091
+ /**
11092
+ See [Ember.String.parameterize](/api/classes/Ember.String.html#method_parameterize).
11093
+
11094
+ @method parameterize
11095
+ @for String
11096
+ */
11097
+ String.prototype.parameterize = function() {
11098
+ return parameterize(this);
11099
+ };
11100
+ }
11101
+
10825
11102
  }
10826
11103
 
10827
11104
 
@@ -13194,7 +13471,7 @@ Ember.Enumerable = Ember.Mixin.create({
13194
13471
  var ret = initialValue;
13195
13472
 
13196
13473
  this.forEach(function(item, i) {
13197
- ret = callback.call(null, ret, item, i, this, reducerProperty);
13474
+ ret = callback(ret, item, i, this, reducerProperty);
13198
13475
  }, this);
13199
13476
 
13200
13477
  return ret;
@@ -13217,7 +13494,7 @@ Ember.Enumerable = Ember.Mixin.create({
13217
13494
  this.forEach(function(x, idx) {
13218
13495
  var method = x && x[methodName];
13219
13496
  if ('function' === typeof method) {
13220
- ret[idx] = args ? method.apply(x, args) : method.call(x);
13497
+ ret[idx] = args ? method.apply(x, args) : x[methodName]();
13221
13498
  }
13222
13499
  }, this);
13223
13500
 
@@ -13412,8 +13689,6 @@ Ember.Enumerable = Ember.Mixin.create({
13412
13689
  notify range observers.
13413
13690
 
13414
13691
  @method enumerableContentDidChange
13415
- @param {Number} [start] optional start offset for the content change.
13416
- For unordered enumerables, you should always pass -1.
13417
13692
  @param {Ember.Enumerable|Number} removing An enumerable of the objects to
13418
13693
  be removed or the number of items to be removed.
13419
13694
  @param {Ember.Enumerable|Number} adding An enumerable of the objects to
@@ -13623,7 +13898,7 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
13623
13898
 
13624
13899
  @method slice
13625
13900
  @param {Integer} beginIndex (Optional) index to begin slicing from.
13626
- @param {Integer} endIndex (Optional) index to end the slice at.
13901
+ @param {Integer} endIndex (Optional) index to end the slice at (but not included).
13627
13902
  @return {Array} New array with specified slice
13628
13903
  */
13629
13904
  slice: function(beginIndex, endIndex) {
@@ -13774,7 +14049,7 @@ Ember.Array = Ember.Mixin.create(Ember.Enumerable, /** @scope Ember.Array.protot
13774
14049
  Becomes true whenever the array currently has observers watching changes
13775
14050
  on the array.
13776
14051
 
13777
- @property Boolean
14052
+ @property {Boolean} hasArrayObservers
13778
14053
  */
13779
14054
  hasArrayObservers: Ember.computed(function() {
13780
14055
  return Ember.hasListeners(this, '@array:change') || Ember.hasListeners(this, '@array:before');
@@ -13923,6 +14198,9 @@ var e_get = Ember.get,
13923
14198
  doubleEachPropertyPattern = /(.*\.@each){2,}/,
13924
14199
  arrayBracketPattern = /\.\[\]$/;
13925
14200
 
14201
+ if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
14202
+ var expandProperties = Ember.expandProperties;
14203
+ }
13926
14204
 
13927
14205
  function get(obj, key) {
13928
14206
  if (key === '@this') {
@@ -14508,10 +14786,17 @@ ReduceComputedProperty.prototype.property = function () {
14508
14786
  } else if (match = eachPropertyPattern.exec(dependentKey)) {
14509
14787
  dependentArrayKey = match[1];
14510
14788
 
14511
-
14789
+ if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
14790
+ var itemPropertyKeyPattern = match[2],
14791
+ addItemPropertyKey = function (itemPropertyKey) {
14792
+ cp.itemPropertyKey(dependentArrayKey, itemPropertyKey);
14793
+ };
14794
+
14795
+ expandProperties(itemPropertyKeyPattern, addItemPropertyKey);
14796
+ } else {
14512
14797
  itemPropertyKey = match[2];
14513
14798
  cp.itemPropertyKey(dependentArrayKey, itemPropertyKey);
14514
-
14799
+ }
14515
14800
  propertyArgs.add(dependentArrayKey);
14516
14801
  } else {
14517
14802
  propertyArgs.add(dependentKey);
@@ -14622,7 +14907,7 @@ ReduceComputedProperty.prototype.property = function () {
14622
14907
 
14623
14908
  ```javascript
14624
14909
  Ember.computed.max = function (dependentKey) {
14625
- return Ember.reduceComputed.call(null, dependentKey, {
14910
+ return Ember.reduceComputed(dependentKey, {
14626
14911
  initialValue: -Infinity,
14627
14912
 
14628
14913
  addedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
@@ -14931,8 +15216,6 @@ var get = Ember.get,
14931
15216
  dependent array. This will return `-Infinity` when the dependent
14932
15217
  array is empty.
14933
15218
 
14934
- Example
14935
-
14936
15219
  ```javascript
14937
15220
  App.Person = Ember.Object.extend({
14938
15221
  childAges: Ember.computed.mapBy('children', 'age'),
@@ -14941,9 +15224,17 @@ var get = Ember.get,
14941
15224
 
14942
15225
  var lordByron = App.Person.create({children: []});
14943
15226
  lordByron.get('maxChildAge'); // -Infinity
14944
- lordByron.get('children').pushObject({name: 'Augusta Ada Byron', age: 7});
15227
+ lordByron.get('children').pushObject({
15228
+ name: 'Augusta Ada Byron', age: 7
15229
+ });
14945
15230
  lordByron.get('maxChildAge'); // 7
14946
- lordByron.get('children').pushObjects([{name: 'Allegra Byron', age: 5}, {name: 'Elizabeth Medora Leigh', age: 8}]);
15231
+ lordByron.get('children').pushObjects([{
15232
+ name: 'Allegra Byron',
15233
+ age: 5
15234
+ }, {
15235
+ name: 'Elizabeth Medora Leigh',
15236
+ age: 8
15237
+ }]);
14947
15238
  lordByron.get('maxChildAge'); // 8
14948
15239
  ```
14949
15240
 
@@ -14953,7 +15244,7 @@ var get = Ember.get,
14953
15244
  @return {Ember.ComputedProperty} computes the largest value in the dependentKey's array
14954
15245
  */
14955
15246
  Ember.computed.max = function (dependentKey) {
14956
- return Ember.reduceComputed.call(null, dependentKey, {
15247
+ return Ember.reduceComputed(dependentKey, {
14957
15248
  initialValue: -Infinity,
14958
15249
 
14959
15250
  addedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
@@ -14973,8 +15264,6 @@ Ember.computed.max = function (dependentKey) {
14973
15264
  dependent array. This will return `Infinity` when the dependent
14974
15265
  array is empty.
14975
15266
 
14976
- Example
14977
-
14978
15267
  ```javascript
14979
15268
  App.Person = Ember.Object.extend({
14980
15269
  childAges: Ember.computed.mapBy('children', 'age'),
@@ -14983,9 +15272,17 @@ Ember.computed.max = function (dependentKey) {
14983
15272
 
14984
15273
  var lordByron = App.Person.create({children: []});
14985
15274
  lordByron.get('minChildAge'); // Infinity
14986
- lordByron.get('children').pushObject({name: 'Augusta Ada Byron', age: 7});
15275
+ lordByron.get('children').pushObject({
15276
+ name: 'Augusta Ada Byron', age: 7
15277
+ });
14987
15278
  lordByron.get('minChildAge'); // 7
14988
- lordByron.get('children').pushObjects([{name: 'Allegra Byron', age: 5}, {name: 'Elizabeth Medora Leigh', age: 8}]);
15279
+ lordByron.get('children').pushObjects([{
15280
+ name: 'Allegra Byron',
15281
+ age: 5
15282
+ }, {
15283
+ name: 'Elizabeth Medora Leigh',
15284
+ age: 8
15285
+ }]);
14989
15286
  lordByron.get('minChildAge'); // 5
14990
15287
  ```
14991
15288
 
@@ -14995,7 +15292,7 @@ Ember.computed.max = function (dependentKey) {
14995
15292
  @return {Ember.ComputedProperty} computes the smallest value in the dependentKey's array
14996
15293
  */
14997
15294
  Ember.computed.min = function (dependentKey) {
14998
- return Ember.reduceComputed.call(null, dependentKey, {
15295
+ return Ember.reduceComputed(dependentKey, {
14999
15296
  initialValue: Infinity,
15000
15297
 
15001
15298
  addedItem: function (accumulatedValue, item, changeMeta, instanceMeta) {
@@ -15013,14 +15310,13 @@ Ember.computed.min = function (dependentKey) {
15013
15310
  /**
15014
15311
  Returns an array mapped via the callback
15015
15312
 
15016
- The callback method you provide should have the following signature:
15313
+ The callback method you provide should have the following signature.
15314
+ `item` is the current item in the iteration.
15017
15315
 
15018
15316
  ```javascript
15019
15317
  function(item);
15020
15318
  ```
15021
15319
 
15022
- - `item` is the current item in the iteration.
15023
-
15024
15320
  Example
15025
15321
 
15026
15322
  ```javascript
@@ -15030,8 +15326,10 @@ Ember.computed.min = function (dependentKey) {
15030
15326
  })
15031
15327
  });
15032
15328
 
15033
- var hamster = App.Hamster.create({chores: ['cook', 'clean', 'write more unit tests']});
15034
- hamster.get('excitingChores'); // ['COOK!', 'CLEAN!', 'WRITE MORE UNIT TESTS!']
15329
+ var hamster = App.Hamster.create({
15330
+ chores: ['clean', 'write more unit tests']
15331
+ });
15332
+ hamster.get('excitingChores'); // ['CLEAN!', 'WRITE MORE UNIT TESTS!']
15035
15333
  ```
15036
15334
 
15037
15335
  @method computed.map
@@ -15059,8 +15357,6 @@ Ember.computed.map = function(dependentKey, callback) {
15059
15357
  /**
15060
15358
  Returns an array mapped to the specified key.
15061
15359
 
15062
- Example
15063
-
15064
15360
  ```javascript
15065
15361
  App.Person = Ember.Object.extend({
15066
15362
  childAges: Ember.computed.mapBy('children', 'age')
@@ -15070,7 +15366,13 @@ Ember.computed.map = function(dependentKey, callback) {
15070
15366
  lordByron.get('childAges'); // []
15071
15367
  lordByron.get('children').pushObject({name: 'Augusta Ada Byron', age: 7});
15072
15368
  lordByron.get('childAges'); // [7]
15073
- lordByron.get('children').pushObjects([{name: 'Allegra Byron', age: 5}, {name: 'Elizabeth Medora Leigh', age: 8}]);
15369
+ lordByron.get('children').pushObjects([{
15370
+ name: 'Allegra Byron',
15371
+ age: 5
15372
+ }, {
15373
+ name: 'Elizabeth Medora Leigh',
15374
+ age: 8
15375
+ }]);
15074
15376
  lordByron.get('childAges'); // [7, 5, 8]
15075
15377
  ```
15076
15378
 
@@ -15097,16 +15399,13 @@ Ember.computed.mapProperty = Ember.computed.mapBy;
15097
15399
  /**
15098
15400
  Filters the array by the callback.
15099
15401
 
15100
- The callback method you provide should have the following signature:
15402
+ The callback method you provide should have the following signature.
15403
+ `item` is the current item in the iteration.
15101
15404
 
15102
15405
  ```javascript
15103
15406
  function(item);
15104
15407
  ```
15105
15408
 
15106
- - `item` is the current item in the iteration.
15107
-
15108
- Example
15109
-
15110
15409
  ```javascript
15111
15410
  App.Hamster = Ember.Object.extend({
15112
15411
  remainingChores: Ember.computed.filter('chores', function(chore) {
@@ -15162,8 +15461,6 @@ Ember.computed.filter = function(dependentKey, callback) {
15162
15461
  /**
15163
15462
  Filters the array by the property and value
15164
15463
 
15165
- Example
15166
-
15167
15464
  ```javascript
15168
15465
  App.Hamster = Ember.Object.extend({
15169
15466
  remainingChores: Ember.computed.filterBy('chores', 'done', false)
@@ -15386,7 +15683,7 @@ Ember.computed.setDiff = function (setAProperty, setBProperty) {
15386
15683
  if (arguments.length !== 2) {
15387
15684
  throw new Ember.Error("setDiff requires exactly two dependent arrays.");
15388
15685
  }
15389
- return Ember.arrayComputed.call(null, setAProperty, setBProperty, {
15686
+ return Ember.arrayComputed(setAProperty, setBProperty, {
15390
15687
  addedItem: function (array, item, changeMeta, instanceMeta) {
15391
15688
  var setA = get(this, setAProperty),
15392
15689
  setB = get(this, setBProperty);
@@ -15588,7 +15885,7 @@ Ember.computed.sort = function (itemsKey, sortDefinition) {
15588
15885
  };
15589
15886
  }
15590
15887
 
15591
- return Ember.arrayComputed.call(null, itemsKey, {
15888
+ return Ember.arrayComputed(itemsKey, {
15592
15889
  initialize: initFn,
15593
15890
 
15594
15891
  addedItem: function (array, item, changeMeta, instanceMeta) {
@@ -15651,6 +15948,9 @@ Ember.RSVP.on('error', Ember.RSVP.onerrorDefault);
15651
15948
 
15652
15949
  var a_slice = Array.prototype.slice;
15653
15950
 
15951
+ if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
15952
+ var expandProperties = Ember.expandProperties;
15953
+ }
15654
15954
 
15655
15955
  if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
15656
15956
 
@@ -15747,9 +16047,18 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
15747
16047
  @for Function
15748
16048
  */
15749
16049
  Function.prototype.observes = function() {
15750
-
16050
+ if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
16051
+ var addWatchedProperty = function (obs) { watched.push(obs); };
16052
+ var watched = [];
16053
+
16054
+ for (var i=0; i<arguments.length; ++i) {
16055
+ expandProperties(arguments[i], addWatchedProperty);
16056
+ }
16057
+
16058
+ this.__ember_observes__ = watched;
16059
+ } else {
15751
16060
  this.__ember_observes__ = a_slice.call(arguments);
15752
-
16061
+ }
15753
16062
 
15754
16063
  return this;
15755
16064
  };
@@ -15812,9 +16121,18 @@ if (Ember.EXTEND_PROTOTYPES === true || Ember.EXTEND_PROTOTYPES.Function) {
15812
16121
  @for Function
15813
16122
  */
15814
16123
  Function.prototype.observesBefore = function() {
15815
-
16124
+ if (Ember.FEATURES.isEnabled('propertyBraceExpansion')) {
16125
+ var addWatchedProperty = function (obs) { watched.push(obs); };
16126
+ var watched = [];
16127
+
16128
+ for (var i=0; i<arguments.length; ++i) {
16129
+ expandProperties(arguments[i], addWatchedProperty);
16130
+ }
16131
+
16132
+ this.__ember_observesBefore__ = watched;
16133
+ } else {
15816
16134
  this.__ember_observesBefore__ = a_slice.call(arguments);
15817
-
16135
+ }
15818
16136
 
15819
16137
  return this;
15820
16138
  };
@@ -16785,6 +17103,11 @@ RSVP.configure('async', function(callback, promise) {
16785
17103
  Ember.run.schedule('actions', promise, callback, promise);
16786
17104
  });
16787
17105
 
17106
+ RSVP.Promise.prototype.fail = function(callback, label){
17107
+ Ember.deprecate('RSVP.Promise.fail has been renamed as RSVP.Promise.catch');
17108
+ return this['catch'](callback, label);
17109
+ };
17110
+
16788
17111
  /**
16789
17112
  @module ember
16790
17113
  @submodule ember-runtime
@@ -16894,6 +17217,8 @@ Ember.ActionHandler = Ember.Mixin.create({
16894
17217
  var hashName;
16895
17218
 
16896
17219
  if (!props._actions) {
17220
+ Ember.assert(this + " 'actions' should not be a function", typeof(props.actions) !== 'function');
17221
+
16897
17222
  if (typeOf(props.actions) === 'object') {
16898
17223
  hashName = 'actions';
16899
17224
  } else if (typeOf(props.events) === 'object') {
@@ -16940,8 +17265,6 @@ Ember.ActionHandler = Ember.Mixin.create({
16940
17265
 
16941
17266
  (function() {
16942
17267
  var set = Ember.set, get = Ember.get,
16943
- resolve = Ember.RSVP.resolve,
16944
- rethrow = Ember.RSVP.rethrow,
16945
17268
  not = Ember.computed.not,
16946
17269
  or = Ember.computed.or;
16947
17270
 
@@ -16950,14 +17273,15 @@ var set = Ember.set, get = Ember.get,
16950
17273
  @submodule ember-runtime
16951
17274
  */
16952
17275
 
16953
- function observePromise(proxy, promise) {
16954
- promise.then(function(value) {
17276
+ function tap(proxy, promise) {
17277
+ return promise.then(function(value) {
16955
17278
  set(proxy, 'isFulfilled', true);
16956
17279
  set(proxy, 'content', value);
17280
+ return value;
16957
17281
  }, function(reason) {
16958
17282
  set(proxy, 'isRejected', true);
16959
17283
  set(proxy, 'reason', reason);
16960
- // don't re-throw, as we are merely observing
17284
+ throw reason;
16961
17285
  });
16962
17286
  }
16963
17287
 
@@ -17035,9 +17359,7 @@ Ember.PromiseProxyMixin = Ember.Mixin.create({
17035
17359
 
17036
17360
  promise: Ember.computed(function(key, promise) {
17037
17361
  if (arguments.length === 2) {
17038
- promise = resolve(promise);
17039
- observePromise(this, promise);
17040
- return promise.then(); // fork the promise.
17362
+ return tap(this, promise);
17041
17363
  } else {
17042
17364
  throw new Ember.Error("PromiseProxy's promise must be set");
17043
17365
  }