Sha256: 30c7805230fbeb06959c4e6454ab40fc3d895c6d7fc91077aa5185321dd87efa

Contents?: true

Size: 1.44 KB

Versions: 3

Compression:

Stored size: 1.44 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::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

3 entries across 3 versions & 1 rubygems

Version Path
gemsmith-14.11.0 lib/gemsmith/gem/requirement.rb
gemsmith-14.10.1 lib/gemsmith/gem/requirement.rb
gemsmith-14.10.0 lib/gemsmith/gem/requirement.rb