bard 1.7.3 → 2.0.0.beta

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,126 @@
1
+ require "spec_helper"
2
+ require "bard/target"
3
+ require "bard/deploy_strategy"
4
+
5
+ describe "Dynamic DSL Methods" do
6
+ let(:config) { double("config", project_name: "testapp") }
7
+ let(:target) { Bard::Target.new(:production, config) }
8
+
9
+ before do
10
+ # Register test strategies
11
+ class Bard::DeployStrategy::Jets < Bard::DeployStrategy
12
+ def deploy
13
+ # test implementation
14
+ end
15
+ end
16
+
17
+ class Bard::DeployStrategy::Docker < Bard::DeployStrategy
18
+ def deploy
19
+ # test implementation
20
+ end
21
+ end
22
+ end
23
+
24
+ describe "method_missing for strategies" do
25
+ it "enables strategy when method name matches registered strategy" do
26
+ target.jets("https://api.example.com")
27
+ expect(target.deploy_strategy).to eq(:jets)
28
+ end
29
+
30
+ it "stores strategy options" do
31
+ target.jets("https://api.example.com", run_tests: true, env: "production")
32
+ options = target.strategy_options(:jets)
33
+ expect(options[:run_tests]).to be true
34
+ expect(options[:env]).to eq("production")
35
+ end
36
+
37
+ it "auto-configures ping URL from first argument if it's a URL" do
38
+ target.jets("https://api.example.com")
39
+ expect(target.ping_urls).to include("https://api.example.com")
40
+ end
41
+
42
+ it "works with multiple strategies" do
43
+ target1 = Bard::Target.new(:production, config)
44
+ target2 = Bard::Target.new(:staging, config)
45
+
46
+ target1.jets("https://api.example.com")
47
+ target2.docker("https://app.example.com")
48
+
49
+ expect(target1.deploy_strategy).to eq(:jets)
50
+ expect(target2.deploy_strategy).to eq(:docker)
51
+ end
52
+
53
+ it "raises NoMethodError for unknown methods" do
54
+ expect { target.unknown_method("arg") }
55
+ .to raise_error(NoMethodError)
56
+ end
57
+ end
58
+
59
+ describe "strategy DSL integration" do
60
+ it "allows chaining with other configuration methods" do
61
+ target.jets("https://api.example.com", run_tests: true)
62
+ target.ssh("deploy@example.com:22", path: "app")
63
+
64
+ expect(target.deploy_strategy).to eq(:jets)
65
+ expect(target.has_capability?(:ssh)).to be true
66
+ end
67
+
68
+ it "allows strategy configuration without ping URL" do
69
+ target.docker(skip_build: true)
70
+ options = target.strategy_options(:docker)
71
+ expect(options[:skip_build]).to be true
72
+ end
73
+ end
74
+
75
+ describe "#strategy_options" do
76
+ it "returns options for the specified strategy" do
77
+ target.jets("https://api.example.com", run_tests: true, env: "prod")
78
+ options = target.strategy_options(:jets)
79
+ expect(options[:run_tests]).to be true
80
+ expect(options[:env]).to eq("prod")
81
+ end
82
+
83
+ it "returns empty hash if strategy not configured" do
84
+ options = target.strategy_options(:unknown)
85
+ expect(options).to eq({})
86
+ end
87
+
88
+ it "filters out URL from options" do
89
+ target.jets("https://api.example.com", run_tests: true)
90
+ options = target.strategy_options(:jets)
91
+ expect(options[:run_tests]).to be true
92
+ expect(options).not_to have_key(:url)
93
+ end
94
+ end
95
+
96
+ describe "#deploy_strategy" do
97
+ it "returns the configured strategy symbol" do
98
+ target.jets("https://api.example.com")
99
+ expect(target.deploy_strategy).to eq(:jets)
100
+ end
101
+
102
+ it "returns nil if no strategy configured" do
103
+ expect(target.deploy_strategy).to be_nil
104
+ end
105
+ end
106
+
107
+ describe "#deploy_strategy_instance" do
108
+ it "creates an instance of the strategy class" do
109
+ target.jets("https://api.example.com")
110
+ instance = target.deploy_strategy_instance
111
+ expect(instance).to be_a(Bard::DeployStrategy::Jets)
112
+ expect(instance.target).to eq(target)
113
+ end
114
+
115
+ it "raises error if no strategy configured" do
116
+ expect { target.deploy_strategy_instance }
117
+ .to raise_error(/No deployment strategy configured/)
118
+ end
119
+
120
+ it "raises error if strategy class not found" do
121
+ target.instance_variable_set(:@deploy_strategy, :unknown)
122
+ expect { target.deploy_strategy_instance }
123
+ .to raise_error(/Unknown deployment strategy: unknown/)
124
+ end
125
+ end
126
+ end
@@ -38,6 +38,69 @@ describe Bard::GithubPages do
38
38
  end
