bard 1.4.8 → 1.4.9

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.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +22 -0
  3. data/Gemfile +4 -0
  4. data/bard.gemspec +3 -2
  5. data/lib/bard/git.rb +5 -1
  6. data/lib/bard/provision/repo.rb +21 -0
  7. data/lib/bard/provision/ssh.rb +21 -0
  8. data/lib/bard/server.rb +2 -2
  9. data/lib/bard/version.rb +1 -1
  10. data/spec/bard/cli/ci_spec.rb +139 -0
  11. data/spec/bard/cli/command_spec.rb +50 -0
  12. data/spec/bard/cli/data_spec.rb +77 -0
  13. data/spec/bard/cli/deploy_spec.rb +202 -0
  14. data/spec/bard/cli/hurt_spec.rb +23 -0
  15. data/spec/bard/cli/install_spec.rb +25 -0
  16. data/spec/bard/cli/master_key_spec.rb +52 -0
  17. data/spec/bard/cli/new_spec.rb +60 -0
  18. data/spec/bard/cli/open_spec.rb +67 -0
  19. data/spec/bard/cli/ping_spec.rb +47 -0
  20. data/spec/bard/cli/provision_spec.rb +42 -0
  21. data/spec/bard/cli/run_spec.rb +51 -0
  22. data/spec/bard/cli/setup_spec.rb +76 -0
  23. data/spec/bard/cli/ssh_spec.rb +55 -0
  24. data/spec/bard/cli/stage_spec.rb +77 -0
  25. data/spec/bard/cli/vim_spec.rb +34 -0
  26. data/spec/bard/command_spec.rb +37 -0
  27. data/spec/bard/copy_spec.rb +33 -0
  28. data/spec/bard/git_spec.rb +61 -0
  29. data/spec/bard/github_pages_spec.rb +80 -0
  30. data/spec/bard/github_spec.rb +45 -0
  31. data/spec/bard/ping_spec.rb +31 -0
  32. data/spec/bard/provision/app_spec.rb +33 -0
  33. data/spec/bard/provision/apt_spec.rb +39 -0
  34. data/spec/bard/provision/authorizedkeys_spec.rb +40 -0
  35. data/spec/bard/provision/data_spec.rb +54 -0
  36. data/spec/bard/provision/deploy_spec.rb +33 -0
  37. data/spec/bard/provision/http_spec.rb +57 -0
  38. data/spec/bard/provision/logrotation_spec.rb +34 -0
  39. data/spec/bard/provision/masterkey_spec.rb +63 -0
  40. data/spec/bard/provision/mysql_spec.rb +55 -0
  41. data/spec/bard/provision/passenger_spec.rb +81 -0
  42. data/spec/bard/provision/repo_spec.rb +208 -0
  43. data/spec/bard/provision/rvm_spec.rb +49 -0
  44. data/spec/bard/provision/ssh_spec.rb +229 -0
  45. data/spec/bard/provision/swapfile_spec.rb +32 -0
  46. data/spec/bard/provision/user_spec.rb +103 -0
  47. data/spec/bard/provision_spec.rb +28 -0
  48. data/spec/spec_helper.rb +6 -1
  49. metadata +96 -9
