]> git.ipfire.org Git - thirdparty/moment.git/commitdiff
object set ordering
authorMaggie Pint <maggiepint@gmail.com>
Sun, 24 Apr 2016 19:48:08 +0000 (14:48 -0500)
committerIskren Chernev <iskren.chernev@gmail.com>
Tue, 14 Jun 2016 08:26:13 +0000 (01:26 -0700)
17 files changed:
src/lib/moment/get-set.js
src/lib/moment/prototype.js
src/lib/units/aliases.js
src/lib/units/day-of-month.js
src/lib/units/day-of-week.js
src/lib/units/day-of-year.js
src/lib/units/hour.js
src/lib/units/millisecond.js
src/lib/units/minute.js
src/lib/units/month.js
src/lib/units/priorities.js [new file with mode: 0644]
src/lib/units/quarter.js
src/lib/units/second.js
src/lib/units/week-year.js
src/lib/units/week.js
src/lib/units/year.js
src/test/moment/getters_setters.js

index ef43f391a1c31b05f058158affb4f77f2b7b9acc..0d9fe5dfef06c63124251989a4acd721ddb05071 100644 (file)
@@ -1,7 +1,9 @@
-import { normalizeUnits } from '../units/aliases';
+import { normalizeUnits, normalizeObjectUnits } from '../units/aliases';
+import { getPrioritizedUnits } from '../units/priorities';
 import { hooks } from '../utils/hooks';
 import isFunction from '../utils/is-function';
 
