lib/versionaire/version.rb in versionaire-7.0.0 vs lib/versionaire/version.rb in versionaire-7.1.0

- old
+ new

@@ -1,36 +1,32 @@ # frozen_string_literal: true module Versionaire - # An immutable, semantic version value object. - class Version - include Comparable - attr_reader :major, :minor, :maintenance + VERSION_ATTRIBUTES = %i[major minor maintenance].freeze + VERSION_DELIMITER = "." - KEYS = %i[major minor maintenance].freeze - DELIMITER = "." - + # An immutable, semantic version value object. + # rubocop:disable Metrics/BlockLength + Version = Struct.new :major, :minor, :maintenance, keyword_init: true do def self.regex / - \A # Start of string. - \d{1,} # Major version. - #{DELIMITER} # Delimiter. - \d{1,} # Minor version. - #{DELIMITER} # Delimiter. - \d{1,} # Maintenance version. - \z # End of string. + \A # Start of string. + \d{1,} # Major version. + #{VERSION_DELIMITER} # Delimiter. + \d{1,} # Minor version. + #{VERSION_DELIMITER} # Delimiter. + \d{1,} # Maintenance version. + \z # End of string. /x end def self.arguments major, minor, maintenance - Hash[KEYS.zip [major, minor, maintenance]] + Hash[VERSION_ATTRIBUTES.zip [major, minor, maintenance]] end def initialize major: 0, minor: 0, maintenance: 0 - @major = major - @minor = minor - @maintenance = maintenance + super validate freeze end def + other @@ -41,39 +37,24 @@ def - other klass = self.class klass.new klass.arguments(*reduce(other, :-)) end - # :reek:FeatureEnvy - def == other - other.is_a?(Version) && to_s == other.to_s - end - - alias eql? == - def <=> other to_s <=> other.to_s end - def hash - [major, minor, maintenance, self.class].hash - end - def to_s - [major, minor, maintenance].join self.class::DELIMITER + [major, minor, maintenance].join VERSION_DELIMITER end - alias to_str to_s + alias_method :to_str, :to_s def to_a [major, minor, maintenance] end - def to_h - {major: major, minor: minor, maintenance: maintenance} - end - private def validate fail(Errors::InvalidNumber) if to_a.any? { |number| !number.is_a? Integer } fail(Errors::NegativeNumber) if to_a.any?(&:negative?) @@ -81,6 +62,7 @@ def reduce other, action to_a.zip(other.to_a).map { |pair| pair.reduce(action) } end end + # rubocop:enable Metrics/BlockLength end