Skip to content
This repository was archived by the owner on Apr 22, 2025. It is now read-only.

Commit a15c4b9

Browse files
committed
Add --no-vscode and HOMEBREW_BUNDLE_DUMP_NO_VSCODE
This allows excluding VSCode output from `brew bundle dump` with a flag or environment variable. While we're here - generally refactor how we handle command arguments so this logic is pushed into `cmd/bundle` and made more consistent - fix early RSpec failure due to an unstubbed `exec` call - refactor some specs to be more idiomatic
1 parent 4b25b52 commit a15c4b9

File tree

9 files changed

+99
-97
lines changed

9 files changed

+99
-97
lines changed

cmd/bundle.rb

Lines changed: 53 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -80,17 +80,21 @@ class BundleCmd < AbstractCommand
8080
switch "--all",
8181
description: "`list` all dependencies."
8282
switch "--formula", "--brews",
83-
description: "`list` Homebrew formula dependencies."
83+
description: "`list` or `dump` Homebrew formula dependencies."
8484
switch "--cask", "--casks",
85-
description: "`list` Homebrew cask dependencies."
85+
description: "`list` or `dump` Homebrew cask dependencies."
8686
switch "--tap", "--taps",
87-
description: "`list` Homebrew tap dependencies."
87+
description: "`list` or `dump` Homebrew tap dependencies."
8888
switch "--mas",
89-
description: "`list` Mac App Store dependencies."
89+
description: "`list` or `dump` Mac App Store dependencies."
9090
switch "--whalebrew",
91-
description: "`list` Whalebrew dependencies."
91+
description: "`list` or `dump` Whalebrew dependencies."
9292
switch "--vscode",
93-
description: "`list` VSCode extensions."
93+
description: "`list` or `dump` VSCode extensions."
94+
switch "--no-vscode",
95+
env: :bundle_dump_no_vscode,
96+
description: "`dump` without VSCode extensions. " \
97+
"This is enabled by default if `HOMEBREW_BUNDLE_DUMP_NO_VSCODE` is set."
9498
switch "--describe",
9599
env: :bundle_dump_describe,
96100
description: "`dump` adds a description comment above each line, unless the " \
@@ -101,6 +105,9 @@ class BundleCmd < AbstractCommand
101105
switch "--zap",
102106
description: "`cleanup` casks using the `zap` command instead of `uninstall`."
103107

108+
conflicts "--all", "--no-vscode"
109+
conflicts "--vscode", "--no-vscode"
110+
104111
named_args %w[install dump cleanup check exec list]
105112
end
106113

@@ -113,16 +120,22 @@ def run
113120
raise UsageError, "This command does not take more than 1 subcommand argument."
114121
end
115122

123+
global = args.global?
124+
file = args.file
125+
args.zap?
126+
no_upgrade = args.no_upgrade?
127+
verbose = args.verbose?
128+
force = args.force?
129+
zap = args.zap?
130+
131+
no_type_args = !args.brews? && !args.casks? && !args.taps? && !args.mas? && !args.whalebrew? && !args.vscode?
132+
116133
case subcommand
117134
when nil, "install"
118135
Bundle::Commands::Install.run(
119-
global: args.global?,
120-
file: args.file,
136+
global:, file:, no_upgrade:, verbose:, force:,
121137
no_lock: args.no_lock?,
122-
no_upgrade: args.no_upgrade?,
123-
verbose: args.verbose?,
124-
force: args.force?,
125-
quiet: args.quiet?,
138+
quiet: args.quiet?
126139
)
127140

128141
cleanup = if ENV.fetch("HOMEBREW_BUNDLE_INSTALL_CLEANUP", nil)
@@ -133,60 +146,48 @@ def run
133146