@@ -0,0 +1,103 @@
1
+ require "spec_helper"
2
+ require "bard/provision"
3
+ require "bard/provision/user"
4
+
5
+ describe Bard::Provision::User do
6
+ let(:old_ssh_uri) { double("old_ssh_uri", user: "root", host: "example.com", port: 22) }
7
+ let(:new_ssh_uri) { double("new_ssh_uri", user: "deploy", host: "example.com", port: 22) }
8
+ let(:server) { double("server", ssh_uri: new_ssh_uri) }
9
+ let(:config) { { production: server } }
10
+ let(:ssh_url) { "root@example.com" }
11
+ let(:provision_server) { double("provision_server", ssh_uri: old_ssh_uri) }
12
+ let(:user_provisioner) { Bard::Provision::User.new(config, ssh_url) }
13
+
14
+ before do
15
+ allow(user_provisioner).to receive(:server).and_return(server)
16
+ allow(user_provisioner).to receive(:provision_server).and_return(provision_server)
17
+ allow(user_provisioner).to receive(:print)
18
+ allow(user_provisioner).to receive(:puts)
19
+ allow(user_provisioner).to receive(:system)
20
+ end
21
+
22
+ describe "#call" do
23
+ context "when new user already exists" do
24
+ it "skips user creation" do
25
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri, user: "deploy").and_return(true)
26
+
27
+ expect(provision_server).not_to receive(:run!)
28
+
29
+ user_provisioner.call
30
+ end
31
+ end
32
+
33
+ context "when new user doesn't exist but old user works" do
34
+ it "creates the new user" do
35
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri, user: "deploy").and_return(false)
36
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri).and_return(true)
37
+
38
+ expected_commands = [
39
+ "sudo useradd -m -s /bin/bash deploy",
40
+ "sudo usermod -aG sudo deploy",
41
+ "echo \"deploy ALL=(ALL) NOPASSWD:ALL\" | sudo tee -a /etc/sudoers",
42
+ "sudo mkdir -p ~deploy/.ssh",
43
+ "sudo cp ~/.ssh/authorized_keys ~deploy/.ssh/authorized_keys",
44
+ "sudo chown -R deploy:deploy ~deploy/.ssh",
45
+ "sudo chmod +rx ~deploy"
46
+ ].join("; ")
47
+
48
+ expect(provision_server).to receive(:run!).with(expected_commands, home: true)
49
+
50
+ user_provisioner.call
51
+ end
52
+
53
+ it "prints status messages during user creation" do
54
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri, user: "deploy").and_return(false)
55
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri).and_return(true)
56
+ allow(provision_server).to receive(:run!)
57
+
58
+ expect(user_provisioner).to receive(:print).with("User:")
59
+ expect(user_provisioner).to receive(:print).with(" Adding user deploy,")
60
+ expect(user_provisioner).to receive(:puts).with(" ✓")
61
+
62
+ user_provisioner.call
63
+ end
64
+ end
65
+
66
+ context "when neither old nor new user can SSH" do
67
+ it "raises an error" do
68
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri, user: "deploy").and_return(false)
69
+ allow(user_provisioner).to receive(:ssh_with_user?).with(old_ssh_uri).and_return(false)
70
+
71
+ expect { user_provisioner.call }.to raise_error("can't ssh in with user deploy or root")
72
+ end
73
+ end
74
+ end
75
+
76
+ describe "#ssh_with_user?" do
77
+ it "tests SSH connection with specified user" do
78
+ expect(user_provisioner).to receive(:system).with("ssh -o ConnectTimeout=2 -p22 deploy@example.com : >/dev/null 2>&1")
79
+
80
+ user_provisioner.send(:ssh_with_user?, old_ssh_uri, user: "deploy")
81
+ end
82
+
83
+ it "uses default user from SSH URI if not specified" do
84
+ expect(user_provisioner).to receive(:system).with("ssh -o ConnectTimeout=2 -p22 root@example.com : >/dev/null 2>&1")
85
+
86
+ user_provisioner.send(:ssh_with_user?, old_ssh_uri)
87
+ end
88
+ end
89
+
90
+ describe "private methods" do
91
+ describe "#new_user" do
92
+ it "returns the target user from server SSH URI" do
93
+ expect(user_provisioner.send(:new_user)).to eq("deploy")
94
+ end
95
+ end
96
+
97
+ describe "#old_user" do
98
+ it "returns the current user from provision server SSH URI" do
99
+ expect(user_provisioner.send(:old_user)).to eq("root")
100
+ end
101
+ end
102
+ end
103
+ end
@@ -0,0 +1,28 @@
1
+ require "spec_helper"
2
+ require "bard/provision"
3
+
4
+ describe Bard::Provision do
5
+ let(:config) { { production: double("production", key: :production) } }
6
+ let(:ssh_url) { "user@example.com" }
7
+ let(:provision) { Bard::Provision.new(config, ssh_url) }
8
+
9
+ describe ".call" do
10
+ it "creates a new instance and calls it" do
11
+ expect_any_instance_of(Bard::Provision).to receive(:call)
12
+ Bard::Provision.call(config, ssh_url)
13
+ end
14
+ end
15
+
16
+ describe "#server" do
17
+ it "returns the production server from config" do
18
+ expect(provision.send(:server)).to eq(config[:production])
19
+ end
20
+ end
21
+
22
+ describe "#provision_server" do
23
+ it "returns server with ssh_url" do
24
+ expect(config[:production]).to receive(:with).with(ssh: ssh_url)
25
+ provision.send(:provision_server)
26
+ end
27
+ end
28
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,10 @@
1
+ require "simplecov"
2
+ SimpleCov.start
3
+
4
+ require "webmock/rspec"
5
+
1
6
  $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
