116 lines
2.7 KiB
Ruby
Raw Normal View History

2016-09-24 13:52:43 +02:00
module Hbc
class DSL
class Version < ::String
DIVIDERS = {
2016-10-14 20:33:16 +02:00
"." => :dots,
"-" => :hyphens,
"_" => :underscores,
"/" => :slashes,
}.freeze
2016-09-24 13:52:43 +02:00
DIVIDER_REGEX = /(#{DIVIDERS.keys.map { |v| Regexp.quote(v) }.join('|')})/
2016-09-24 13:52:43 +02:00
MAJOR_MINOR_PATCH_REGEX = /^(\d+)(?:\.(\d+)(?:\.(\d+))?)?/
2016-09-24 13:52:43 +02:00
class << self
private
def define_divider_methods(divider)
define_divider_deletion_method(divider)
define_divider_conversion_methods(divider)
end
def define_divider_deletion_method(divider)
method_name = deletion_method_name(divider)
define_method(method_name) do
version { delete(divider) }
end
end
def deletion_method_name(divider)
"no_#{DIVIDERS[divider]}"
end
def define_divider_conversion_methods(left_divider)
(DIVIDERS.keys - [left_divider]).each do |right_divider|
define_divider_conversion_method(left_divider, right_divider)
end
end
def define_divider_conversion_method(left_divider, right_divider)
method_name = conversion_method_name(left_divider, right_divider)
define_method(method_name) do
version { gsub(left_divider, right_divider) }
end
end
def conversion_method_name(left_divider, right_divider)
"#{DIVIDERS[left_divider]}_to_#{DIVIDERS[right_divider]}"
end
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
DIVIDERS.keys.each do |divider|
define_divider_methods(divider)
2016-08-18 22:11:42 +03:00
end
2016-09-24 13:52:43 +02:00
attr_reader :raw_version
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def initialize(raw_version)
@raw_version = raw_version
super(raw_version.to_s)
2016-08-18 22:11:42 +03:00
end
2016-09-24 13:52:43 +02:00
def latest?
to_s == "latest"
2016-08-18 22:11:42 +03:00
end
2016-09-24 13:52:43 +02:00
def major
version { slice(MAJOR_MINOR_PATCH_REGEX, 1) }
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def minor
version { slice(MAJOR_MINOR_PATCH_REGEX, 2) }
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def patch
version { slice(MAJOR_MINOR_PATCH_REGEX, 3) }
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def major_minor
version { [major, minor].reject(&:empty?).join(".") }
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def major_minor_patch
version { [major, minor, patch].reject(&:empty?).join(".") }
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def before_comma
version { split(",", 2)[0] }
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def after_comma
version { split(",", 2)[1] }
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def before_colon
version { split(":", 2)[0] }
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def after_colon
version { split(":", 2)[1] }
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def no_dividers
version { gsub(DIVIDER_REGEX, "") }
end
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
private
2016-08-18 22:11:42 +03:00
2016-09-24 13:52:43 +02:00
def version
return self if empty? || latest?
self.class.new(yield)
end
end
2016-08-18 22:11:42 +03:00
end
end