134147
if cleanup
135148
Bundle::Commands::Cleanup.run(
136-
global: args.global?,
137-
file: args.file,
149+
global:, file:, zap:,
138150
force: true,
139-
zap: args.zap?,
140-
dsl: Bundle::Commands::Install.dsl,
151+
dsl: Bundle::Commands::Install.dsl
141152
)
142153
end
143154
when "dump"
155+
vscode = if args.no_vscode?
156+
false
157+
elsif args.vscode?
158+
true
159+
else
160+
no_type_args
161+
end
162+
144163
Bundle::Commands::Dump.run(
145-
global: args.global?,
146-
file: args.file,
164+
global:, file:, force:,
147165
describe: args.describe?,
148-
force: args.force?,
149166
no_restart: args.no_restart?,
150-
all: args.all?,
151-
taps: args.taps?,
152-
brews: args.brews?,
153-
casks: args.casks?,
154-
mas: args.mas?,
155-
whalebrew: args.whalebrew?,
156-
vscode: args.vscode?,
167+
taps: args.taps? || no_type_args,
168+
brews: args.brews? || no_type_args,
169+
casks: args.casks? || no_type_args,
170+
mas: args.mas? || no_type_args,
171+
whalebrew: args.whalebrew? || no_type_args,
172+
vscode:
157173
)
158174
when "cleanup"
159-
Bundle::Commands::Cleanup.run(
160-
global: args.global?,
161-
file: args.file,
162-
force: args.force?,
163-
zap: args.zap?,
164-
)
175+
Bundle::Commands::Cleanup.run(global:, file:, force:, zap:)
165176
when "check"
166-
Bundle::Commands::Check.run(
167-
global: args.global?,
168-
file: args.file,
169-
no_upgrade: args.no_upgrade?,
170-
verbose: args.verbose?,
171-
)
177+
Bundle::Commands::Check.run(global:, file:, no_upgrade:, verbose:)
172178
when "exec"
173179
_subcommand, *named_args = args.named
174-
Bundle::Commands::Exec.run(
175-
*named_args,
176-
global: args.global?,
177-
file: args.file,
178-
)
180+
Bundle::Commands::Exec.run(*named_args, global:, file:)
179181
when "list"
180182
Bundle::Commands::List.run(
181-
global: args.global?,
182-
file: args.file,
183-
all: args.all?,
184-
casks: args.casks?,
185-
taps: args.taps?,
186-
mas: args.mas?,
187-
whalebrew: args.whalebrew?,
188-
vscode: args.vscode?,
189-
brews: args.brews?,
183+
global:,
184+
file:,
185+
brews: args.brews? || args.all? || no_type_args,
186+
casks: args.casks? || args.all?,
187+
taps: args.taps? || args.all?,
188+
mas: args.mas? || args.all?,
189+
whalebrew: args.whalebrew? || args.all?,
190+
vscode: args.vscode? || args.all?,
190191
)
191192
else
192193
raise UsageError, "unknown subcommand: #{subcommand}"

lib/bundle/commands/dump.rb

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,9 @@ module Commands
55
module Dump
66
module_function
77

8-
def run(global: false, file: nil, describe: false, force: false, no_restart: false,
9-
all: false, taps: false, brews: false, casks: false,
10-
mas: false, whalebrew: false, vscode: false)
8+
def run(global:, file:, describe:, force:, no_restart:, taps:, brews:, casks:, mas:, whalebrew:, vscode:)
119
Bundle::Dumper.dump_brewfile(
12-
global:, file:, describe:, force:, no_restart:,
13-
all:, taps:, brews:, casks:,
14-
mas:, whalebrew:, vscode:
10+
global:, file:, describe:, force:, no_restart:, taps:, brews:, casks:, mas:, whalebrew:, vscode:,
1511
)
1612
end
1713
end

lib/bundle/commands/list.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,11 @@ module Commands
55
module List
66
module_function
77

8-
def run(global: false, file: nil, all: false, casks: false, taps: false, mas: false, whalebrew: false,
9-
vscode: false, brews: false)
8+
def run(global:, file:, brews:, casks:, taps:, mas:, whalebrew:, vscode:)
109
parsed_entries = Brewfile.read(global:, file:).entries
1110
Bundle::Lister.list(
1211
parsed_entries,
13-
all:, casks:, taps:, mas:, whalebrew:, vscode:, brews:,
12+
brews:, casks:, taps:, mas:, whalebrew:, vscode:,
1413
)
1514
end
1615
end