39
39
  end
40
40
 
41
+ describe "#build_site" do
42
+ it "uses the locked port" do
43
+ github_pages.instance_variable_set(:@sha, "abc123")
44
+ github_pages.instance_variable_set(:@build_dir, "tmp/github-build-abc123")
45
+ github_pages.instance_variable_set(:@domain, "example.com")
46
+
47
+ allow(github_pages).to receive(:with_locked_port).and_yield(3005)
48
+
49
+ expect(github_pages).to receive(:run!).with(satisfy { |cmd|
50
+ cmd.include?("rails s -p 3005") && cmd.include?("http://localhost:3005")
51
+ }).ordered
52
+
53
+ expect(github_pages).to receive(:run!).with(include("kill")).ordered
54
+
55
+ github_pages.send(:build_site)
56
+ end
57
+ end
58
+
59
+ describe "#with_locked_port" do
60
+ let(:file_mock) { double("file", close: true) }
61
+
62
+ before do
63
+ allow(File).to receive(:open).and_return(file_mock)
64
+ end
65
+
66
+ it "yields the first available port" do
67
+ allow(file_mock).to receive(:flock).and_return(true)
68
+
69
+ expect(File).to receive(:open).with("/tmp/bard_github_pages_3000.lock", anything, anything)
70
+
71
+ yielded_port = nil
72
+ github_pages.send(:with_locked_port) { |p| yielded_port = p }
73
+ expect(yielded_port).to eq(3000)
74
+ end
75
+
76
+ it "retries if the first port is locked" do
77
+ # 1. Try port 3000
78
+ expect(File).to receive(:open).with("/tmp/bard_github_pages_3000.lock", anything, anything).ordered
79
+ expect(file_mock).to receive(:flock).with(File::LOCK_EX | File::LOCK_NB).and_return(false).ordered
80
+ expect(file_mock).to receive(:close).ordered
81
+
82
+ # 2. Try port 3001
83
+ expect(File).to receive(:open).with("/tmp/bard_github_pages_3001.lock", anything, anything).ordered
84
+ expect(file_mock).to receive(:flock).with(File::LOCK_EX | File::LOCK_NB).and_return(true).ordered
85
+
86
+ # 3. Cleanup after yielding
87
+ expect(file_mock).to receive(:flock).with(File::LOCK_UN).ordered
88
+ expect(file_mock).to receive(:close).ordered
89
+
90
+ yielded_port = nil
91
+ github_pages.send(:with_locked_port) { |p| yielded_port = p }
92
+ expect(yielded_port).to eq(3001)
93
+ end
94
+
95
+ it "raises an error if no ports are available" do
96
+ allow(file_mock).to receive(:flock).and_return(false)
97
+
98
+ expect {
99
+ github_pages.send(:with_locked_port) {}
100
+ }.to raise_error(/Could not find an available port/)
101
+ end
102
+ end
103
+
41
104
  describe "#get_parent_commit" do
42
105
  it "returns the sha of the gh-pages branch" do
43
106
  github_pages.instance_variable_set(:@branch, "gh-pages")
@@ -77,4 +140,4 @@ describe Bard::GithubPages do
77
140
  end
78
141
  end
79
142
  end
