From bef7f13de22f5dd3407b5b902b8b5455cded0a55 Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Tue, 5 Jun 2018 14:52:40 +0200
Subject: [PATCH] feat: versioning.isSingleVersion()

---
 lib/versioning/pep440/index.js |  7 ++++++-
 lib/versioning/semver/index.js |  5 +++++
 test/versioning/pep440.spec.js | 15 +++++++++++++++
 test/versioning/semver.spec.js | 13 +++++++++++++
 4 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/lib/versioning/pep440/index.js b/lib/versioning/pep440/index.js
index a273053d3b..aaf904a38f 100644
--- a/lib/versioning/pep440/index.js
+++ b/lib/versioning/pep440/index.js
@@ -37,15 +37,20 @@ const minSatisfyingVersion = (versions, range) => {
   return found.length === 0 ? null : found[0];
 };
 
+const isSingleVersion = constraint =>
+  isVersion(constraint) ||
+  (constraint.startsWith('==') && isVersion(constraint.substring(2).trim()));
+
 module.exports = {
   equals,
   getMajor,
   getMinor,
   isGreaterThan,
-  isVersion,
+  isSingleVersion,
   isRange,
   isStable,
   isValid,
+  isVersion,
   matches,
   maxSatisfyingVersion,
   minSatisfyingVersion,
diff --git a/lib/versioning/semver/index.js b/lib/versioning/semver/index.js
index 2e9064b43c..716624d65d 100644
--- a/lib/versioning/semver/index.js
+++ b/lib/versioning/semver/index.js
@@ -29,6 +29,10 @@ const isRange = input => isValid(input) && !isVersion(input);
 // If this is left as an alias, inputs like "17.04.0" throw errors
 const isValid = input => validRange(input);
 
+const isSingleVersion = constraint =>
+  isVersion(constraint) ||
+  (constraint.startsWith('=') && isVersion(constraint.substring(1).trim()));
+
 module.exports = {
   equals,
   getMajor,
@@ -36,6 +40,7 @@ module.exports = {
   isGreaterThan,
   isLessThanRange,
   isRange,
+  isSingleVersion,
   isStable,
   isValid,
   isVersion,
diff --git a/test/versioning/pep440.spec.js b/test/versioning/pep440.spec.js
index 0f4cd2c4cc..8e945b5901 100644
--- a/test/versioning/pep440.spec.js
+++ b/test/versioning/pep440.spec.js
@@ -45,6 +45,21 @@ describe('pep440.isStable(version)', () => {
   });
 });
 
+describe('pep440.isSingleVersion()', () => {
+  it('returns true if naked version', () => {
+    expect(!!pep440.isSingleVersion('1.2.3')).toBe(true);
+    expect(!!pep440.isSingleVersion('1.2.3rc0')).toBe(true);
+  });
+  it('returns true if double equals', () => {
+    expect(!!pep440.isSingleVersion('==1.2.3')).toBe(true);
+    expect(!!pep440.isSingleVersion('==1.2')).toBe(true);
+    expect(!!pep440.isSingleVersion('== 1.2.3')).toBe(true);
+  });
+  it('returns false when not version', () => {
+    expect(!!pep440.isSingleVersion('==1.*')).toBe(false);
+  });
+});
+
 const versions = [
   '0.9.4',
   '1.0.0',
diff --git a/test/versioning/semver.spec.js b/test/versioning/semver.spec.js
index fa2b4df48e..e2a8a0f1e0 100644
--- a/test/versioning/semver.spec.js
+++ b/test/versioning/semver.spec.js
@@ -37,6 +37,19 @@ describe('semver.isRange(input)', () => {
     expect(!!semver.isRange('^1.2.3')).toBe(true);
   });
 });
+describe('semver.isSingleVersion()', () => {
+  it('returns true if naked version', () => {
+    expect(!!semver.isSingleVersion('1.2.3')).toBe(true);
+    expect(!!semver.isSingleVersion('1.2.3-alpha.1')).toBe(true);
+  });
+  it('returns true if equals', () => {
+    expect(!!semver.isSingleVersion('=1.2.3')).toBe(true);
+    expect(!!semver.isSingleVersion('= 1.2.3')).toBe(true);
+  });
+  it('returns false when not version', () => {
+    expect(!!semver.isSingleVersion('1.x')).toBe(false);
+  });
+});
 describe('semver.getNewValue()', () => {
   it('bumps equals', () => {
     expect(
-- 
GitLab