Sha256: 88fb58c1cda64e9e858031a2ec9fc749efd57e53b1c4665d89e75190871c65aa

Contents?: true

Size: 1.45 KB

Versions: 5

Compression:

Stored size: 1.45 KB

Contents

# frozen_string_literal: true

require "versionaire"

module Gemsmith
  module Gem
    # Defines a gem requirement. This is a partial, cleaner implementation of the RubyGems
    # `Gem::Requirement` object.
    # :reek:MissingSafeMethod
    class Requirement
      def self.operators
        [">", ">=", "=", "!=", "<", "<=", "~>"]
      end

      def self.version_segments version
        String(version).split(Versionaire::Version::DELIMITER).map(&:to_i)
      end

      def self.for object
        case object
          when String
            operator, version = object.split " "
            new operator: operator, raw_version: version
          else
            fail Errors::RequirementConversion,
                 %(Invalid string conversion. Use: "<operator> <version>".)
        end
      end

      attr_reader :operator, :raw_version, :version_segments, :version

      def initialize operator: ">=", raw_version: "0"
        @operator = operator
        @raw_version = raw_version
        @version_segments = self.class.version_segments raw_version
        @version = Versionaire::Version version_segments
        validate!
      end

      def to_s
        "#{operator} #{version}"
      end

      private

      def validate!
        operators = self.class.operators
        return true if operators.include?(operator)

        fail Errors::RequirementOperator,
             %(Invalid gem requirement operator. Use: #{operators.join ", "}.)
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
gemsmith-13.1.0 lib/gemsmith/gem/requirement.rb
gemsmith-13.0.0 lib/gemsmith/gem/requirement.rb
gemsmith-12.4.0 lib/gemsmith/gem/requirement.rb
gemsmith-12.3.0 lib/gemsmith/gem/requirement.rb
gemsmith-12.2.0 lib/gemsmith/gem/requirement.rb