80
- end
143
+ end
@@ -0,0 +1,169 @@
1
+ require "spec_helper"
2
+ require "bard/ssh_server"
3
+
4
+ describe Bard::SSHServer do
5
+ describe "#initialize" do
6
+ it "parses SSH URI with user, host, and port" do
7
+ server = described_class.new("deploy@example.com:22")
8
+ expect(server.user).to eq("deploy")
9
+ expect(server.host).to eq("example.com")
10
+ expect(server.port).to eq("22")
11
+ end
12
+
13
+ it "handles SSH URI without port (defaults to 22)" do
14
+ server = described_class.new("deploy@example.com")
15
+ expect(server.user).to eq("deploy")
16
+ expect(server.host).to eq("example.com")
17
+ expect(server.port).to eq("22")
18
+ end
19
+
20
+ it "handles SSH URI without user (uses current user)" do
21
+ server = described_class.new("example.com:22")
22
+ expect(server.host).to eq("example.com")
23
+ expect(server.port).to eq("22")
24
+ expect(server.user).to eq(ENV['USER'])
25
+ end
26
+
27
+ it "accepts options hash" do
28
+ server = described_class.new("deploy@example.com:22",
29
+ path: "/app",
30
+ gateway: "bastion@example.com:22",
31
+ ssh_key: "/path/to/key",
32
+ env: "RAILS_ENV=production"
33
+ )
34
+
35
+ expect(server.path).to eq("/app")
36
+ expect(server.gateway).to eq("bastion@example.com:22")
37
+ expect(server.ssh_key).to eq("/path/to/key")
38
+ expect(server.env).to eq("RAILS_ENV=production")
39
+ end
40
+ end
41
+
42
+ describe "#ssh_uri" do
43
+ it "returns the SSH connection string" do
44
+ server = described_class.new("deploy@example.com:22")
45
+ expect(server.ssh_uri).to eq("deploy@example.com:22")
46
+ end
47
+
48
+ it "includes port if non-standard" do
49
+ server = described_class.new("deploy@example.com:2222")
50
+ expect(server.ssh_uri).to eq("deploy@example.com:2222")
51
+ end
52
+ end
53
+
54
+ describe "#hostname" do
55
+ it "extracts hostname from SSH URI" do
56
+ server = described_class.new("deploy@example.com:22")
57
+ expect(server.hostname).to eq("example.com")
58
+ end
59
+
60
+ it "handles IP addresses" do
61
+ server = described_class.new("deploy@192.168.1.1:22")
62
+ expect(server.hostname).to eq("192.168.1.1")
63
+ end
64
+ end
65
+
66
+ describe "#connection_string" do
67
+ it "builds SSH connection string" do
68
+ server = described_class.new("deploy@example.com:22")
69
+ expect(server.connection_string).to eq("deploy@example.com")
70
+ end
71
+ end
72
+
73
+ describe "#run" do
74
+ let(:server) do
75
+ described_class.new("deploy@example.com:22", path: "/app")
76
+ end
77
+
78
+ it "executes command via SSH" do
79
+ expect(Open3).to receive(:capture3)
80
+ .with(/ssh.*deploy@example.com.*cd \/app && ls/)
81
+ .and_return(["output", "", 0])
82
+
83
+ server.run("ls")
84
+ end
85
+
86
+ it "includes environment variables if configured" do
87
+ server_with_env = described_class.new("deploy@example.com:22",
88
+ path: "/app",
89
+ env: "RAILS_ENV=production"
90
+ )
91
+
92
+ expect(Open3).to receive(:capture3)
93
+ .with(/RAILS_ENV=production/)
94
+ .and_return(["output", "", 0])
95
+
96
+ server_with_env.run("ls")
97
+ end
98
+ end
99
+
100
+ describe "#run!" do
101
+ let(:server) do
102
+ described_class.new("deploy@example.com:22", path: "/app")
103
+ end
104
+
105
+ it "executes command via SSH" do
106
+ expect(Open3).to receive(:capture3)
107
+ .with(/ssh.*deploy@example.com.*cd \/app && ls/)
108
+ .and_return(["output", "", 0])
109
+
110
+ server.run!("ls")
111
+ end
112
+
113
+ it "raises error if command fails" do
114
+ expect(Open3).to receive(:capture3)
115
+ .and_return(["", "error", 1])
116
+
117
+ expect { server.run!("false") }.to raise_error(Bard::Command::Error)
118
+ end
119
+ end
120
+
121
+ describe "#exec!" do
122
+ let(:server) do
123
+ described_class.new("deploy@example.com:22", path: "/app")
124
+ end
125
+
126
+ it "replaces current process with SSH command" do
127
+ expect(server).to receive(:exec)
128
+ .with(/ssh.*deploy@example.com.*cd \/app && ls/)
129
+
130
+ server.exec!("ls")
131
+ end
132
+ end
133
+
134
+ describe "path handling" do
135
+ it "uses path in commands if configured" do
136
+ server = described_class.new("deploy@example.com:22", path: "/var/www/app")
137
+
138
+ expect(Open3).to receive(:capture3)
139
+ .with(/cd \/var\/www\/app && ls/)
140
+ .and_return(["output", "", 0])
141
+
142
+ server.run("ls")
143
+ end
144
+
145
+ it "works without path" do
146
+ server = described_class.new("deploy@example.com:22")
147
+
148
+ expect(Open3).to receive(:capture3)
149
+ .with(/ssh.*ls/)
150
+ .and_return(["output", "", 0])
151
+
152
+ server.run("ls")
153
+ end
154
+ end
155
+
156
+ describe "gateway/bastion support" do
157
+ it "uses ProxyJump for gateway" do
158
+ server = described_class.new("deploy@private.example.com:22",
159
+ gateway: "bastion@public.example.com:22"
160
+ )
161
+
162
+ expect(Open3).to receive(:capture3)
163
+ .with(/-o ProxyJump=bastion@public.example.com:22/)
164
+ .and_return(["output", "", 0])
165
+
166
+ server.run("ls")
167
+ end
168
+ end
169
+ end
@@ -0,0 +1,239 @@
1
+ require "spec_helper"
2
+ require "bard/target"
3
+
4
+ describe Bard::Target do
5
+ let(:config) { double("config", project_name: "testapp") }
6
+ let(:target) { described_class.new(:production, config) }
7
+
8
+ describe "#initialize" do
9
+ it "stores the target key" do
10
+ expect(target.key).to eq(:production)
11
+ end
12
+
13
+ it "stores the config" do
14
+ expect(target.config).to eq(config)
15
+ end
16
+
17
+ it "initializes with no capabilities" do
18
+ expect(target.has_capability?(:ssh)).to be false
19
+ expect(target.has_capability?(:ping)).to be false
20
+ end
21
+
22
+ it "initializes with no deploy strategy" do
23
+ expect(target.deploy_strategy).to be_nil
24
+ end
25
+ end
26
+
27
+ describe "#ssh" do
28
+ context "with simple SSH configuration" do
29
+ before { target.ssh("deploy@example.com:22") }
30
+
31
+ it "enables SSH capability" do
32
+ expect(target.has_capability?(:ssh)).to be true
33
+ end
34
+
35
+ it "creates SSHServer instance" do
36
+ expect(target.server).to be_a(Bard::SSHServer)
37
+ end
38
+
39
+ it "parses SSH URI" do
40
+ expect(target.ssh_uri).to eq("deploy@example.com:22")
41
+ end
42
+ end
43
+
44
+ context "with hash options" do
45
+ before do
46
+ target.ssh("deploy@example.com:22",
47
+ path: "/var/www/app",
48
+ gateway: "bastion@example.com:22",
49
+ ssh_key: "/path/to/key",
50
+ env: "RAILS_ENV=production"
51
+ )
52
+ end
53
+
54
+ it "enables SSH capability" do
55
+ expect(target.has_capability?(:ssh)).to be true
56
+ end
57
+
58
+ it "stores path" do
59
+ expect(target.path).to eq("/var/www/app")
60
+ end
61
+
62
+ it "stores gateway" do
63
+ expect(target.gateway).to eq("bastion@example.com:22")
64
+ end
65
+
66
+ it "stores SSH key" do
67
+ expect(target.ssh_key).to eq("/path/to/key")
68
+ end
69
+
70
+ it "stores environment variables" do
71
+ expect(target.env).to eq("RAILS_ENV=production")
72
+ end
73
+
74
+ it "auto-configures ping URL from hostname" do
75
+ expect(target.ping_urls).to include("example.com")
76
+ end
77
+ end
78
+
79
+ context "with false value" do
80
+ before { target.ssh(false) }
81
+
82
+ it "does not enable SSH capability" do
83
+ expect(target.has_capability?(:ssh)).to be false
84
+ end
85
+
86
+ it "sets server to nil" do
87
+ expect(target.server).to be_nil
88
+ end
89
+ end
90
+ end
91
+
92
+ describe "#ping" do
93
+ it "enables ping capability with single URL" do
94
+ target.ping("https://example.com")
95
+ expect(target.has_capability?(:ping)).to be true
96
+ expect(target.ping_urls).to include("https://example.com")
97
+ end
98
+
99
+ it "accepts multiple URLs" do
100
+ target.ping("https://example.com", "/health", "/status")
101
+ expect(target.ping_urls).to include("https://example.com")
102
+ expect(target.ping_urls).to include("/health")
103
+ expect(target.ping_urls).to include("/status")
104
+ end
105
+
106
+ it "disables ping with false" do
107
+ target.ping("https://example.com")
108
+ target.ping(false)
109
+ expect(target.has_capability?(:ping)).to be false
110
+ expect(target.ping_urls).to be_empty
111
+ end
112
+ end
113
+
114
+ describe "#path" do
115
+ it "stores and retrieves path" do
116
+ target.path("/var/www/app")
117
+ expect(target.path).to eq("/var/www/app")
118
+ end
119
+
120
+ it "can be set via ssh options" do
121
+ target.ssh("deploy@example.com:22", path: "/app")
122
+ expect(target.path).to eq("/app")
123
+ end
124
+ end
125
+
126
+ describe "remote command execution" do
127
+ before do
128
+ target.ssh("deploy@example.com:22", path: "/app")
129
+ end
130
+
131
+ describe "#run!" do
132
+ it "requires SSH capability" do
133
+ target_without_ssh = described_class.new(:local, config)
134
+ expect { target_without_ssh.run!("ls") }
135
+ .to raise_error(/SSH not configured/)
136
+ end
137
+
138
+ it "executes command on remote server" do
139
+ expect(Bard::Command).to receive(:run!)
140
+ .with("ls", on: target.server, home: false, verbose: false, quiet: false)
141
+ target.run!("ls")
142
+ end
143
+ end
144
+
145
+ describe "#run" do
146
+ it "requires SSH capability" do
147
+ target_without_ssh = described_class.new(:local, config)
148
+ expect { target_without_ssh.run("ls") }
149
+ .to raise_error(/SSH not configured/)
150
+ end
151
+
152
+ it "executes command on remote server without raising" do
153
+ expect(Bard::Command).to receive(:run)
154
+ .with("ls", on: target.server, home: false, verbose: false, quiet: false)
155
+ target.run("ls")
156
+ end
157
+ end
158
+
159
+ describe "#exec!" do
160
+ it "requires SSH capability" do
161
+ target_without_ssh = described_class.new(:local, config)
162
+ expect { target_without_ssh.exec!("ls") }
163
+ .to raise_error(/SSH not configured/)
164
+ end
165
+
166
+ it "replaces process with remote command" do
167
+ expect(Bard::Command).to receive(:exec!)
168
+ .with("ls", on: target.server, home: false)
169
+ target.exec!("ls")
170
+ end
171
+ end
172
+ end
173
+
174
+ describe "file transfer" do
175
+ let(:source_target) do
176
+ t = described_class.new(:source, config)
177
+ t.ssh("source@example.com:22", path: "/source")
178
+ t
179
+ end
180
+
181
+ let(:dest_target) do
182
+ t = described_class.new(:dest, config)
183
+ t.ssh("dest@example.com:22", path: "/dest")
184
+ t
185
+ end
186
+
187
+ describe "#copy_file" do
188
+ it "requires SSH capability on source" do
189
+ target_without_ssh = described_class.new(:local, config)
190
+ expect { target_without_ssh.copy_file("test.txt", to: dest_target) }
191
+ .to raise_error(/SSH not configured/)
192
+ end
193
+
194
+ it "requires SSH capability on destination" do
195
+ target_without_ssh = described_class.new(:local, config)
196
+ expect { source_target.copy_file("test.txt", to: target_without_ssh) }
197
+ .to raise_error(/SSH not configured/)
198
+ end
199
+
200
+ it "copies file via SCP" do
201
+ expect(Bard::Copy).to receive(:file)
202
+ .with("test.txt", from: source_target, to: dest_target, verbose: false)
203
+ source_target.copy_file("test.txt", to: dest_target)
204
+ end
205
+ end
206
+
207
+ describe "#copy_dir" do
208
+ it "requires SSH capability on source" do
209
+ target_without_ssh = described_class.new(:local, config)
210
+ expect { target_without_ssh.copy_dir("test/", to: dest_target) }
211
+ .to raise_error(/SSH not configured/)
212
+ end
213
+
214
+ it "requires SSH capability on destination" do
215
+ target_without_ssh = described_class.new(:local, config)
216
+ expect { source_target.copy_dir("test/", to: target_without_ssh) }
217
+ .to raise_error(/SSH not configured/)
218
+ end
219
+
220
+ it "syncs directory via rsync" do
221
+ expect(Bard::Copy).to receive(:dir)
222
+ .with("test/", from: source_target, to: dest_target, verbose: false)
223
+ source_target.copy_dir("test/", to: dest_target)
224
+ end
225
+ end
226
+ end
227
+
228
+ describe "#to_s" do
229
+ it "returns the target key as string" do
230
+ expect(target.to_s).to eq("production")
231
+ end
232
+ end
233
+
234
+ describe "#to_sym" do
235
+ it "returns the target key as symbol" do
236
+ expect(target.to_sym).to eq(:production)
237
+ end
238
+ end
239
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bard
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.3
4
+ version: 2.0.0.beta
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micah Geisel
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-12-15 00:00:00.000000000 Z
10
+ date: 2025-12-18 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: thor
@@ -160,8 +160,12 @@ files:
160
160
  - ".gitignore"