lib/bundle/dumper.rb

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,22 @@ def can_write_to_brewfile?(brewfile_path, force: false)
1313
true
1414
end
1515

16-
def build_brewfile(describe: false, no_restart: false,
17-
all: false, taps: false, brews: false, casks: false,
18-
mas: false, whalebrew: false, vscode: false)
19-
all ||= !(taps || brews || casks || mas || whalebrew || vscode)
16+
def build_brewfile(describe:, no_restart:, brews:, taps:, casks:, mas:, whalebrew:, vscode:)
2017
content = []
21-
content << TapDumper.dump if taps || all
22-
content << BrewDumper.dump(describe:, no_restart:) if brews || all
23-
content << CaskDumper.dump(describe:) if casks || all
24-
content << MacAppStoreDumper.dump if mas || all
25-
content << WhalebrewDumper.dump if whalebrew || all
26-
content << VscodeExtensionDumper.dump if vscode || all
18+
content << TapDumper.dump if taps
19+
content << BrewDumper.dump(describe:, no_restart:) if brews
20+
content << CaskDumper.dump(describe:) if casks
21+
content << MacAppStoreDumper.dump if mas
22+
content << WhalebrewDumper.dump if whalebrew
23+
content << VscodeExtensionDumper.dump if vscode
2724
"#{content.reject(&:empty?).join("\n")}\n"
2825
end
2926

30-
def dump_brewfile(global: false, file: nil, describe: false, force: false, no_restart: false,
31-
all: false, taps: false, brews: false, casks: false,
32-
mas: false, whalebrew: false, vscode: false)
27+
def dump_brewfile(global:, file:, describe:, force:, no_restart:, brews:, taps:, casks:, mas:, whalebrew:,
28+
vscode:)
3329
path = brewfile_path(global:, file:)
3430
can_write_to_brewfile?(path, force:)
35-
content = build_brewfile(describe:, no_restart:,
36-
all:, taps:, brews:, casks:,
37-
mas:, whalebrew:, vscode:)
31+
content = build_brewfile(describe:, no_restart:, taps:, brews:, casks:, mas:, whalebrew:, vscode:)
3832
write_file path, content
3933
end
4034

lib/bundle/lister.rb

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,26 +4,19 @@ module Bundle
44
module Lister
55
module_function
66

7-
def list(entries, all: false, casks: false, taps: false, mas: false, whalebrew: false,
8-
vscode: false, brews: false)
7+
def list(entries, brews:, casks:, taps:, mas:, whalebrew:, vscode:)
98
entries.each do |entry|
10-
if show?(entry.type, all:, casks:, taps:, mas:, whalebrew:, vscode:,
11-
brews:)
12-
puts entry.name
13-
end
9+
puts entry.name if show?(entry.type, brews:, casks:, taps:, mas:, whalebrew:, vscode:)
1410
end
1511
end
1612

17-
def self.show?(type, all: false, casks: false, taps: false, mas: false, whalebrew: false,
18-
vscode: false, brews: false)
19-
return true if all
13+
def self.show?(type, brews:, casks:, taps:, mas:, whalebrew:, vscode:)
14+
return true if brews && type == :brew
2015
return true if casks && type == :cask
2116
return true if taps && type == :tap
2217
return true if mas && type == :mas
2318
return true if whalebrew && type == :whalebrew
2419
return true if vscode && type == :vscode
25-
return true if brews && type == :brew
26-
return true if type == :brew && !casks && !taps && !mas && !whalebrew && !vscode
2720

2821
false
2922
end

spec/bundle/commands/dump_command_spec.rb

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
require "spec_helper"
44

55
describe Bundle::Commands::Dump do
6+
subject(:dump) { described_class.run(global:, file: nil, describe: false, force:, no_restart: false, taps: true, brews: true, casks: true, mas: true, whalebrew: true, vscode: true) }
7+
let(:force) { false }
8+
let(:global) { false }
9+
610
context "when files existed" do
711
before do
812
allow_any_instance_of(Pathname).to receive(:exist?).and_return(true)
@@ -11,7 +15,7 @@
1115

