gitlab-ce/app/models/concerns/semantic_versionable.rb

53 lines
1.4 KiB
Ruby

# frozen_string_literal: true
module SemanticVersionable
extend ActiveSupport::Concern
included do
self.require_valid_semver = false
validate :semver_format, if: :require_valid_semver?
scope :order_by_semantic_version_desc, -> { order(semver_major: :desc, semver_minor: :desc, semver_patch: :desc) }
scope :order_by_semantic_version_asc, -> { order(semver_major: :asc, semver_minor: :asc, semver_patch: :asc) }
private
def semver_format
return unless [semver_major, semver_minor, semver_patch].any?(&:nil?)
errors.add(:base, _('must follow semantic version'))
end
def require_valid_semver?
self.class.require_valid_semver
end
end
class_methods do
attr_accessor :require_valid_semver
def semver_method(name)
define_method(name) do
return if [semver_major, semver_minor, semver_patch].any?(&:nil?)
Packages::SemVer.new(semver_major, semver_minor, semver_patch, semver_prerelease)
end
define_method("#{name}=") do |version|
parsed = Packages::SemVer.parse(version)
return if parsed.nil?
self.semver_major = parsed.major
self.semver_minor = parsed.minor
self.semver_patch = parsed.patch
self.semver_prerelease = parsed.prerelease
end
end
def validate_semver
self.require_valid_semver = true
end
end
end