161
161
  - ".gitmodules"
162
162
  - ".rspec"
163
+ - ARCHITECTURE.md
164
+ - CUSTOM_STRATEGIES.md
163
165
  - Gemfile
164
166
  - LICENSE
167
+ - MIGRATION_GUIDE.md
168
+ - README.md
165
169
  - README.rdoc
166
170
  - Rakefile
167
171
  - bard.gemspec
@@ -219,6 +223,10 @@ files:
219
223
  - lib/bard/command.rb
220
224
  - lib/bard/config.rb
221
225
  - lib/bard/copy.rb
226
+ - lib/bard/default_config.rb
227
+ - lib/bard/deploy_strategy.rb
228
+ - lib/bard/deploy_strategy/github_pages.rb
229
+ - lib/bard/deploy_strategy/ssh.rb
222
230
  - lib/bard/git.rb
223
231
  - lib/bard/github.rb
224
232
  - lib/bard/github_pages.rb
@@ -240,11 +248,14 @@ files:
240
248
  - lib/bard/provision/swapfile.rb
241
249
  - lib/bard/provision/user.rb
242
250
  - lib/bard/server.rb
251
+ - lib/bard/ssh_server.rb
252
+ - lib/bard/target.rb
243
253
  - lib/bard/version.rb
244
254
  - spec/acceptance/.gitignore