+
 export function makeGetSet (unit, keepTime) {
     return function (value) {
         if (value != null) {
@@ -27,11 +29,21 @@ export function set (mom, unit, value) {
 
 // MOMENTS
 
-export function getSet (units, value) {
-    var unit;
+export function stringGet (units) {
+    units = normalizeUnits(units);
+    if (isFunction(this[units])) {
+        return this[units]();
+    }
+    return this;
+}
+
+
+export function stringSet (units, value) {
     if (typeof units === 'object') {
-        for (unit in units) {
-            this.set(unit, units[unit]);
+        units = normalizeObjectUnits(units);
+        var prioritized = getPrioritizedUnits(units);
+        for (var i = 0; i < prioritized.length; i++) {
+            this[prioritized[i].unit](units[prioritized[i].unit]);
         }
     } else {
         units = normalizeUnits(units);
index 39775880bfee7b7b9076233ce3e9c72eb17b105e..7ff40bb82129d0213349b1cc0bcc3b6767319276 100644 (file)
@@ -10,7 +10,7 @@ import { diff } from './diff';
 import { format, toString, toISOString } from './format';
 import { from, fromNow } from './from';
 import { to, toNow } from './to';
-import { getSet } from './get-set';
+import { stringGet, stringSet } from './get-set';
 import { locale, localeData, lang } from './locale';
 import { prototypeMin, prototypeMax } from './min-max';
 import { startOf, endOf } from './start-end-of';
@@ -28,7 +28,7 @@ proto.from              = from;
 proto.fromNow           = fromNow;
 proto.to                = to;
 proto.toNow             = toNow;
-proto.get               = getSet;
+proto.get               = stringGet;
 proto.invalidAt         = invalidAt;
 proto.isAfter           = isAfter;
 proto.isBefore          = isBefore;
@@ -43,7 +43,7 @@ proto.localeData        = localeData;
 proto.max               = prototypeMax;
 proto.min               = prototypeMin;
 proto.parsingFlags      = parsingFlags;
-proto.set               = getSet;
+proto.set               = stringSet;
 proto.startOf           = startOf;
 proto.subtract          = subtract;
 proto.toArray           = toArray;
index 4ad5133842770ef265a0a279cfba29d57824a943..0d8b88a138b8c01d925d926ab8f6df5e0cc0b76e 100644 (file)
@@ -27,3 +27,4 @@ export function normalizeObjectUnits(inputObject) {
 
     return normalizedInput;
 }
+
index dc32acc24d6d054cc6ff8a5c26bec6b49c4c0be7..e28ec9f4dd48dc2861de21e57736df0238a40193 100644 (file)
@@ -1,6 +1,7 @@
 import { makeGetSet } from '../moment/get-set';
 import { addFormatToken } from '../format/format';
 import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
 import { addRegexToken, match1to2, match2 } from '../parse/regex';
 import { addParseToken } from '../parse/token';
 import { DATE } from './constants';
@@ -14,6 +15,9 @@ addFormatToken('D', ['DD', 2], 'Do', 'date');
 
 addUnitAlias('date', 'D');
 
+// PRIOROITY
+addUnitPriority('date', 9);
+
 // PARSING
 
 addRegexToken('D',  match1to2);
index 18e2a42ba10b074561790729874066136a5de42c..e8e957866c32d371ec1b53afd2e534d8599ad568 100644 (file)
@@ -1,5 +1,6 @@
 import { addFormatToken } from '../format/format';
 import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
 import { addRegexToken, match1to2, matchWord, regexEscape } from '../parse/regex';
 import { addWeekParseToken } from '../parse/token';
 import toInt from '../utils/to-int';
@@ -34,6 +35,11 @@ addUnitAlias('day', 'd');
 addUnitAlias('weekday', 'e');
 addUnitAlias('isoWeekday', 'E');
 
+// PRIORITY
+addUnitPriority('day', 11);
+addUnitPriority('weekday', 11);
+addUnitPriority('isoWeekday', 11);
+
 // PARSING
 
 addRegexToken('d',    match1to2);
index 62d4de8b44ae0f9356e3f7a9888fe986aad382c1..6fe931c1e46fbe36794d9b30d0f55c3ebac521bd 100644 (file)
@@ -1,5 +1,6 @@
 import { addFormatToken } from '../format/format';
 import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
 import { addRegexToken, match3, match1to3 } from '../parse/regex';
 import { daysInYear } from './year';
 import { createUTCDate } from '../create/date-from-array';
@@ -14,6 +15,9 @@ addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');
 
 addUnitAlias('dayOfYear', 'DDD');
 
+// PRIORITY
+addUnitPriority('dayOfYear', 4);
+
 // PARSING
 
 addRegexToken('DDD',  match1to3);
index 86f18abe40f8472218fd66b2c28b0d06a5ac9021..d5733fbbcfa38d6fd48ddd8a2c455cf34baea9bb 100644 (file)
@@ -1,6 +1,7 @@
 import { makeGetSet } from '../moment/get-set';
 import { addFormatToken } from '../format/format';
 import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
 import { addRegexToken, match1to2, match2, match3to4, match5to6 } from '../parse/regex';
 import { addParseToken } from '../parse/token';
 import { HOUR, MINUTE, SECOND } from './constants';
@@ -53,6 +54,9 @@ meridiem('A', false);
 
 addUnitAlias('hour', 'h');
 
+// PRIORITY
+addUnitPriority('hour', 13);
+
 // PARSING
 
 function matchMeridiem (isStrict, locale) {
index 134d88ee92b269f37c8b04cc5695bf7f0f587f50..27c951269360e0498145fbf04d6c6de4e7950144 100644 (file)
@@ -1,6 +1,7 @@
 import { makeGetSet } from '../moment/get-set';
 import { addFormatToken } from '../format/format';
 import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
 import { addRegexToken, match1, match2, match3, match1to3, matchUnsigned } from '../parse/regex';
 import { addParseToken } from '../parse/token';
 import { MILLISECOND } from './constants';
@@ -41,6 +42,10 @@ addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {
 
 addUnitAlias('millisecond', 'ms');
 
+// PRIORITY
+
+addUnitPriority('millisecond', 16);
+
 // PARSING
 
 addRegexToken('S',    match1to3, match1);
index e9473b86336d711014d22047c05ab3598c5c6b93..9f760322e1340536235dc71fd9d71cd968effde2 100644 (file)
@@ -1,6 +1,7 @@
 import { makeGetSet } from '../moment/get-set';
 import { addFormatToken } from '../format/format';
 import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
 import { addRegexToken, match1to2, match2 } from '../parse/regex';
 import { addParseToken } from '../parse/token';
 import { MINUTE } from './constants';
@@ -13,6 +14,10 @@ addFormatToken('m', ['mm', 2], 0, 'minute');
 
 addUnitAlias('minute', 'm');
 
+// PRIORITY
+
+addUnitPriority('minute', 14);
+
 // PARSING
 
 addRegexToken('m',  match1to2);
index f1cef1550025d0a1388976c141289547bbf7d9cb..5de0077e8831d038bbc191625b0a8e397c5d5257 100644 (file)
@@ -2,6 +2,7 @@ import { get } from '../moment/get-set';
 import hasOwnProp from '../utils/has-own-prop';
 import { addFormatToken } from '../format/format';
 import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
 import { addRegexToken, match1to2, match2, matchWord, regexEscape } from '../parse/regex';
 import { addParseToken } from '../parse/token';
 import { hooks } from '../utils/hooks';
@@ -34,6 +35,10 @@ addFormatToken('MMMM', 0, 0, function (format) {
 
 addUnitAlias('month', 'M');
 
+// PRIORITY
+
+addUnitPriority('month', 8);
+
 // PARSING
 
 addRegexToken('M',    match1to2);
diff --git a/src/lib/units/priorities.js b/src/lib/units/priorities.js
new file mode 100644 (file)
index 0000000..699017c
--- /dev/null
@@ -0,0 +1,16 @@
+var priorities = {};
+
+export function addUnitPriority(unit, priority) {
+    priorities[unit] = priority;
+}
+
+export function getPrioritizedUnits(unitsObj) {
+    var units = [];
+    for (var u in unitsObj) {
+        units.push({unit: u, priority: priorities[u]});
+    }
+    units.sort(function (a, b) {
+        return a.priority - b.priority;
+    });
+    return units;
+}
index 78543a68312ce282b0c15a6cfad8df3f4e51a5ce..a6d409a862c8108e29d47effa0dc9b1070a94ff0 100644 (file)
@@ -1,5 +1,6 @@
 import { addFormatToken } from '../format/format';
 import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
 import { addRegexToken, match1 } from '../parse/regex';
 import { addParseToken } from '../parse/token';
 import { MONTH } from './constants';
@@ -13,6 +14,10 @@ addFormatToken('Q', 0, 'Qo', 'quarter');
 
 addUnitAlias('quarter', 'Q');
 
+// PRIORITY
+
+addUnitPriority('quarter', 7);
+
 // PARSING
 
 addRegexToken('Q', match1);
index 118fe3083c6c605eb2ddf2c49f411b4e732a22a7..179371186e98f1749443a37951d4fc58612ce99f 100644 (file)
@@ -1,6 +1,7 @@
 import { makeGetSet } from '../moment/get-set';
 import { addFormatToken } from '../format/format';
 import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
 import { addRegexToken, match1to2, match2 } from '../parse/regex';
 import { addParseToken } from '../parse/token';
 import { SECOND } from './constants';
@@ -13,6 +14,10 @@ addFormatToken('s', ['ss', 2], 0, 'second');
 
 addUnitAlias('second', 's');
 
+// PRIORITY
+
+addUnitPriority('second', 15);
+
 // PARSING
 
 addRegexToken('s',  match1to2);
index 29d1fec55a04e509c67134b4d7d239a0e648cbe5..7fa5425bccbf4d0a62e28801c2e9a4ef6da492b8 100644 (file)
@@ -1,5 +1,6 @@
 import { addFormatToken } from '../format/format';
 import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
 import { addRegexToken, match1to2, match1to4, match1to6, match2, match4, match6, matchSigned } from '../parse/regex';
 import { addWeekParseToken } from '../parse/token';
 import { weekOfYear, weeksInYear, dayOfYearFromWeeks } from './week-calendar-utils';
@@ -32,6 +33,12 @@ addWeekYearFormatToken('GGGGG', 'isoWeekYear');
 addUnitAlias('weekYear', 'gg');
 addUnitAlias('isoWeekYear', 'GG');
 
+// PRIORITY
+
+addUnitPriority('weekYear', 1);
+addUnitPriority('isoWeekYear', 1);
+
+
 // PARSING
 
 addRegexToken('G',      matchSigned);
index 7ea3201edcb49aa56f8c43376d67ec0b871a8d61..da64ffef328a68491c6211b2fbc350ed4d96100c 100644 (file)
@@ -1,5 +1,6 @@
 import { addFormatToken } from '../format/format';
 import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
 import { addRegexToken, match1to2, match2 } from '../parse/regex';
 import { addWeekParseToken } from '../parse/token';
 import toInt from '../utils/to-int';
@@ -16,6 +17,11 @@ addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');
 addUnitAlias('week', 'w');
 addUnitAlias('isoWeek', 'W');
 
+// PRIORITIES
+
+addUnitPriority('week', 5);
+addUnitPriority('isoWeek', 5);
+
 // PARSING
 
 addRegexToken('w',  match1to2);
index b86df29be83522e72381747cbb0732a1b29d2d80..a10e5b4beb3588238208508569b7c4f953aede7e 100644 (file)
@@ -1,6 +1,7 @@
 import { makeGetSet } from '../moment/get-set';
 import { addFormatToken } from '../format/format';
 import { addUnitAlias } from './aliases';
+import { addUnitPriority } from './priorities';
 import { addRegexToken, match1to2, match1to4, match1to6, match2, match4, match6, matchSigned } from '../parse/regex';
 import { addParseToken } from '../parse/token';
 import { hooks } from '../utils/hooks';
@@ -26,6 +27,10 @@ addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');
 
 addUnitAlias('year', 'y');
 
+// PRIORITIES
+
+addUnitPriority('year', 1);
+
 // PARSING
 
 addRegexToken('Y',      matchSigned);
index 8f23e68820173ed9b612b3bbefe6a40b6ccced70..50b23bb48fc2d8cd1c466286dbc146991e69df70 100644 (file)
@@ -32,6 +32,9 @@ test('getters programmatic', function (assert) {
     assert.equal(a.get('week'), a.week(), 'week');
     assert.equal(a.get('isoWeek'), a.isoWeek(), 'isoWeek');
     assert.equal(a.get('dayOfYear'), a.dayOfYear(), 'dayOfYear');
+
+    //getter no longer sets values when passed an object
+    assert.equal(moment([2016,0,1]).get({year:2015}).year(), 2016, 'getter no longer sets values when passed an object');
 });
 
 test('setters plural', function (assert) {
@@ -202,6 +205,10 @@ test('setter with multiple unit values', function (assert) {
     assert.equal(a.minutes(), 7, 'minute');
     assert.equal(a.seconds(), 8, 'second');
     assert.equal(a.milliseconds(), 9, 'milliseconds');
+
+    var c = moment([2016,0,1]);
+    assert.equal(c.set({weekYear: 2016}).weekYear(), 2016, 'week year correctly sets with object syntax');
+    assert.equal(c.set({quarter: 3}).quarter(), 3, 'quarter sets correctly with object syntax');
 });
 
 test('day setter', function (assert) {
@@ -233,6 +240,21 @@ test('day setter', function (assert) {
     assert.equal(moment(a).day(17).date(), 26, 'set from wednesday to second next wednesday');
 });
 
+test('object set ordering', function (assert) {
+    var a = moment([2016,3,30]);
+    assert.equal(a.set({date:31, month:4}).date(), 31, 'setter order automatically arranged by size');
+    var b = moment([2015,1,28]);
+    assert.equal(b.set({date:29, year: 2016}).format('YYYY-MM-DD'), '2016-02-29', 'year is prioritized over date');
+    //check a nonexistent time in US isn't set
+    var c = moment([2016,2,13]);
+    c.set({
+        hour:2,
+        minutes:30,
+        date: 14
+    });
+    assert.equal(c.format('YYYY-MM-DDTHH:mm'), '2016-03-14T02:30', 'setting hours, minutes date puts date first allowing time set to work');
+});
+
 test('string setters', function (assert) {
     var a = moment();
     a.year('2011');