yujinakayama/safedep

View on GitHub
lib/safedep/policy/sem_ver.rb

Summary

Maintainability
A
25 mins
Test Coverage
module Safedep
  module Policy
    class SemVer
      attr_reader :version, :major, :minor, :patch, :suffix

      def self.version_specifiers(version)
        new(version).version_specifiers
      end

      def initialize(version)
        @version = if version.is_a?(Gem::Version)
                     version
                   else
                     Gem::Version.new(version)
                   end

        decompose_version
      end

      def version_specifiers
        specifiers = ['~> ' + [major, minor].join('.')]
        return specifiers if satisfy_specifiers?(specifiers)

        specifiers = [">= #{version}", "< #{major.to_i + 1}"]
        return specifiers if satisfy_specifiers?(specifiers)

        nil
      end

      private

      def decompose_version
        elements =  version.to_s.split('.')

        %i[major minor patch].each do |role|
          if elements.first && elements.first.match(/^\d+$/)
            instance_variable_set("@#{role}", elements.shift)
          else
            instance_variable_set("@#{role}", '0')
          end
        end

        @suffix = elements.shift if elements.first && !elements.first.match(/^\d+$/)
      end

      def satisfy_specifiers?(specifiers)
        requirement = Gem::Requirement.new(*specifiers)
        requirement.satisfied_by?(version)
      end
    end
  end
end