245
255
  - spec/acceptance/docker/Dockerfile
246
256
  - spec/acceptance/docker/test_key
247
257
  - spec/acceptance/docker/test_key.pub
258
+ - spec/bard/capability_spec.rb
248
259
  - spec/bard/ci/github_actions_spec.rb
249
260
  - spec/bard/ci_spec.rb
250
261
  - spec/bard/cli/ci_spec.rb
@@ -266,6 +277,9 @@ files:
266
277
  - spec/bard/command_spec.rb
267
278
  - spec/bard/config_spec.rb
268
279
  - spec/bard/copy_spec.rb
280
+ - spec/bard/deploy_strategy/ssh_spec.rb
281
+ - spec/bard/deploy_strategy_spec.rb
282
+ - spec/bard/dynamic_dsl_spec.rb
269
283
  - spec/bard/git_spec.rb
270
284
  - spec/bard/github_pages_spec.rb
271
285
  - spec/bard/github_spec.rb
@@ -287,6 +301,8 @@ files:
287
301
  - spec/bard/provision/user_spec.rb
288
302
  - spec/bard/provision_spec.rb
289
303
  - spec/bard/server_spec.rb
304
+ - spec/bard/ssh_server_spec.rb
305
+ - spec/bard/target_spec.rb
290
306
  - spec/bard_spec.rb