- require "byebug"
7
+ require "debug/prelude"
3
8
 
4
9
  RSpec.configure do |config|
5
10
  config.filter_run focus: true
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bard
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.8
4
+ version: 1.4.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micah Geisel
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-09-17 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: thor
@@ -67,7 +66,21 @@ dependencies:
67
66
  - !ruby/object:Gem::Version
68
67
  version: '0'
69
68
  - !ruby/object:Gem::Dependency
70
- name: byebug
69
+ name: base64
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ type: :runtime
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - ">="
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: rake
71
84
  requirement: !ruby/object:Gem::Requirement
72
85
  requirements:
73
86
  - - ">="
@@ -95,7 +108,7 @@ dependencies:
95
108
  - !ruby/object:Gem::Version
96
109
  version: '0'
97
110
  - !ruby/object:Gem::Dependency
98
- name: cucumber
111
+ name: debug
99
112
  requirement: !ruby/object:Gem::Requirement
100
113
  requirements:
101
114
  - - ">="
@@ -108,7 +121,6 @@ dependencies:
108
121
  - - ">="
109
122
  - !ruby/object:Gem::Version
110
123
  version: '0'
111
- description:
112
124
  email:
113
125
  - micah@botandrose.com
114
126
  executables:
@@ -116,6 +128,7 @@ executables:
116
128
  extensions: []
117
129
  extra_rdoc_files: []
118
130
  files:
131
+ - ".github/workflows/ci.yml"
119
132
  - ".gitignore"
120
133
  - ".gitmodules"
121
134
  - ".rspec"
@@ -196,7 +209,45 @@ files:
196
209
  - lib/bard/version.rb
197
210
  - spec/bard/ci/github_actions_spec.rb
198
211
  - spec/bard/ci_spec.rb
212
+ - spec/bard/cli/ci_spec.rb
213
+ - spec/bard/cli/command_spec.rb
214
+ - spec/bard/cli/data_spec.rb
215
+ - spec/bard/cli/deploy_spec.rb
216
+ - spec/bard/cli/hurt_spec.rb
217
+ - spec/bard/cli/install_spec.rb
218
+ - spec/bard/cli/master_key_spec.rb
219
+ - spec/bard/cli/new_spec.rb
220
+ - spec/bard/cli/open_spec.rb
221
+ - spec/bard/cli/ping_spec.rb
222
+ - spec/bard/cli/provision_spec.rb
223
+ - spec/bard/cli/run_spec.rb
224
+ - spec/bard/cli/setup_spec.rb
225
+ - spec/bard/cli/ssh_spec.rb
226
+ - spec/bard/cli/stage_spec.rb
227
+ - spec/bard/cli/vim_spec.rb
228
+ - spec/bard/command_spec.rb
199
229
  - spec/bard/config_spec.rb
