aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Homebrew/cask/lib/hbc/dsl/version.rb
blob: e01e67ea29531a1cab225307177172c733f3da68 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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