291
307
  - spec/spec_helper.rb
292
308
  - spec/support/fixtures/job.json
@@ -332,6 +348,7 @@ test_files:
332
348
  - spec/acceptance/docker/Dockerfile
333
349
  - spec/acceptance/docker/test_key
334
350
  - spec/acceptance/docker/test_key.pub
351
+ - spec/bard/capability_spec.rb
335
352
  - spec/bard/ci/github_actions_spec.rb
336
353
  - spec/bard/ci_spec.rb
337
354
  - spec/bard/cli/ci_spec.rb
@@ -353,6 +370,9 @@ test_files:
353
370
  - spec/bard/command_spec.rb
354
371
  - spec/bard/config_spec.rb
355
372
  - spec/bard/copy_spec.rb
373
+ - spec/bard/deploy_strategy/ssh_spec.rb
374
+ - spec/bard/deploy_strategy_spec.rb
375
+ - spec/bard/dynamic_dsl_spec.rb
356
376
  - spec/bard/git_spec.rb
357
377
  - spec/bard/github_pages_spec.rb
358
378
  - spec/bard/github_spec.rb
@@ -374,6 +394,8 @@ test_files:
374
394
  - spec/bard/provision/user_spec.rb
375
395
  - spec/bard/provision_spec.rb
376
396
  - spec/bard/server_spec.rb
397
+ - spec/bard/ssh_server_spec.rb
398
+ - spec/bard/target_spec.rb
377
399
  - spec/bard_spec.rb
378
400
  - spec/spec_helper.rb
379
401
  - spec/support/fixtures/job.json