Sha256: daba6b0356083417d1c4229222288c25998ce56637ddee80f436c43f03c9fbf0
Contents?: true
Size: 1.86 KB
Versions: 10
Compression:
Stored size: 1.86 KB
Contents
# frozen_string_literal: true module Versionaire # An immutable, semantic version value object. class Version include Comparable attr_reader :major, :minor, :maintenance def self.keys %i[major minor maintenance] end def self.delimiter "." end def self.string_format / \A # Start of string. v? # Optional prefix. \d{1,} # Major version. #{delimiter} # Delimiter. \d{1,} # Minor 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]] end def initialize major: 0, minor: 0, maintenance: 0 @major = major @minor = minor @maintenance = maintenance validate end def + other self.class.new self.class.arguments(*reduce(other, :+)) end def - other self.class.new self.class.arguments(*reduce(other, :-)) end 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 label "v#{self}" end def to_s "#{major}#{self.class.delimiter}#{minor}#{self.class.delimiter}#{maintenance}" end alias 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?) end def reduce other, action to_a.zip(other.to_a).map { |pair| pair.reduce(action) } end end end
Version data entries
10 entries across 10 versions & 1 rubygems