bard 1.0.0 → 1.0.2

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 (46) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +5 -0
  3. data/features/bard_check.feature +1 -1
  4. data/features/bard_push.feature +1 -1
  5. data/features/step_definitions/global_steps.rb +4 -4
  6. data/features/support/env.rb +1 -1
  7. data/features/support/io.rb +1 -1
  8. data/lib/bard/ci/github_actions.rb +3 -6
  9. data/lib/bard/ci/local.rb +0 -2
  10. data/lib/bard/ci.rb +10 -12
  11. data/lib/bard/cli/ci.rb +51 -0
  12. data/lib/bard/cli/data.rb +45 -0
  13. data/lib/bard/cli/deploy.rb +64 -0
  14. data/lib/bard/cli/hurt.rb +20 -0
  15. data/lib/bard/cli/install.rb +16 -0
  16. data/lib/bard/cli/master_key.rb +17 -0
  17. data/lib/bard/cli/open.rb +13 -0
  18. data/lib/bard/cli/ping.rb +18 -0
  19. data/lib/bard/cli/provision.rb +15 -0
  20. data/lib/bard/cli/run.rb +24 -0
  21. data/lib/bard/cli/setup.rb +45 -0
  22. data/lib/bard/cli/ssh.rb +14 -0
  23. data/lib/bard/cli/stage.rb +27 -0
  24. data/lib/bard/cli/vim.rb +13 -0
  25. data/lib/bard/cli.rb +21 -246
  26. data/lib/bard/command.rb +8 -6
  27. data/lib/bard/config.rb +2 -11
  28. data/lib/bard/copy.rb +15 -40
  29. data/lib/bard/git.rb +2 -4
  30. data/lib/bard/ping.rb +0 -1
  31. data/lib/bard/provision/apt.rb +16 -0
  32. data/lib/bard/provision/http.rb +1 -15
  33. data/lib/bard/provision/mysql.rb +0 -2
  34. data/lib/bard/provision/passenger.rb +2 -4
  35. data/lib/bard/provision/repo.rb +2 -2
  36. data/lib/bard/provision/rvm.rb +3 -2
  37. data/lib/bard/provision/ssh.rb +17 -10
  38. data/lib/bard/provision/user.rb +1 -0
  39. data/lib/bard/provision.rb +4 -21
  40. data/lib/bard/server.rb +29 -7
  41. data/lib/bard/version.rb +1 -1
  42. data/spec/bard/ci_spec.rb +10 -0
  43. data/spec/bard/config_spec.rb +83 -0
  44. data/spec/bard/server_spec.rb +127 -0
  45. metadata +24 -3
  46. /data/lib/bard/provision/{master_key.rb → masterkey.rb} +0 -0
@@ -3,16 +3,10 @@ module Bard
3
3
  def self.call(...) = new(...).call
4
4
 
5
5
  def call
6
- SSH.call(*values)
7
- User.call(*values)
8
- MySQL.call(*values)
9
- Repo.call(*values)
10
- MasterKey.call(*values)
11
- RVM.call(*values)
12
- App.call(*values)
13
- Passenger.call(*values)
14
- Data.call(*values)
15
- HTTP.call(*values)
6
+ %w[SSH User Apt MySQL Repo MasterKey RVM App Passenger Data HTTP].each do |step|
7
+ require "bard/provision/#{step.downcase}"
8
+ self.class.const_get(step).call(*values)
9
+ end
16
10
  end
17
11
 
18
12
  private
@@ -27,14 +21,3 @@ module Bard
27
21
  end
28
22
  end
29
23
 
30
- require "bard/provision/ssh"
31
- require "bard/provision/user"
32
- require "bard/provision/mysql"
33
- require "bard/provision/passenger"
34
- require "bard/provision/repo"
35
- require "bard/provision/master_key"
36
- require "bard/provision/rvm"
37
- require "bard/provision/app"
38
- require "bard/provision/data"
39
- require "bard/provision/http"
40
-
data/lib/bard/server.rb CHANGED
@@ -3,7 +3,13 @@ require "bard/command"
3
3
  require "bard/copy"
4
4
 
5
5
  module Bard
