From: Maggie Pint Date: Sun, 24 Apr 2016 19:48:08 +0000 (-0500) Subject: object set ordering X-Git-Tag: 2.14.0~39^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f7993dc3770cb3899ddbb93121f793a082125b1;p=thirdparty%2Fmoment.git object set ordering --- diff --git a/src/lib/moment/get-set.js b/src/lib/moment/get-set.js index ef43f391a..0d9fe5dfe 100644 --- a/src/lib/moment/get-set.js +++ b/src/lib/moment/get-set.js @@ -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); diff --git a/src/lib/moment/prototype.js b/src/lib/moment/prototype.js index 39775880b..7ff40bb82 100644 --- a/src/lib/moment/prototype.js +++ b/src/lib/moment/prototype.js @@ -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; diff --git a/src/lib/units/aliases.js b/src/lib/units/aliases.js index 4ad513384..0d8b88a13 100644 --- a/src/lib/units/aliases.js +++ b/src/lib/units/aliases.js @@ -27,3 +27,4 @@ export function normalizeObjectUnits(inputObject) { return normalizedInput; } + diff --git a/src/lib/units/day-of-month.js b/src/lib/units/day-of-month.js index dc32acc24..e28ec9f4d 100644 --- a/src/lib/units/day-of-month.js +++ b/src/lib/units/day-of-month.js @@ -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); diff --git a/src/lib/units/day-of-week.js b/src/lib/units/day-of-week.js index 18e2a42ba..e8e957866 100644 --- a/src/lib/units/day-of-week.js +++ b/src/lib/units/day-of-week.js @@ -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); diff --git a/src/lib/units/day-of-year.js b/src/lib/units/day-of-year.js index 62d4de8b4..6fe931c1e 100644 --- a/src/lib/units/day-of-year.js +++ b/src/lib/units/day-of-year.js @@ -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); diff --git a/src/lib/units/hour.js b/src/lib/units/hour.js index 86f18abe4..d5733fbbc 100644 --- a/src/lib/units/hour.js +++ b/src/lib/units/hour.js @@ -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) { diff --git a/src/lib/units/millisecond.js b/src/lib/units/millisecond.js index 134d88ee9..27c951269 100644 --- a/src/lib/units/millisecond.js +++ b/src/lib/units/millisecond.js @@ -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); diff --git a/src/lib/units/minute.js b/src/lib/units/minute.js index e9473b863..9f760322e 100644 --- a/src/lib/units/minute.js +++ b/src/lib/units/minute.js @@ -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); diff --git a/src/lib/units/month.js b/src/lib/units/month.js index f1cef1550..5de0077e8 100644 --- a/src/lib/units/month.js +++ b/src/lib/units/month.js @@ -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 index 000000000..699017cb8 --- /dev/null +++ b/src/lib/units/priorities.js @@ -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; +} diff --git a/src/lib/units/quarter.js b/src/lib/units/quarter.js index 78543a683..a6d409a86 100644 --- a/src/lib/units/quarter.js +++ b/src/lib/units/quarter.js @@ -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); diff --git a/src/lib/units/second.js b/src/lib/units/second.js index 118fe3083..179371186 100644 --- a/src/lib/units/second.js +++ b/src/lib/units/second.js @@ -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); diff --git a/src/lib/units/week-year.js b/src/lib/units/week-year.js index 29d1fec55..7fa5425bc 100644 --- a/src/lib/units/week-year.js +++ b/src/lib/units/week-year.js @@ -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); diff --git a/src/lib/units/week.js b/src/lib/units/week.js index 7ea3201ed..da64ffef3 100644 --- a/src/lib/units/week.js +++ b/src/lib/units/week.js @@ -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); diff --git a/src/lib/units/year.js b/src/lib/units/year.js index b86df29be..a10e5b4be 100644 --- a/src/lib/units/year.js +++ b/src/lib/units/year.js @@ -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); diff --git a/src/test/moment/getters_setters.js b/src/test/moment/getters_setters.js index 8f23e6882..50b23bb48 100644 --- a/src/test/moment/getters_setters.js +++ b/src/test/moment/getters_setters.js @@ -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');