112 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
		
		
			
		
	
	
			112 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
|   | class Hbc::DSL::Version < ::String | ||
|  |   DIVIDERS = { | ||
|  |                "." => :dots, | ||
|  |                "-" => :hyphens, | ||
|  |                "_" => :underscores, | ||
|  |                "/" => :slashes, | ||
|  |              }.freeze | ||
|  | 
 | ||
|  |   DIVIDER_REGEX = %r{(#{DIVIDERS.keys.map { |v| Regexp.quote(v) }.join('|')})} | ||
|  | 
 | ||
|  |   MAJOR_MINOR_PATCH_REGEX = %r{^(\d+)(?:\.(\d+)(?:\.(\d+))?)?} | ||
|  | 
 | ||
|  |   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 | ||
|  | 
 | ||
|  |   DIVIDERS.keys.each do |divider| | ||
|  |     define_divider_methods(divider) | ||
|  |   end | ||
|  | 
 | ||
|  |   attr_reader :raw_version | ||
|  | 
 | ||
|  |   def initialize(raw_version) | ||
|  |     @raw_version = raw_version | ||
|  |     super(raw_version.to_s) | ||
|  |   end | ||
|  | 
 | ||
|  |   def latest? | ||
|  |     to_s == "latest" | ||
|  |   end | ||
|  | 
 | ||
|  |   def major | ||
|  |     version { slice(MAJOR_MINOR_PATCH_REGEX, 1) } | ||
|  |   end | ||
|  | 
 | ||
|  |   def minor | ||
|  |     version { slice(MAJOR_MINOR_PATCH_REGEX, 2) } | ||
|  |   end | ||
|  | 
 | ||
|  |   def patch | ||
|  |     version { slice(MAJOR_MINOR_PATCH_REGEX, 3) } | ||
|  |   end | ||
|  | 
 | ||
|  |   def major_minor | ||
|  |     version { [major, minor].reject(&:empty?).join(".") } | ||
|  |   end | ||
|  | 
 | ||
|  |   def major_minor_patch | ||
|  |     version { [major, minor, patch].reject(&:empty?).join(".") } | ||
|  |   end | ||
|  | 
 | ||
|  |   def before_comma | ||
|  |     version { split(",", 2)[0] } | ||
|  |   end | ||
|  | 
 | ||
|  |   def after_comma | ||
|  |     version { split(",", 2)[1] } | ||
|  |   end | ||
|  | 
 | ||
|  |   def before_colon | ||
|  |     version { split(":", 2)[0] } | ||
|  |   end | ||
|  | 
 | ||
|  |   def after_colon | ||
|  |     version { split(":", 2)[1] } | ||
|  |   end | ||
|  | 
 | ||
|  |   def no_dividers | ||
|  |     version { gsub(DIVIDER_REGEX, "") } | ||
|  |   end | ||
|  | 
 | ||
|  |   private | ||
|  | 
 | ||
|  |   def version | ||
|  |     return self if empty? || latest? | ||
|  |     self.class.new(yield) | ||
|  |   end | ||
|  | end |