Skip to content

Commit

Permalink
Move methods to comparator and range
Browse files Browse the repository at this point in the history
  • Loading branch information
rtfpessoa committed Apr 1, 2017
1 parent a29e8db commit a6eb60a
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 54 deletions.
96 changes: 46 additions & 50 deletions semver.js
Original file line number Diff line number Diff line change
Expand Up @@ -704,6 +704,42 @@ Comparator.prototype.test = function(version) {
return cmp(version, this.operator, this.semver, this.loose);
};

Comparator.prototype.intersects = function(compOrStr, loose, platform) {
var rangeTmp;
var comp = new Comparator(compOrStr, loose);

if (this.operator === '') {
rangeTmp = new Range(comp.value, loose, platform);
return satisfies(this.value, rangeTmp, loose, platform);
} else if (comp.operator === '') {
rangeTmp = new Range(this.value, loose, platform);
return satisfies(comp.semver, rangeTmp, loose, platform);
}
// Same direction increasing
return ((this.operator === '>=' || this.operator === '>') && (comp.operator === '>=' || comp.operator === '>')) ||
// Same direction decreasing
((this.operator === '<=' || this.operator === '<') && (comp.operator === '<=' || comp.operator === '<')) ||
// Different directions, same semver and inclusive operator
(this.semver.raw === comp.semver.raw &&
(this.operator === '>=' || this.operator === '<=') && (comp.operator === '>=' || comp.operator === '<=')) ||
// Opposite matching directions
(cmp(this.semver, '<', comp.semver, loose) &&
((this.operator === '>=' || this.operator === '>') && (comp.operator === '<=' || comp.operator === '<'))) ||
(cmp(this.semver, '>', comp.semver, loose) &&
((this.operator === '<=' || this.operator === '<') && (comp.operator === '>=' || comp.operator === '>')));
};

Comparator.prototype.satisfiesRange = function(rangeOrStr, loose, platform) {
var comp = this;
var range = new Range(rangeOrStr, loose, platform);

return range.set.some(function(comparators) {
return comparators.every(function(comparator) {
return comp.intersects(comparator, loose, platform);
});
});
};


exports.Range = Range;
function Range(range, loose) {
Expand Down Expand Up @@ -783,6 +819,16 @@ Range.prototype.parseRange = function(range) {
return set;
};

Range.prototype.intersects = function(rangeOrStr, loose, platform) {
var range = new Range(rangeOrStr, loose, platform);

return this.set.some(function(comparators) {
return comparators.every(function(comparator) {
return comparator.satisfiesRange(range, loose, platform);
});
});
};

// Mostly just for testing and legacy API reasons
exports.toComparators = toComparators;
function toComparators(range, loose) {
Expand All @@ -793,56 +839,6 @@ function toComparators(range, loose) {
});
}

exports.comparatorsIntersect = comparatorsIntersect;
function comparatorsIntersect(compA, compB, loose, platform) {
compA = new Comparator(compA, loose);
compB = new Comparator(compB, loose);

if (compA.operator === '') {
var rangeB = new Range(compB.value, loose, platform);
return satisfies(compA.value, rangeB, loose, platform);
} else if (compB.operator === '') {
var rangeA = new Range(compA.value, loose, platform);
return satisfies(compB.semver, rangeA, loose, platform);
}
// Same direction increasing
return ((compA.operator === '>=' || compA.operator === '>') && (compB.operator === '>=' || compB.operator === '>')) ||
// Same direction decreasing
((compA.operator === '<=' || compA.operator === '<') && (compB.operator === '<=' || compB.operator === '<')) ||
// Different directions, same semver and inclusive operator
(compA.semver.raw === compB.semver.raw &&
(compA.operator === '>=' || compA.operator === '<=') && (compB.operator === '>=' || compB.operator === '<=')) ||
// Opposite matching directions
(cmp(compA.semver, '<', compB.semver, loose) &&
((compA.operator === '>=' || compA.operator === '>') && (compB.operator === '<=' || compB.operator === '<'))) ||
(cmp(compA.semver, '>', compB.semver, loose) &&
((compA.operator === '<=' || compA.operator === '<') && (compB.operator === '>=' || compB.operator === '>')));
}

exports.comparatorSatisfiesRange = comparatorSatisfiesRange;
function comparatorSatisfiesRange(comp, range, loose, platform) {
comp = new Comparator(comp, loose);
range = new Range(range, loose, platform);

return range.set.some(function(comparators) {
return comparators.every(function(comparator) {
return comparatorsIntersect(comparator, comp, loose, platform);
});
});
}

exports.rangesIntersect = rangesIntersect;
function rangesIntersect(rangeA, rangeB, loose, platform) {
rangeA = new Range(rangeA, loose, platform);
rangeB = new Range(rangeB, loose, platform);

return rangeA.set.some(function(comparators) {
return comparators.every(function(comparator) {
return comparatorSatisfiesRange(comparator, rangeB, loose, platform);
});
});
}

// comprised of xranges, tildes, stars, and gtlt's at this point.
// already replaced the hyphen ranges
// turn into a set of JUST comparators.
Expand Down
13 changes: 9 additions & 4 deletions test/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ var replaceStars = semver.replaceStars;
var toComparators = semver.toComparators;
var SemVer = semver.SemVer;
var Range = semver.Range;
var Comparator = semver.Comparator;

test('\ncomparison tests', function(t) {
// [version1, version2]
Expand Down Expand Up @@ -747,7 +748,8 @@ test('\nintersect comparators', function(t) {
var comparator1 = v[0];
var comparator2 = v[1];
var expect = v[2];
var actual = semver.comparatorsIntersect(comparator1, comparator2);

var actual = new Comparator(comparator1).intersects(comparator2);
t.equal(actual, expect);
});
t.end();
Expand All @@ -763,7 +765,7 @@ test('\ncomparator satisfies range', function(t) {
var comparator = v[0];
var range = v[1];
var expect = v[2];
var actual = semver.comparatorSatisfiesRange(comparator, range);
var actual = new Comparator(comparator).satisfiesRange(range);
t.equal(actual, expect);
});
t.end();
Expand All @@ -775,14 +777,17 @@ test('\nranges intersect', function(t) {
['<1.0.0 >2.0.0', '>0.0.0', true],
['<1.0.0 >2.0.0', '>1.4.0 <1.6.0', false],
['<1.0.0 >2.0.0', '>1.4.0 <1.6.0 || 2.0.0', false],
['>1.0.0 <=2.0.0', '2.0.0', true],
['<1.0.0 >=2.0.0', '2.1.0', false],
['<1.0.0 >=2.0.0', '>1.4.0 <1.6.0 || 2.0.0', false]
].forEach(function(v) {
var range1 = v[0];
var range2 = v[1];
var expect = v[2];
var actual = semver.rangesIntersect(range1, range2);
t.equal(actual, expect);
var actual1 = new Range(range1).intersects(range2);
var actual2 = new Range(range2).intersects(range1);
t.equal(actual1, expect);
t.equal(actual2, expect);
});
t.end();
});

0 comments on commit a6eb60a

Please sign in to comment.