/
dsl.rb
137 lines (109 loc) 路 3.95 KB
/
dsl.rb
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
# frozen_string_literal: true
module Bundle
class Dsl
class Entry
attr_reader :type, :name, :options
def initialize(type, name, options = {})
@type = type
@name = name
@options = options
end
def to_s
name
end
end
attr_reader :entries, :cask_arguments
def initialize(input)
@input = input
@entries = []
@cask_arguments = {}
begin
process
# Want to catch all exceptions for e.g. syntax errors.
rescue Exception => e # rubocop:disable Lint/RescueException
error_msg = "Invalid Brewfile: #{e.message}"
raise RuntimeError, error_msg, e.backtrace
end
end
def process
instance_eval(@input)
end
def cask_args(args)
raise "cask_args(#{args.inspect}) should be a Hash object" unless args.is_a? Hash
@cask_arguments = args
end
def brew(name, options = {})
raise "name(#{name.inspect}) should be a String object" unless name.is_a? String
raise "options(#{options.inspect}) should be a Hash object" unless options.is_a? Hash
name = Bundle::Dsl.sanitize_brew_name(name)
@entries << Entry.new(:brew, name, options)
end
def cask(name, options = {})
raise "name(#{name.inspect}) should be a String object" unless name.is_a? String
raise "options(#{options.inspect}) should be a Hash object" unless options.is_a? Hash
options[:full_name] = name
name = Bundle::Dsl.sanitize_cask_name(name)
options[:args] = @cask_arguments.merge options.fetch(:args, {})
@entries << Entry.new(:cask, name, options)
end
def mas(name, options = {})
id = options[:id]
raise "name(#{name.inspect}) should be a String object" unless name.is_a? String
raise "options[:id](#{id}) should be an Integer object" unless id.is_a? Integer
@entries << Entry.new(:mas, name, id:)
end
def whalebrew(name)
raise "name(#{name.inspect}) should be a String object" unless name.is_a? String
@entries << Entry.new(:whalebrew, name)
end
def vscode(name)
raise "name(#{name.inspect}) should be a String object" unless name.is_a? String
@entries << Entry.new(:vscode, name)
end
def tlmgr(name, options = {})
raise "name(#{name.inspect}) should be a String object" unless name.is_a? String
raise "options(#{options.inspect}) should be a Hash object" unless options.is_a? Hash
@entries << Entry.new(:tlmgr, name, options)
end
def tap(name, clone_target = nil, options = {})
raise "name(#{name.inspect}) should be a String object" unless name.is_a? String
if clone_target && !clone_target.is_a?(String)
raise "clone_target(#{clone_target.inspect}) should be nil or a String object"
end
options[:clone_target] = clone_target
name = Bundle::Dsl.sanitize_tap_name(name)
@entries << Entry.new(:tap, name, options)
end
HOMEBREW_TAP_ARGS_REGEX = %r{^([\w-]+)/(homebrew-)?([\w-]+)$}
HOMEBREW_CORE_FORMULA_REGEX = %r{^homebrew/homebrew/([\w+-.@]+)$}i
HOMEBREW_TAP_FORMULA_REGEX = %r{^([\w-]+)/([\w-]+)/([\w+-.@]+)$}
def self.sanitize_brew_name(name)
name = name.downcase
if name =~ HOMEBREW_CORE_FORMULA_REGEX
Regexp.last_match(1)
elsif name =~ HOMEBREW_TAP_FORMULA_REGEX
user = Regexp.last_match(1)
repo = Regexp.last_match(2)
name = Regexp.last_match(3)
"#{user}/#{repo.sub("homebrew-", "")}/#{name}"
else
name
end
end
def self.sanitize_tap_name(name)
name = name.downcase
if name =~ HOMEBREW_TAP_ARGS_REGEX
"#{Regexp.last_match(1)}/#{Regexp.last_match(3)}"
else
name
end
end
def self.sanitize_cask_name(name)
name = name.split("/").last if name.include?("/")
name.downcase
end
def self.pluralize_dependency(installed_count)
(installed_count == 1) ? "dependency" : "dependencies"
end
end
end