1216
it "raises error" do
1317
expect do
14-
described_class.run
18+
dump
1519
end.to raise_error(RuntimeError)
1620
end
1721

@@ -21,12 +25,15 @@
2125
expect(Bundle::CaskDumper).not_to receive(:dump)
2226
expect(Bundle::WhalebrewDumper).not_to receive(:dump)
2327
expect do
24-
described_class.run
28+
dump
2529
end.to raise_error(RuntimeError)
2630
end
2731
end
2832

29-
context "when files existed and `--force` is passed" do
33+
context "when files existed and `--force` and `--global` are passed" do
34+
let(:force) { true }
35+
let(:global) { true }
36+
3037
before do
3138
ENV["HOMEBREW_BUNDLE_FILE"] = ""
3239
allow_any_instance_of(Pathname).to receive(:exist?).and_return(true)
@@ -38,7 +45,7 @@
3845
expect_any_instance_of(Pathname).to receive(:open).with("w").and_yield(io)
3946
expect(io).to receive(:write)
4047
expect do
41-
described_class.run(force: true, global: true)
48+
dump
4249
end.not_to raise_error
4350
end
4451
end

spec/bundle/commands/exec_command_spec.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
let(:rbenv_root) { Pathname.new("/tmp/.rbenv") }
8888

8989
it "prepends the path of the rbenv shims to PATH before running" do
90+
allow(described_class).to receive(:exec).with("/usr/bin/true").and_return(0)
9091
allow_any_instance_of(Pathname).to receive(:read)
9192
.and_return("brew 'rbenv'")
9293
allow(ENV).to receive(:fetch).with(any_args).and_call_original

spec/bundle/commands/list_command_spec.rb

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,13 @@
33
require "spec_helper"
44

55
describe Bundle::Commands::List do
6-
subject(:list) { described_class.run(**options) }
7-
8-
let(:options) { {} }
6+
subject(:list) { described_class.run(global: false, file: nil, brews:, casks:, taps:, mas:, whalebrew:, vscode:) }
7+
let(:brews) { true }
8+
let(:casks) { false }
9+
let(:taps) { false }
10+
let(:mas) { false }
11+
let(:whalebrew) { false }
12+
let(:vscode) { false }
913

1014
before do
1115
allow_any_instance_of(IO).to receive(:puts)
@@ -20,6 +24,7 @@
2024
cask 'google-chrome'
2125
mas '1Password', id: 443987910
2226
whalebrew 'whalebrew/imagemagick'
27+
vscode 'shopify.ruby-lsp'
2328
EOS
2429
)
2530
end
@@ -35,6 +40,7 @@
3540
casks: "google-chrome",
3641
mas: "1Password",
3742
whalebrew: "whalebrew/imagemagick",
43+
vscode: "shopify.ruby-lsp",
3844
}
3945

4046
combinations = 1.upto(types_and_deps.length).flat_map do |i|
@@ -48,7 +54,12 @@
4854
verb = (options_list.length == 1 && "is") || "are"
4955

5056
context "when #{opts} #{verb} passed" do
51-
let(:options) { args_hash }
57+
let(:brews) { args_hash[:brews] }
58+
let(:casks) { args_hash[:casks] }
59+
let(:taps) { args_hash[:taps] }
60+
let(:mas) { args_hash[:mas] }
61+
let(:whalebrew) { args_hash[:whalebrew] }
62+
let(:vscode) { args_hash[:vscode] }
5263

5364
it "shows only #{words}" do
5465
expected = options_list.map { |opt| types_and_deps[opt] }.join("\n")

spec/bundle/dumper_spec.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
end
3737

3838
it "generates output" do
39-
expect(dumper.build_brewfile).to eql("cask \"google-chrome\"\ncask \"java\"\ncask \"iterm2-beta\"\n")
39+
expect(dumper.build_brewfile(describe: false, no_restart: false, brews: true, taps: true, casks: true, mas: true, whalebrew: true, vscode: true)).to eql("cask \"google-chrome\"\ncask \"java\"\ncask \"iterm2-beta\"\n")
4040
end
4141

4242
it "determines the brewfile correctly" do

0 commit comments

Comments
 (0)