230
+ - spec/bard/copy_spec.rb
231
+ - spec/bard/git_spec.rb
232
+ - spec/bard/github_pages_spec.rb
233
+ - spec/bard/github_spec.rb
234
+ - spec/bard/ping_spec.rb
235
+ - spec/bard/provision/app_spec.rb
236
+ - spec/bard/provision/apt_spec.rb
237
+ - spec/bard/provision/authorizedkeys_spec.rb
238
+ - spec/bard/provision/data_spec.rb
239
+ - spec/bard/provision/deploy_spec.rb
240
+ - spec/bard/provision/http_spec.rb
241
+ - spec/bard/provision/logrotation_spec.rb
242
+ - spec/bard/provision/masterkey_spec.rb
243
+ - spec/bard/provision/mysql_spec.rb
244
+ - spec/bard/provision/passenger_spec.rb
245
+ - spec/bard/provision/repo_spec.rb
246
+ - spec/bard/provision/rvm_spec.rb
247
+ - spec/bard/provision/ssh_spec.rb
248
+ - spec/bard/provision/swapfile_spec.rb
249
+ - spec/bard/provision/user_spec.rb
250
+ - spec/bard/provision_spec.rb
200
251
  - spec/bard/server_spec.rb
201
252
  - spec/bard_spec.rb
202
253
  - spec/spec_helper.rb
@@ -206,7 +257,6 @@ homepage: http://github.com/botandrose/bard
206
257
  licenses:
207
258
  - MIT
208
259
  metadata: {}
209
- post_install_message:
210
260
  rdoc_options: []
211
261
  require_paths:
212
262
  - lib
@@ -221,8 +271,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
221
271
  - !ruby/object:Gem::Version
222
272
  version: '0'
223
273
  requirements: []
224
- rubygems_version: 3.5.6
225
- signing_key:
274
+ rubygems_version: 3.6.9
226
275
  specification_version: 4
227
276
  summary: CLI to automate common development tasks.
228
277
  test_files:
@@ -240,7 +289,45 @@ test_files:
240
289
  - features/support/io.rb
241
290
  - spec/bard/ci/github_actions_spec.rb
242
291
  - spec/bard/ci_spec.rb
292
+ - spec/bard/cli/ci_spec.rb
293
+ - spec/bard/cli/command_spec.rb
294
+ - spec/bard/cli/data_spec.rb
295
+ - spec/bard/cli/deploy_spec.rb
296
+ - spec/bard/cli/hurt_spec.rb
297
+ - spec/bard/cli/install_spec.rb
298
+ - spec/bard/cli/master_key_spec.rb
299
+ - spec/bard/cli/new_spec.rb
300
+ - spec/bard/cli/open_spec.rb
301
+ - spec/bard/cli/ping_spec.rb
302
+ - spec/bard/cli/provision_spec.rb
303
+ - spec/bard/cli/run_spec.rb
304
+ - spec/bard/cli/setup_spec.rb
305
+ - spec/bard/cli/ssh_spec.rb
306
+ - spec/bard/cli/stage_spec.rb
307
+ - spec/bard/cli/vim_spec.rb
308
+ - spec/bard/command_spec.rb
243
309
  - spec/bard/config_spec.rb
310
+ - spec/bard/copy_spec.rb
311
+ - spec/bard/git_spec.rb
312
+ - spec/bard/github_pages_spec.rb
313
+ - spec/bard/github_spec.rb
314
+ - spec/bard/ping_spec.rb
315
+ - spec/bard/provision/app_spec.rb
316
+ - spec/bard/provision/apt_spec.rb
317
+ - spec/bard/provision/authorizedkeys_spec.rb
318
+ - spec/bard/provision/data_spec.rb
319
+ - spec/bard/provision/deploy_spec.rb
320
+ - spec/bard/provision/http_spec.rb
321
+ - spec/bard/provision/logrotation_spec.rb
322
+ - spec/bard/provision/masterkey_spec.rb
323
+ - spec/bard/provision/mysql_spec.rb
324
+ - spec/bard/provision/passenger_spec.rb
325
+ - spec/bard/provision/repo_spec.rb
326
+ - spec/bard/provision/rvm_spec.rb
327
+ - spec/bard/provision/ssh_spec.rb
328
+ - spec/bard/provision/swapfile_spec.rb
329
+ - spec/bard/provision/user_spec.rb
330
+ - spec/bard/provision_spec.rb
244
331
  - spec/bard/server_spec.rb
245
332
  - spec/bard_spec.rb
246
333
  - spec/spec_helper.rb