capistrano 3.0.1 → 3.1.0
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.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +5 -2
- data/CHANGELOG.md +36 -3
- data/CONTRIBUTING.md +91 -0
- data/Gemfile +9 -0
- data/README.md +9 -11
- data/capistrano.gemspec +5 -8
- data/features/configuration.feature +15 -0
- data/features/deploy.feature +1 -0
- data/features/deploy_failure.feature +17 -0
- data/features/step_definitions/assertions.rb +19 -0
- data/features/step_definitions/cap_commands.rb +5 -1
- data/features/step_definitions/setup.rb +13 -0
- data/features/support/remote_command_helpers.rb +4 -0
- data/lib/capistrano/application.rb +41 -3
- data/lib/capistrano/configuration.rb +8 -0
- data/lib/capistrano/configuration/server.rb +28 -5
- data/lib/capistrano/configuration/servers.rb +3 -6
- data/lib/capistrano/configuration/servers/host_filter.rb +82 -0
- data/lib/capistrano/dsl.rb +16 -1
- data/lib/capistrano/dsl/env.rb +11 -1
- data/lib/capistrano/dsl/paths.rb +8 -0
- data/lib/capistrano/dsl/stages.rb +8 -1
- data/lib/capistrano/dsl/task_enhancements.rb +13 -2
- data/lib/capistrano/git.rb +35 -0
- data/lib/capistrano/hg.rb +32 -0
- data/lib/capistrano/i18n.rb +6 -2
- data/lib/capistrano/scm.rb +116 -0
- data/lib/capistrano/setup.rb +4 -3
- data/lib/capistrano/tasks/console.rake +9 -1
- data/lib/capistrano/tasks/deploy.rake +17 -15
- data/lib/capistrano/tasks/framework.rake +1 -0
- data/lib/capistrano/tasks/git.rake +16 -10
- data/lib/capistrano/tasks/hg.rake +13 -9
- data/lib/capistrano/templates/Capfile +1 -2
- data/lib/capistrano/templates/deploy.rb.erb +20 -2
- data/lib/capistrano/templates/stage.rb.erb +1 -4
- data/lib/capistrano/version.rb +1 -1
- data/spec/integration/dsl_spec.rb +147 -2
- data/spec/lib/capistrano/application_spec.rb +2 -5
- data/spec/lib/capistrano/configuration/server_spec.rb +40 -4
- data/spec/lib/capistrano/configuration/servers/host_filter_spec.rb +84 -0
- data/spec/lib/capistrano/configuration/servers_spec.rb +35 -0
- data/spec/lib/capistrano/configuration_spec.rb +8 -0
- data/spec/lib/capistrano/dsl_spec.rb +0 -11
- data/spec/lib/capistrano/git_spec.rb +70 -0
- data/spec/lib/capistrano/hg_spec.rb +70 -0
- data/spec/lib/capistrano/scm_spec.rb +104 -0
- data/spec/support/tasks/fail.cap +7 -0
- data/spec/support/tasks/failed.cap +5 -0
- data/spec/support/test_app.rb +33 -3
- metadata +29 -52
- data/spec/lib/capistrano/dsl/env_spec.rb +0 -10
@@ -7,11 +7,10 @@ describe Capistrano::Application do
|
|
7
7
|
it "provides a --format option which enables the choice of output formatting"
|
8
8
|
|
9
9
|
it "identifies itself as cap and not rake" do
|
10
|
-
pending "Waiting for: https://github.com/jimweirich/rake/pull/204"
|
11
10
|
out, _ = capture_io do
|
12
11
|
flags '--help', '-h'
|
13
12
|
end
|
14
|
-
out.should match(
|
13
|
+
out.lines.first.should match(/cap \[-f rakefile\]/)
|
15
14
|
end
|
16
15
|
|
17
16
|
it "overrides the rake method, but still prints the rake version" do
|
@@ -37,9 +36,7 @@ describe Capistrano::Application do
|
|
37
36
|
def subject.exit(*args)
|
38
37
|
throw(:system_exit, :exit)
|
39
38
|
end
|
40
|
-
subject.
|
41
|
-
handle_options
|
42
|
-
end
|
39
|
+
subject.run
|
43
40
|
subject.options
|
44
41
|
end
|
45
42
|
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
module Capistrano
|
4
4
|
class Configuration
|
5
5
|
describe Server do
|
6
|
-
let(:server) { Server.new('hostname') }
|
6
|
+
let(:server) { Server.new('hostname:1234') }
|
7
7
|
|
8
8
|
describe 'adding a role' do
|
9
9
|
subject { server.add_role(:test) }
|
@@ -33,18 +33,23 @@ module Capistrano
|
|
33
33
|
end
|
34
34
|
|
35
35
|
describe 'comparing identity' do
|
36
|
-
subject { server.matches? hostname }
|
36
|
+
subject { server.matches? Server[hostname] }
|
37
37
|
|
38
38
|
context 'with the same hostname' do
|
39
|
-
let(:hostname) { 'hostname' }
|
39
|
+
let(:hostname) { 'hostname:1234' }
|
40
40
|
it { should be_true }
|
41
41
|
end
|
42
42
|
|
43
43
|
context 'with the same hostname and a user' do
|
44
|
-
let(:hostname) { 'user@hostname' }
|
44
|
+
let(:hostname) { 'user@hostname:1234' }
|
45
45
|
it { should be_true }
|
46
46
|
end
|
47
47
|
|
48
|
+
context 'with the same hostname but different port' do
|
49
|
+
let(:hostname) { 'hostname:5678' }
|
50
|
+
it { should be_false }
|
51
|
+
end
|
52
|
+
|
48
53
|
context 'with a different hostname' do
|
49
54
|
let(:hostname) { 'otherserver' }
|
50
55
|
it { should be_false }
|
@@ -159,6 +164,11 @@ module Capistrano
|
|
159
164
|
let(:options) { { select: :active }}
|
160
165
|
it { should be_true }
|
161
166
|
end
|
167
|
+
|
168
|
+
context 'with :exclude' do
|
169
|
+
let(:options) { { exclude: :active }}
|
170
|
+
it { should be_false }
|
171
|
+
end
|
162
172
|
end
|
163
173
|
|
164
174
|
context 'value does not match server properly' do
|
@@ -171,6 +181,11 @@ module Capistrano
|
|
171
181
|
let(:options) { { select: :inactive }}
|
172
182
|
it { should be_false }
|
173
183
|
end
|
184
|
+
|
185
|
+
context 'with :exclude' do
|
186
|
+
let(:options) { { exclude: :inactive }}
|
187
|
+
it { should be_true }
|
188
|
+
end
|
174
189
|
end
|
175
190
|
end
|
176
191
|
|
@@ -186,6 +201,12 @@ module Capistrano
|
|
186
201
|
let(:options) { { select: ->(s) { s.properties.active } } }
|
187
202
|
it { should be_true }
|
188
203
|
end
|
204
|
+
|
205
|
+
context 'with :exclude' do
|
206
|
+
let(:options) { { exclude: ->(s) { s.properties.active } } }
|
207
|
+
it { should be_false }
|
208
|
+
end
|
209
|
+
|
189
210
|
end
|
190
211
|
|
191
212
|
context 'value does not match server properly' do
|
@@ -198,6 +219,12 @@ module Capistrano
|
|
198
219
|
let(:options) { { select: ->(s) { s.properties.inactive } } }
|
199
220
|
it { should be_false }
|
200
221
|
end
|
222
|
+
|
223
|
+
context 'with :exclude' do
|
224
|
+
let(:options) { { exclude: ->(s) { s.properties.inactive } } }
|
225
|
+
it { should be_true }
|
226
|
+
end
|
227
|
+
|
201
228
|
end
|
202
229
|
end
|
203
230
|
|
@@ -244,6 +271,15 @@ module Capistrano
|
|
244
271
|
|
245
272
|
end
|
246
273
|
|
274
|
+
describe ".[]" do
|
275
|
+
it 'creates a server if its argument is not already a server' do
|
276
|
+
expect(Server['hostname:1234']).to be_a Server
|
277
|
+
end
|
278
|
+
|
279
|
+
it 'returns its argument if it is already a server' do
|
280
|
+
expect(Server[server]).to be server
|
281
|
+
end
|
282
|
+
end
|
247
283
|
end
|
248
284
|
end
|
249
285
|
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module Capistrano
|
4
|
+
class Configuration
|
5
|
+
class Servers
|
6
|
+
|
7
|
+
describe HostFilter do
|
8
|
+
let(:host_filter) { HostFilter.new(available) }
|
9
|
+
let(:available) { [ Server.new('server1'), Server.new('server2'), Server.new('server3') ] }
|
10
|
+
|
11
|
+
describe '#new' do
|
12
|
+
it 'takes one array of hostnames' do
|
13
|
+
expect(host_filter)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '.for' do
|
18
|
+
|
19
|
+
subject { HostFilter.for(available) }
|
20
|
+
|
21
|
+
context 'without env vars' do
|
22
|
+
it 'returns all available hosts' do
|
23
|
+
expect(subject).to eq available
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'with ENV vars' do
|
28
|
+
before do
|
29
|
+
ENV.stubs(:[]).with('HOSTS').returns('server1,server2')
|
30
|
+
end
|
31
|
+
|
32
|
+
it 'returns all required hosts defined in HOSTS' do
|
33
|
+
expect(subject).to eq [Server.new('server1'), Server.new('server2')]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
context 'with configuration filters' do
|
38
|
+
before do
|
39
|
+
Configuration.env.set(:filter, hosts: %w{server1 server2})
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'returns all required hosts defined in the filter' do
|
43
|
+
expect(subject).to eq [Server.new('server1'), Server.new('server2')]
|
44
|
+
end
|
45
|
+
|
46
|
+
after do
|
47
|
+
Configuration.env.delete(:filter)
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'with a single configuration filter' do
|
52
|
+
before do
|
53
|
+
Configuration.env.set(:filter, hosts: 'server3')
|
54
|
+
end
|
55
|
+
|
56
|
+
it 'returns all required hosts defined in the filter' do
|
57
|
+
expect(subject).to eq [Server.new('server3')]
|
58
|
+
end
|
59
|
+
|
60
|
+
after do
|
61
|
+
Configuration.env.delete(:filter)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
context 'with configuration filters and ENV vars' do
|
66
|
+
before do
|
67
|
+
Configuration.env.set(:filter, hosts: 'server1')
|
68
|
+
ENV.stubs(:[]).with('HOSTS').returns('server3')
|
69
|
+
end
|
70
|
+
|
71
|
+
it 'returns all required hosts defined in the filter' do
|
72
|
+
expect(subject).to eq [Server.new('server1'), Server.new('server3')]
|
73
|
+
end
|
74
|
+
|
75
|
+
after do
|
76
|
+
Configuration.env.delete(:filter)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -106,6 +106,11 @@ module Capistrano
|
|
106
106
|
expect(servers.roles_for([:all]).first.properties.test).to eq :value
|
107
107
|
end
|
108
108
|
|
109
|
+
it 'can accept multiple servers with the same hostname but different ports' do
|
110
|
+
servers.add_host('2', roles: [:app, 'web'], test: :value, port: 12)
|
111
|
+
servers.add_host('2', roles: [:app, 'web'], test: :value, port: 34)
|
112
|
+
expect(servers.count { |server| server.hostname == '2' }).to eq 2
|
113
|
+
end
|
109
114
|
end
|
110
115
|
|
111
116
|
describe 'selecting roles' do
|
@@ -141,10 +146,40 @@ module Capistrano
|
|
141
146
|
|
142
147
|
end
|
143
148
|
|
149
|
+
describe 'excluding by property' do
|
150
|
+
|
151
|
+
before do
|
152
|
+
servers.add_host('1', roles: :app, active: true)
|
153
|
+
servers.add_host('2', roles: :app, active: true, no_release: true)
|
154
|
+
end
|
155
|
+
|
156
|
+
it 'is empty if the filter would remove all matching hosts' do
|
157
|
+
hosts = servers.roles_for([:app, exclude: :active])
|
158
|
+
expect(hosts.map(&:hostname)).to be_empty
|
159
|
+
end
|
160
|
+
|
161
|
+
it 'returns the servers without the attributes specified' do
|
162
|
+
hosts = servers.roles_for([:app, exclude: :no_release])
|
163
|
+
expect(hosts.map(&:hostname)).to eq %w{1}
|
164
|
+
end
|
165
|
+
|
166
|
+
it 'can exclude hosts by properties on the host using a regular proc' do
|
167
|
+
hosts = servers.roles_for([:app, exclude: ->(h) { h.properties.no_release }])
|
168
|
+
expect(hosts.map(&:hostname)).to eq %w{1}
|
169
|
+
end
|
170
|
+
|
171
|
+
it 'is empty if the regular proc filter would remove all matching hosts' do
|
172
|
+
hosts = servers.roles_for([:app, exclude: ->(h) { h.properties.active }])
|
173
|
+
expect(hosts.map(&:hostname)).to be_empty
|
174
|
+
end
|
175
|
+
|
176
|
+
end
|
177
|
+
|
144
178
|
describe 'filtering roles' do
|
145
179
|
|
146
180
|
before do
|
147
181
|
ENV.stubs(:[]).with('ROLES').returns('web,db')
|
182
|
+
ENV.stubs(:[]).with('HOSTS').returns(nil)
|
148
183
|
servers.add_host('1', roles: :app, active: true)
|
149
184
|
servers.add_host('2', roles: :app)
|
150
185
|
servers.add_host('3', roles: :web)
|
@@ -12,6 +12,14 @@ module Capistrano
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
+
describe '.reset!' do
|
16
|
+
it 'blows away the existing `env` and creates a new one' do
|
17
|
+
old_env = Configuration.env
|
18
|
+
Configuration.reset!
|
19
|
+
expect(Configuration.env).not_to be old_env
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
15
23
|
describe 'roles' do
|
16
24
|
context 'adding a role' do
|
17
25
|
subject { config.role(:app, %w{server1 server2}) }
|
@@ -20,17 +20,6 @@ module Capistrano
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
describe '#stages' do
|
24
|
-
before do
|
25
|
-
Dir.expects(:[]).with('config/deploy/*.rb').
|
26
|
-
returns(['config/deploy/staging.rb', 'config/deploy/production.rb'])
|
27
|
-
end
|
28
|
-
|
29
|
-
it 'returns a list of defined stages' do
|
30
|
-
expect(dsl.stages).to eq %w{staging production}
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
23
|
describe '#stage_set?' do
|
35
24
|
subject { dsl.stage_set? }
|
36
25
|
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'capistrano/git'
|
4
|
+
|
5
|
+
module Capistrano
|
6
|
+
describe Git do
|
7
|
+
let(:context) { Class.new.new }
|
8
|
+
subject { Capistrano::Git.new(context, Capistrano::Git::DefaultStrategy) }
|
9
|
+
|
10
|
+
describe "#git" do
|
11
|
+
it "should call execute git in the context, with arguments" do
|
12
|
+
context.expects(:execute).with(:git, :init)
|
13
|
+
subject.git(:init)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe Git::DefaultStrategy do
|
19
|
+
let(:context) { Class.new.new }
|
20
|
+
subject { Capistrano::Git.new(context, Capistrano::Git::DefaultStrategy) }
|
21
|
+
|
22
|
+
describe "#test" do
|
23
|
+
it "should call test for repo HEAD" do
|
24
|
+
context.expects(:repo_path).returns("/path/to/repo")
|
25
|
+
context.expects(:test).with " [ -f /path/to/repo/HEAD ] "
|
26
|
+
|
27
|
+
subject.test
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#check" do
|
32
|
+
it "should test the repo url" do
|
33
|
+
context.expects(:repo_url).returns(:url)
|
34
|
+
context.expects(:test).with(:git, :'ls-remote', :url).returns(true)
|
35
|
+
|
36
|
+
subject.check
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#clone" do
|
41
|
+
it "should run git clone" do
|
42
|
+
context.expects(:repo_url).returns(:url)
|
43
|
+
context.expects(:repo_path).returns(:path)
|
44
|
+
|
45
|
+
context.expects(:execute).with(:git, :clone, '--mirror', :url, :path)
|
46
|
+
|
47
|
+
subject.clone
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "#update" do
|
52
|
+
it "should run git update" do
|
53
|
+
context.expects(:execute).with(:git, :remote, :update)
|
54
|
+
|
55
|
+
subject.update
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#release" do
|
60
|
+
it "should run git archive" do
|
61
|
+
context.expects(:fetch).returns(:branch)
|
62
|
+
context.expects(:release_path).returns(:path)
|
63
|
+
|
64
|
+
context.expects(:execute).with(:git, :archive, :branch, '| tar -x -C', :path)
|
65
|
+
|
66
|
+
subject.release
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'capistrano/hg'
|
4
|
+
|
5
|
+
module Capistrano
|
6
|
+
describe Hg do
|
7
|
+
let(:context) { Class.new.new }
|
8
|
+
subject { Capistrano::Hg.new(context, Capistrano::Hg::DefaultStrategy) }
|
9
|
+
|
10
|
+
describe "#hg" do
|
11
|
+
it "should call execute hg in the context, with arguments" do
|
12
|
+
context.expects(:execute).with(:hg, :init)
|
13
|
+
subject.hg(:init)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe Hg::DefaultStrategy do
|
19
|
+
let(:context) { Class.new.new }
|
20
|
+
subject { Capistrano::Hg.new(context, Capistrano::Hg::DefaultStrategy) }
|
21
|
+
|
22
|
+
describe "#test" do
|
23
|
+
it "should call test for repo HEAD" do
|
24
|
+
context.expects(:repo_path).returns("/path/to/repo")
|
25
|
+
context.expects(:test).with " [ -d /path/to/repo/.hg ] "
|
26
|
+
|
27
|
+
subject.test
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "#check" do
|
32
|
+
it "should test the repo url" do
|
33
|
+
context.expects(:repo_url).returns(:url)
|
34
|
+
context.expects(:execute).with(:hg, "id", :url)
|
35
|
+
|
36
|
+
subject.check
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#clone" do
|
41
|
+
it "should run hg clone" do
|
42
|
+
context.expects(:repo_url).returns(:url)
|
43
|
+
context.expects(:repo_path).returns(:path)
|
44
|
+
|
45
|
+
context.expects(:execute).with(:hg, "clone", '--noupdate', :url, :path)
|
46
|
+
|
47
|
+
subject.clone
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "#update" do
|
52
|
+
it "should run hg update" do
|
53
|
+
context.expects(:execute).with(:hg, "pull")
|
54
|
+
|
55
|
+
subject.update
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
describe "#release" do
|
60
|
+
it "should run hg archive" do
|
61
|
+
context.expects(:fetch).returns(:branch)
|
62
|
+
context.expects(:release_path).returns(:path)
|
63
|
+
|
64
|
+
context.expects(:execute).with(:hg, "archive", :path, "--rev", :branch)
|
65
|
+
|
66
|
+
subject.release
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -0,0 +1,104 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
require 'capistrano/scm'
|
4
|
+
|
5
|
+
module RaiseNotImplementedMacro
|
6
|
+
def raise_not_implemented_on(method)
|
7
|
+
it "should raise NotImplemented on #{method}" do
|
8
|
+
expect {
|
9
|
+
subject.send(method)
|
10
|
+
}.to raise_error(NotImplementedError)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
RSpec.configure do
|
16
|
+
include RaiseNotImplementedMacro
|
17
|
+
end
|
18
|
+
|
19
|
+
module DummyStrategy
|
20
|
+
def test
|
21
|
+
test!("you dummy!")
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module BlindStrategy; end
|
26
|
+
|
27
|
+
module Capistrano
|
28
|
+
describe SCM do
|
29
|
+
let(:context) { Class.new.new }
|
30
|
+
|
31
|
+
describe "#initialize" do
|
32
|
+
subject { Capistrano::SCM.new(context, DummyStrategy) }
|
33
|
+
|
34
|
+
it "should load the provided strategy" do
|
35
|
+
context.expects(:test).with("you dummy!")
|
36
|
+
subject.test
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "Convenience methods" do
|
41
|
+
subject { Capistrano::SCM.new(context, BlindStrategy) }
|
42
|
+
|
43
|
+
describe "#test!" do
|
44
|
+
it "should return call test on the context" do
|
45
|
+
context.expects(:test).with(:x)
|
46
|
+
subject.test!(:x)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "#repo_url" do
|
51
|
+
it "should return the repo url according to the context" do
|
52
|
+
context.expects(:repo_url).returns(:url)
|
53
|
+
subject.repo_url.should == :url
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
describe "#repo_path" do
|
58
|
+
it "should return the repo path according to the context" do
|
59
|
+
context.expects(:repo_path).returns(:path)
|
60
|
+
subject.repo_path.should == :path
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "#release_path" do
|
65
|
+
it "should return the release path according to the context" do
|
66
|
+
context.expects(:release_path).returns('/path/to/nowhere')
|
67
|
+
subject.release_path.should == '/path/to/nowhere'
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "#fetch" do
|
72
|
+
it "should call fetch on the context" do
|
73
|
+
context.expects(:fetch)
|
74
|
+
subject.fetch(:branch)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe "With a 'blind' strategy" do
|
80
|
+
subject { Capistrano::SCM.new(context, BlindStrategy) }
|
81
|
+
|
82
|
+
describe "#test" do
|
83
|
+
raise_not_implemented_on(:test)
|
84
|
+
end
|
85
|
+
|
86
|
+
describe "#check" do
|
87
|
+
raise_not_implemented_on(:check)
|
88
|
+
end
|
89
|
+
|
90
|
+
describe "#clone" do
|
91
|
+
raise_not_implemented_on(:clone)
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "#update" do
|
95
|
+
raise_not_implemented_on(:update)
|
96
|
+
end
|
97
|
+
|
98
|
+
describe "#release" do
|
99
|
+
raise_not_implemented_on(:release)
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|