6
- class Server < Struct.new(:project_name, :key, :ssh, :path, :ping, :gateway, :ssh_key, :env, :provision)
6
+ class Server < Struct.new(:project_name, :key, :ssh, :path, :ping, :gateway, :ssh_key, :env)
7
+ def self.define project_name, key, &block
8
+ new(project_name, key).tap do |server|
9
+ server.instance_eval &block
10
+ end
11
+ end
12
+
7
13
  def self.setting *fields
8
14
  fields.each do |field|
9
15
  define_method field do |*args|
@@ -18,20 +24,19 @@ module Bard
18
24
  end
19
25
  end
20
26
 
21
- setting :ssh, :path, :ping, :gateway, :ssh_key, :env, :provision
27
+ setting :ssh, :path, :ping, :gateway, :ssh_key, :env
22
28
 
23
29
  def ping(*args)
24
30
  if args.length == 0
25
- (super() || [nil]).map(&method(:normalize_ping))
31
+ (super() || [nil]).map(&method(:normalize_ping)).flatten
26
32
  else
27
33
  self.ping = args
28
34
  end
29
35
  end
30
36
 
31
37
  private def normalize_ping value
32
- return value if value == false
33
- uri = URI.parse("ssh://#{ssh}")
34
- normalized = "https://#{uri.host}" # default if none specified
38
+ return [] if value == false
39
+ normalized = "https://#{ssh_uri.host}" # default if none specified
35
40
  if value =~ %r{^/}
36
41
  normalized += value
37
42
  elsif value.to_s.length > 0
@@ -55,7 +60,24 @@ module Bard
55
60
 
56
61
  def ssh_uri which=:ssh
57
62
  value = send(which)
58
- URI.parse("ssh://#{value}")
63
+ URI("ssh://#{value}")
64
+ end
65
+
66
+ def scp_uri file_path=nil
67
+ ssh_uri.dup.tap do |uri|
68
+ uri.scheme = "scp"
69
+ uri.path = "/#{path}"
70
+ uri.path += "/#{file_path}" if file_path
71
+ end
72
+ end
73
+
74
+ def rsync_uri file_path=nil
75
+ ssh_uri.dup.tap do |uri|
76
+ uri.scheme = nil
77
+ uri.port = nil
78
+ uri.path = ":#{path}"
79
+ uri.path += "/#{file_path}" if file_path
80
+ end.to_s[2..]
59
81
  end
60
82
 
61
83
  def with(attrs)
data/lib/bard/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Bard
2
- VERSION = "1.0.0"
2
+ VERSION = "1.0.2"
3
3
  end
4
4
 
