# # Copyright:: Copyright (c) 2018 GitLab Inc. # License:: Apache License, Version 2.0 # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. class PGVersion < String attr_reader :major, :minor VERSION_PATTERN ||= %r{ \A(?\d+) (\.(?\d+))? (\.(?\d+))?\z }x.freeze def initialize(version_string) super(version_string) parse_version_parts end def self.parse(version_string) new(version_string) if version_string end def valid? self.class::VERSION_PATTERN.match?(self) && !!major end private def parse_version_parts match_data = self.class::VERSION_PATTERN.match(self) return unless match_data part1 = match_data[:part1].to_i part2 = match_data[:part2].to_i if match_data.names.include?('part2') && match_data[:part2] part3 = match_data[:part3].to_i if match_data.names.include?('part3') && match_data[:part3] # Prior the Postgres 10, the major version was considered the first two parts # eg. 9.6, with 10, just 10 is considered the major version # https://www.postgresql.org/support/versioning/ if part1 >= 10 @major = part1.to_s @minor = part2.to_s if part2 else @major = "#{part1}.#{part2}" if part2 @minor = part3.to_s if part3 end end end