Sha256: 692fba64d1b90a400a2dff9b87a588b96d81422aafbe3e0692a594ea3258c280

Contents?: true

Size: 1.45 KB

Versions: 7

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

7 entries across 7 versions & 1 rubygems

Version Path
gemsmith-15.5.0 lib/gemsmith/gem/requirement.rb
gemsmith-15.4.0 lib/gemsmith/gem/requirement.rb
gemsmith-15.3.0 lib/gemsmith/gem/requirement.rb
gemsmith-15.2.0 lib/gemsmith/gem/requirement.rb
gemsmith-15.1.1 lib/gemsmith/gem/requirement.rb
gemsmith-15.1.0 lib/gemsmith/gem/requirement.rb
gemsmith-15.0.0 lib/gemsmith/gem/requirement.rb