| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-14 20:03:34 +02:00
										 |  |  |       DIVIDER_REGEX = /(#{DIVIDERS.keys.map { |v| Regexp.quote(v) }.join('|')})/ | 
					
						
							| 
									
										
										
										
											2016-09-24 13:52:43 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-14 20:03:34 +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 |