@@ -0,0 +1,10 @@
1
+ require "bard/ci"
2
+
3
+ describe Bard::CI do
4
+ subject { described_class.new("tracker", "master") }
5
+
6
+ describe "#exists?"
7
+ describe "#status"
8
+ describe "#console"
9
+ describe "#run"
10
+ end
@@ -0,0 +1,83 @@
1
+ require "bard/config"
2
+
3
+ describe Bard::Config do
4
+ context "empty" do
5
+ subject { described_class.new("tracker") }
6
+
7
+ describe "#project_name" do
8
+ it "returns the project_name setting" do
9
+ expect(subject.project_name).to eq "tracker"
10
+ end
11
+ end
12
+
13
+ describe "#servers" do
14
+ it "is prefilled with many servers" do
15
+ expect(subject.servers.keys).to eq %i[local gubs ci staging]
16
+ end
17
+ end
18
+
19
+ describe "#[]" do
20
+ it "promotes staging to production when production doesn't exist" do
21
+ expect(subject[:production]).to eq subject[:staging]
22
+ end
23
+ end
24
+
25
+ describe "#data" do
26
+ it "return an empty array" do
27
+ expect(subject.data).to eq []
28
+ end
29
+ end
30
+
31
+ describe "#backup" do
32
+ it "returns true" do
33
+ expect(subject.backup).to eq true
34
+ end
35
+ end
36
+ end
37
+
38
+ context "with production definition" do
39
+ subject { described_class.new("tracker", source: <<~SOURCE) }
40
+ server :production do
41
+ ssh "www@ssh.botandrose.com:22022"
42
+ ping "tracker.botandrose.com"
43
+ end
44
+
45
+ data "public/system", "public/ckeditor"
46
+ backup false
47
+ SOURCE
48
+
49
+ describe "#project_name" do
50
+ it "returns the project_name setting" do
51
+ expect(subject.project_name).to eq "tracker"
52
+ end
53
+ end
54
+
55
+ describe "#servers" do
56
+ it "contains the defined server" do
57
+ expect(subject.servers.keys).to eq %i[local gubs ci staging production]
58
+ end
59
+ end
60
+
61
+ describe "#server" do
62
+ it "can overwrite existing definition" do
63
+ subject.server :staging do
64
+ ssh "www@tracker-staging.botandrose.com:22022"
65
+ end
66
+ expect(subject[:staging].ssh).to eq "www@tracker-staging.botandrose.com:22022"
67
+ end
68
+ end
69
+
70
+ describe "#data" do
71
+ it "returns the data setting" do
72
+ expect(subject.data).to eq ["public/system", "public/ckeditor"]
73
+ end
74
+ end
75
+
76
+ describe "#backup" do
77
+ it "returns the backup setting" do
78
+ expect(subject.backup).to eq false
79
+ end
80
+ end
81
+ end
82
+ end
83
+
@@ -0,0 +1,127 @@
1
+ require "bard/server"
2
+
3
+ describe Bard::Server do
4
+ subject do
5
+ described_class.define("tracker", :production) do
6
+ ssh "www@tracker.botandrose.com:22022"
7
+ path "work/tracker"
8
+ ping "tracker.botandrose.com", "www.tracker.botandrose.com"
9
+ gateway "www@staging.botandrose.com:22022"
10
+ ssh_key "~/.ssh/id_rsa.pub"
11
+ env "RAILS_ENV=production"
12
+ end
13
+ end
14
+
15
+ describe "#ssh" do
16
+ it "returns the ssh setting" do
17
+ expect(subject.ssh).to eq "www@tracker.botandrose.com:22022"
18
+ end
19
+ end
20
+
21
+ describe "#ssh_uri" do
22
+ it "exposes the host" do
23
+ expect(subject.ssh_uri.host).to eq "tracker.botandrose.com"
24
+ end
25
+
26
+ it "exposes the user" do
27
+ expect(subject.ssh_uri.user).to eq "www"
28
+ end
29
+
30
+ it "exposes the port" do
31
+ expect(subject.ssh_uri.port).to eq 22022
32
+ end
33
+
34
+ it "has no path" do
35
+ expect(subject.ssh_uri.path).to be_empty
36
+ end
37
+
38
+ it "can specify another field to read from" do
39
+ expect(subject.ssh_uri(:gateway).host).to eq "staging.botandrose.com"
40
+ end
41
+
42
+ it "has no path" do
43
+ expect(subject.ssh_uri.path).to be_empty
44
+ end
45
+ end
46
+
47
+ describe "#scp_uri" do
48
+ it "exposes the host" do
49
+ expect(subject.scp_uri.host).to eq "tracker.botandrose.com"
50
+ end
51
+
52
+ it "exposes the user" do
53
+ expect(subject.scp_uri.user).to eq "www"
54
+ end
55
+
56
+ it "exposes the port" do
57
+ expect(subject.scp_uri.port).to eq 22022
58
+ end
59
+
60
+ it "includes the path to the project" do
61
+ expect(subject.scp_uri.path).to eq "/work/tracker"
62
+ end
63
+
64
+ it "compiles to an scp:// string" do
65
+ expect(subject.scp_uri.to_s).to eq "scp://www@tracker.botandrose.com:22022/work/tracker"
66
+ end
67
+ end
68
+
69
+ describe "#rsync_uri" do
70
+ it "works" do
71
+ expect(subject.rsync_uri("public/assets")).to eq "www@tracker.botandrose.com:work/tracker/public/assets"
72
+ end
73
+ end
74
+
75
+ describe "#path" do
76
+ it "returns the path setting" do
77
+ expect(subject.path).to eq "work/tracker"
78
+ end
79
+
80
+ it "defaults to the project name" do
81
+ subject.path nil
82
+ expect(subject.path).to eq "tracker"
83
+ end
84
+ end
85
+
86
+ describe "#ping" do
87
+ it "returns the ping urls, normalized" do
88
+ expect(subject.ping).to eq [
89
+ "https://tracker.botandrose.com",
90
+ "https://www.tracker.botandrose.com",
91
+ ]
92
+ end
93
+
94
+ it "accepts paths" do
95
+ subject.ping "/ping"
96
+ expect(subject.ping).to eq ["https://tracker.botandrose.com/ping"]
97
+ end
98
+
99
+ it "defaults to the ssh value" do
100
+ subject.ping nil
101
+ expect(subject.ping).to eq ["https://tracker.botandrose.com"]
102
+ end
103
+
104
+ it "accepts false to disable pings" do
105
+ subject.ping false
106
+ expect(subject.ping).to eq []
107
+ end
108
+ end
109
+
110
+ describe "#gateway" do
111
+ it "returns the gateway setting" do
112
+ expect(subject.gateway).to eq "www@staging.botandrose.com:22022"
113
+ end
114
+ end
115
+
116
+ describe "#ssh_key" do
117
+ it "returns the ssh_key setting" do
118
+ expect(subject.ssh_key).to eq "~/.ssh/id_rsa.pub"
119
+ end
120
+ end
121
+
122
+ describe "#env" do
123
+ it "returns the env setting" do
124
+ expect(subject.env).to eq "RAILS_ENV=production"
125
+ end
126
+ end
127
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bard
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micah Geisel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-08-22 00:00:00.000000000 Z
11
+ date: 2024-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -138,6 +138,20 @@ files:
138
138
  - lib/bard/ci/jenkins.rb
