From 91c23e91b1fdbdb7b37233766f185f509d7fa98d Mon Sep 17 00:00:00 2001
From: Rhys Arkins <rhys@arkins.net>
Date: Tue, 14 Jan 2020 17:37:19 +0100
Subject: [PATCH] fix(bundler): handle major range update

---
 lib/versioning/ruby/strategies/replace.ts | 12 ++++++++++++
 test/versioning/ruby.spec.ts              |  5 +++++
 2 files changed, 17 insertions(+)

diff --git a/lib/versioning/ruby/strategies/replace.ts b/lib/versioning/ruby/strategies/replace.ts
index b223412b57..8db76c9671 100644
--- a/lib/versioning/ruby/strategies/replace.ts
+++ b/lib/versioning/ruby/strategies/replace.ts
@@ -6,6 +6,15 @@ function countInstancesOf(str: string, char: string): number {
   return str.split(char).length - 1;
 }
 
+function isMajorRange(range: string): boolean {
+  const splitRange = range.split(',').map(part => part.trim());
+  return (
+    splitRange.length === 1 &&
+    splitRange[0].startsWith('~>') &&
+    countInstancesOf(splitRange[0], '.') === 0
+  );
+}
+
 function isCommonRubyMajorRange(range: string): boolean {
   const splitRange = range.split(',').map(part => part.trim());
   return (
@@ -45,6 +54,9 @@ export default ({ to, range }: { range: string; to: string }): string => {
   } else if (isCommonRubyMinorRange(range)) {
     const firstPart = reduceOnePrecision(to) + '.0';
     newRange = `~> ${firstPart}, >= ${to}`;
+  } else if (isMajorRange(range)) {
+    const majorPart = to.split('.')[0];
+    newRange = '~>' + (range.includes(' ') ? ' ' : '') + majorPart;
   } else {
     const lastPart = range
       .split(',')
diff --git a/test/versioning/ruby.spec.ts b/test/versioning/ruby.spec.ts
index d725c6af18..1fd0771805 100644
--- a/test/versioning/ruby.spec.ts
+++ b/test/versioning/ruby.spec.ts
@@ -426,6 +426,11 @@ describe('semverRuby', () => {
         semverRuby.getNewValue('4.2.5.1', 'replace', '4.2.5.1', '4.3.0')
       ).toEqual('4.3.0');
     });
+    it('handles major ranges', () => {
+      expect(
+        semverRuby.getNewValue('~> 1', 'replace', '1.2.0', '2.0.3')
+      ).toEqual('~> 2');
+    });
 
     it('returns correct version for replace strategy', () => {
       [
-- 
GitLab