139
139
  - lib/bard/ci/local.rb
140
140
  - lib/bard/cli.rb
141
+ - lib/bard/cli/ci.rb
142
+ - lib/bard/cli/data.rb
143
+ - lib/bard/cli/deploy.rb
144
+ - lib/bard/cli/hurt.rb
145
+ - lib/bard/cli/install.rb
146
+ - lib/bard/cli/master_key.rb
147
+ - lib/bard/cli/open.rb
148
+ - lib/bard/cli/ping.rb
149
+ - lib/bard/cli/provision.rb
150
+ - lib/bard/cli/run.rb
151
+ - lib/bard/cli/setup.rb
152
+ - lib/bard/cli/ssh.rb
153
+ - lib/bard/cli/stage.rb
154
+ - lib/bard/cli/vim.rb
141
155
  - lib/bard/command.rb
142
156
  - lib/bard/config.rb
143
157
  - lib/bard/copy.rb
@@ -146,9 +160,10 @@ files:
146
160
  - lib/bard/ping.rb
147
161
  - lib/bard/provision.rb
148
162
  - lib/bard/provision/app.rb
163
+ - lib/bard/provision/apt.rb
149
164
  - lib/bard/provision/data.rb
150
165
  - lib/bard/provision/http.rb
151
- - lib/bard/provision/master_key.rb
166
+ - lib/bard/provision/masterkey.rb
152
167
  - lib/bard/provision/mysql.rb
153
168
  - lib/bard/provision/passenger.rb
154
169
  - lib/bard/provision/repo.rb
@@ -158,6 +173,9 @@ files:
158
173
  - lib/bard/server.rb
159
174
  - lib/bard/version.rb
160
175
  - spec/bard/ci/github_actions_spec.rb
176
+ - spec/bard/ci_spec.rb
177
+ - spec/bard/config_spec.rb
178
+ - spec/bard/server_spec.rb
161
179
  - spec/bard_spec.rb
162
180
  - spec/spec_helper.rb
163
181
  - spec/support/fixtures/job.json
@@ -199,6 +217,9 @@ test_files:
199
217
  - features/support/grit_ext.rb
200
218
  - features/support/io.rb
201
219
  - spec/bard/ci/github_actions_spec.rb
220
+ - spec/bard/ci_spec.rb
221
+ - spec/bard/config_spec.rb
222
+ - spec/bard/server_spec.rb
202
223
  - spec/bard_spec.rb
203
224
  - spec/spec_helper.rb
204
225
  - spec/support/fixtures/job.json
File without changes